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



- 자동 타입 변환(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 




+ Recent posts