변수와 연산자에 대한 이야기를 하면서 캐스팅(형변환)이나 연산에서의 강제 형변환에 대한 이야기들이 몇 번 등장했었습니다. 그래서 다음 문법으로 넘어가기 전에 이러한 캐스팅들에 대해서 다시 한 번 간단하게 짚고 넘어가보려고 합니다.
자동 형변환(암시적 형변환)
은 작은 데이터 타입을 큰 데이터 타입으로 자동으로 타입을 변환하는 동작입니다. 작은 데이터에서 큰 데이터로 캐스팅이 이루어지는 동안에는 데이터 손실에 대한 위험이 없기 때문에 자동으로 수행되게 만들어졌습니다.
float x = 1.0f;
double y = 2.0;
double result = x + y;
/*
* float + double은 float형이 double로 자동 형변환 된 후에 연산됩니다.
* 따라서 double형인 result에 x + y의 결과가 오류 없이 담기게 됩니다.
*/
다시 한 번 언급하지만 자바의 부동소수점표기 때문에 같은 byte크기여도 실수형이 정수형보다 더 큰 크기를 갖습니다.
int < long < float < double
public class Casting {
public static void main(String[] args) {
int x = 1;
double y = x; //double 형이 int 보다 크므로, 자동으로 double형으로 캐스팅 되어 저장됩니다.
System.out.println(y);
}
}
강제 형변환(명시적 형변환)
은 자동 형변환이 수행될 수 없는 경우에 프로그래머가 직접 타입을 명시해서 수행하는 형변환입니다. 안정적인 자동 형변환과 다르게 상황에 따라 데이터 소실이 발생될 수 있으므로 주의해서 사용해야합니다.
강제 형변환은 이전에 다뤘던 대로 캐스팅 연산자(type)
를 사용합니다.
조금 전에 int형에서 double로 형변환은 double이 크기가 크기 때문에 자동적으로 형변환이 수행되었습니다. 하지만 그 반대로는 큰 타입에서 작은 타입으로 이동하기 때문에 강제 형변환을 수행해주어야 합니다.
double x = 1.0;
int y = (int) x;
System.out.println(y);
위 예시처럼 실수형 -> 정수형은 소수점 이하 자리를 버림 하므로 데이터 손실에 유의해야 합니다.