타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다. 예를 들어 byte 타입을 int 타입으로 변환하거나 반대로 int 타입을 byte 타입으로 변환하는 행위를 말한다. 타입 변환에는
자동(묵시적)타입 변환
과강제(명시적)타입 변환
이 있다.
자동 타입 변환은 프로그램 실행 도중에 자동으로 타입 변환이 일어나는 것을 말한다. 자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.
큰 크기 타입과 작은 크기 타입의 구분은 사용하는 메모리 크기이다.
타입을 크기별로 정리
byte(1)<short(2)<int(4)<long(8)<float(4)<double(8)
float은 4byte 크기인데 int(4byte)와 long(8byte)보다 더 큰 타입으로 표시됐는데 표현할 수 있는 값의 범위가 float이 더 크기 때문이다.
byte byteValue=10;
int intValue=byteValue; //자동 타입 변환이 일어난다
자동 타입 변환이 발생되면 변환 이전의 값과 변환 이후의 값은 동일하다. 즉, 변환 이전의 값은 변환 이후에도 손실없이 그대로 보존된다. 정수 타입이 실수 타입으로 변환하는 것은 무조건 자동 타입 변환이 된다. 실수 타입으로 변환된 이후의 값은 정수값이 아닌 .0이 붙은 실수값이 된다.
int intValue=10;
double doubleValue=intValue; //10.0;
char 타입의 경우 int 타입으로 자동 변환되면 유니코드 값이 int 타입에 저장된다.
char charValue='A';
int intValue=charValue; //65가 저장됨
자동 타입 변환에서 단 하나의 예외가 있는데, char는 2byte의 크기를 가지지만, char에는 음수가 저장될 수 없다. 따라서 음수가 저장될 수 있는 byte 타입을 char 타입으로 자동 변환할 수 없다.
큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다. 예를 들어, 4byte인 int 타입을 1byte인 byte 타입에 담을 수 없다. 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개서 저장하는 것을 강제 타입 변환(캐스팅:Casting)
이라고 한다. 강제 타입 변환은 캐스팅 연산자 ()
를 사용하는데, 괄호 안에 들어가는 타입은 쪼개는 단위이다.
int intValue=111111111;
byte byteValue=(byte)intValue; //강제 타입 변환
실수 타입은 정수 타입으로 자동 변환되지 않기 때문에 강제 타입 변환을 사용해야 한다. 이 경우 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.
double doubleValue=3.14;
int intValue=(int)doubleValue; //intValue는 정수 부분인 3만 저장된다.
연산은 기본적으로 같은 타입의 피연산자 간에만 수행되기 때문에 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.
int intValue=10;
double doubleValue=5.5;
double result=intValue+doubleValue; //result에 15.5가 저장
만약 int 타입으로 연산해야 한다면 double 타입을 int 타입으로 강제 변환하고 덧셈 연산을 수행해야 한다.
int intValue=10;
double doubleValue=5.5;
int result=intValue+(int)doubleValue; //result에 15가 저장