타입 변환 : 데이터 타입을 다른 데이터 타입으로 바꾸는 것.



- 자동 타입 변환(Promotion)


 : 프로그램 실행 중에 자동으로 타입 변환이 일어나는 것을 의미한다.



큰 크기의 타입 ← 작은 크기의 타입


* 여기서 크기는 사용하는 메모리 크기(바이트 수)를 말한다.


즉, byte ▶ short  int  long  float  double 순서 또는 char  int 순서로 자동 타입 변환이 일어난다.


참고로 long(8 byte)이 float(4 byte)보다 크지만 표현할 수 있는 숫자의 범위가 float이 더 크기때문에 float이 더 큰 타입으로 표시된 것이다. 또한, 정수 타입이 실수 타입으로 변환될 경우 자연수 뒤에 소수점과 소수점이하가 표시된다.


int i = 200;

double d = i; // 이때 d는 200.0이 된다. 



자동 타입 변환에서는 딱 한 가지 예외가 있는데, char는 2 바이트의 크기를 가지지만 char의 범위는 0~65535이므로 음수가 저장될 수없다. 즉, 음수가 저장될 수 있는 byte 타입은 char 타입으로 자동 변환시킬 수 없다.




Q) 데이터 손실 유무는 ?


A) 변환 이전의 값은 변환 이후에도 그대로 보존된다. 쉽게 말하자면 작은 양동이의 물을 큰 양동이로 옮긴다고 해도 물의 양은 변하지 않는 것과 같은 것이다.




- 강제 타입 변환(Casting)


 : 큰 데이터 타입을 작은 데이터 타입으로 쪼개어 강제로 저장하는 것을 의미한다.



큰 크기의 타입 → 작은 크기의 타입



즉, byte ◀ short  int  long ◀ float ◀ double 순서 또는 char ◀ int 순서로 강제 타입 변환이 일어난다.



# 사용 방법


작은 크기 타입 = (작은 크기 타입) 큰 크기 타입;


int i = 214748364;

byte b = (byte) i;


위의 경우 끝의 1 byte만 byte 타입 변수에 담게 된다. 즉, 변환되어질 데이터(작은 크기의 타입)보다 큰 것을 강제 타입 변환을 할 때 기존의 값은 보존되지 않는다.



# 주의 사항


int -> float으로 강제 타입 변환을 할 때,


float : 부호(1비트) + 지수(8비트) + 가수(32비트)


로 구성되어 있기 때문에 int 값이 123456780 처럼 가수 23비트로 표현불가능한 숫자일 경우 근사값으로 변환된다. 이 점은 정밀도 손실을 발생시키기 때문에 모든 int값을 안전하게 실수 타입으로 변환시키려면 double 타입을 사용하는 것이 현명하다. 


double : 부호(1비트) + 지수(11비트) + 가수(52비트)


그 이유는 int값은 4바이트 = 32비트 이므로 double의 가수 52비트보다 항상 작기 때문에 정밀도 손실없이 변환이 가능하다.



헷갈린다면 다른 타입으로 강제 타입 변환 시 변환될 타입(작은 크기의 타입)의 최대값과 최소값을 넘어가는지 확인하면 된다.

아래는 기본타입의 최대값과 최소값을 나타낸 표이다.



 기본 타입

최대값 상수 

최소값 상수 

byte 

Byte.MAX_VALUE 

Byte.MIN_VALUE 

short

Short.MAX_VALUE 

Short.MIN_VALUE 

int 

Integer.MAX_VALUE 

Integer.MIN_VALUE 

long 

Long.MAX_VALUE 

Long.MIN_VALUE  

float 

Float.MAX_VALUE 

Float.MIN_VALUE 

double 

Double.MAX_VALUE

 Double.MIN_VALUE 






변수(Variable)란 값을 저장할 수 있는 메모리의 공간을 의미한다.

상수(Constant)란 값을 한 번 저장하면 변경할 수 없는 변수이다.

리터럴(Literal)이란 값의 종류(type)에 따라 구분되며, 변하지 않는 값을 의미한다.


상수와 리터럴은 유사한 의미라 여길 수 있지만 엄연한 차이점이 존재한다.



int y;    -> 변수 선언 (int는 자료형이며, y는 변수 이름이다.)

int y = 5;   -> 변수 초기화 (선언과 동시에 초기화도 가능하다.)



static final int Y = 5;  -> 상수 선언 (상수는 대문자로 해주어야 한다.)

여기서 static final 이 상수란 뜻이고 Y 가 변하지 않는 값(리터럴)이 들어있는 메모리 공간을 의미한다.

즉, 리터럴은 메모리 공간에 들어있는 값(5)이다.


    * 변수의 종류

    변수는 크게 두 가지 종류인 기본형 변수참조형 변수로 나누어진다. 기본형은 byte, short, int, long, float, double, char, boolean으로 8가지의 자료형을 말하며, 그 외 나머지 자료형을 참조형이라고 한다. 참조형도 크게 클래스, 인터페이스, 배열 세 가지로 나눌 수 있다.



    * 변수의 성질

    1. 선언과 동시에 초기화도 가능하다.
    2. 초기화되지 않은 변수는 읽을 수 없으므로 에러가 발생한다.
    3. 선언된 블록 내에서만 사용 가능하다.
    4. 메소드(함수) 블록에 선언된 변수를 로컬 변수(local variable)라고 부르는데, 그 블록(영역)을 벗어나면 메모리에서 자동으로 없어진다.


    우선, 변수 이름이란 메모리 주소에 붙여진 이름이다.

    변수의 이름 앞에 붙는 자료형(Type)은 변수에 저장되는 값의 범위와 종류를 결정하는 요소이다.

    프로그램은 변수 이름을 통해 메모리 공간을 구별하고 접근한다. 메모리 공간, 메모리 주소, 메모리 위치 모두 같은 말이다.




    * 자료형 (기본 타입)


     값의 종류

    기본 타입 

    메모리 사용 크기 

     저장되는 값의 범위 

     정수

     byte

    1 byte 

    8 bit 

    -128 ~ 127

    char

    2 byte 

    16 bit 

     0 ~ 65,535

     short

    2 byte 

    16 bit 

    -32,768 ~32,767 

     int

    4 byte 

    32 bit 

    -2,147,483,648 ~ 2,147,483,647 

     long

    8 byte 

    64 bit 

     실수

     float

    4 byte 

     32 bit 

    (+/-)1.4E-45 ~ (+/-)3.4028235E38 

    double 

    8 byte 

    64 bit 

    (+/-)4.9E-324 ~ (+/-)1.7976931348623157E308

     논리

     boolean

    1 byte 

    8 bit 

    true, false 




    - long 타입


    정수를 표현하는데 있어서 int의 저장범위를 벗어날 경우 long을 사용한다. 여기서 초기화할 때 반드시 소문자 'l'이나 대문자 'L'을 꼭 붙여야 한다. 그렇지 않으면 에러가 발생한다.



    - float 타입


    float과 double의 차이점은 가수를 표현하는 데 있어서 float에 비해 double이 약 두배의 자릿수가 배정되어 있으므로 더 정밀한 값을 저장할 수 있다. 


    자바는 실수 리터럴의 기본 타입을 double로 생각한다. 즉, 실수 리터럴을 float 타입 변수에 그냥 저장할 수 없다는 뜻이다. 따라서 저장하기 위해 실수 리터럴 뒤에 소문자 'f'나 대문자 'F'를 붙여야 한다. 그렇지 않으면 에러가 발생한다.



    - char 타입 


    자바는 모든 문자를 유니코드(Unicode)로 처리한다.

    유니코드란 전 세계의 문자들을 코드값으로 매핑한 국제 표준 규약이다. 유니코드의 범위는 0~65,535 이고 2 byte의 크기를 가진 정수값이다. 유니코드의 자세한 정보를 원한다면 (http://www.unicode.org)를 들어가보면 된다.

    또한, 유니코드는 음수가 없기 때문에 char 타입의 변수에는 음수 값을 저장할 수 없다.


    char 변수에 작은 따옴표(')로 감싼 문자가 아니라 직접 유니코드 정수값을 저장할 수도 있다.

    이 때의 정수값은 10진수로 저장해도되고 16진수로 저장해도 되는데 16진수의 형태는 '\u+16진수값'이다.


    char x = 'A';

    char x = 65;

    char x = '\u0041';




    * 클래스 타입 (String)


    자바에서 변수에 문자열을 저장하고 싶다면 String 타입을 이용할 수 있다. String은 클래스 타입이므로 String 변수는 참조 변수이다. 즉, 문자열을 String 변수에 대입하면 문자열이 메모리 공간에 직접 저장되는 것이 아니라 String 객체가 생성되고, String 변수는 객체의 번지를 참조하게 된다. 간단하게 설명하자면 문자열을 저장하고 싶을 때는 String을 사용하면 된다.



    + Recent posts