프로그램의 연산을 위해 타입을 일치시킬때 사용하며, boolean 타입이 아닌 기본형끼리는 서로 형변환이 가능하다.
(타입)피연산자; 의 형식으로 변환한다.
doubld d = 2.34;
int i = (int)d; // i에는 2가 저장되며 d의 값은 2.34로 변함이 없다.
위와 같은 형식으로 변환하는 것을 강제(명시적) 형변환이라고 한다.
그런데 경우에 따라 편의상의 이유로 형변환을 생략할 수 있다. 이 때는 컴파일러가 생략된 형변환을 자동적으로 추가하고 이를 자동 형변환이라고 한다. 앞서 문자열의 연산에서 봤던 숫자 + "" 도 자동 형변환의 한 종류이다.
float f = 1234; // 1234가 float 타입으로 저장됨.
위의 코드에서 1234는 int 타입의 정수지만 float 타입의 f에 저장하고 있다. 이 때 float 타입은 int 타입의 1234를 저장하는데 아무 문제가 없으므로 에러가 발생하지 않는다. 따라서 위의 코드는
float f = (float)1234;와 같은 의미이다.
int i = 5;
double d = 2.5;
double x = d + i; // 결과 7.5
위의 코드에서 2.5 + i를 연산할때 타입을 일치시킨 후 연산해야 하므로, i가 double 타입으로 자동 형변환이 된다. 따라서 결과값인 7.5도 double 타입이 되어 double 타입인 변수 d에 저장되는 것이다.
이렇게 연산을 할 때 형변환은 데이터의 손실을 최소화 하는 기준으로 이루어진다.
위의 코드에서 만약 i + d를 연산할 때 d가 int 타입으로 변환된다고 생각해보자. 그렇게 되면 d는 정수가 되기 위해 0.5를 버릴 것이고 계산 결과는 int 타입인 7이 될 것이다. 이런 방법보다는 i를 double 타입으로 변환해 7.5의 결과를 도출하는 것이 더 정확하고 데이터의 손실이 최소화 될 것이다. 즉, 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환 되는 것이다.
기본형의 자동 형변환이 가능한 방향은 다음과 같다.
byte -> short, char -> int -> long -> float -> double