Java 형 변환에 대해 깊게 생각해 본 적이 없다. 그저 기계적으로 int
만 사용했고 가끔 큰 수를 다뤄야 하면 long
을 사용하고, 실수를 다뤄야 할 땐 오로지 double만 사용했다. 웹 개발에서는 임베디드나 게임 프로그래밍에 비해 비교적 (물론 신경쓰긴 해야 하지만) 최적화에 덜 민감하기 때문에 input stream으로 읽어들인 이미지와 같은 큰 바이너리 데이터가 아닌 이상 거의 int
만 사용했다. 그래서 원시 타입(primitive type)의 형 변환에 대해 크게 고민해 본 적이 없었다.
그래서 형 변환에 대해선 거의 대강 암기하기만 했다. 그러다 보니 틀리게 알고 있던 지식도 있었다. 알고 보니 Java 형 변환은 몇 가지 원칙만 알고 있으면 크게 외울 필요가 없었다.
int
형이 default다.double
형이 default다.10 / 3
은 3
이다.byte a = 128;
이 경우 int
형 데이터를 byte
형 변수에 할당하려 했기 때문에 compile error가 발생한다.
byte a = (byte)128;
Explicit type casting을 수행했기 때문에 128
은 byte
형이 된다. 이때 signed 오버플로우가 발생해 128은 -128이 된다.
System.out.println(10 / 3);
두 정수 사이에 발생한 연산이므로 10 / 3
은 int
형 데이터 3
을 반환한다. 즉, 출력 결과는 3
이다.
double d = (double)10 / 3;
10 / 3
의 결과는 3
이다. 그러나 형 변환의 연산자 우선순위가 더 높기 때문에 10
이 double형으로 type casting 되고 double
형과 int
형 사이의 연산이 되기 때문에 3 또한 double
형으로 implicit type casting된다. 그래서 d
에는 3.3333333...이 저장된다.
다음 경우도 연산자 우선순위 때문에 마찬가지다.
double d = 10 / (double)3;
double d = (double)(10 / 3);
괄호 안 연산이 가장 먼저 수행된다. 10 / 3
이 먼저 수행되고, double형으로 형 변환이 이루어진다. 즉, d
에는 3.0이 저장된다.