Java type casting에 대해

PGD·2024년 1월 11일
0

Java 형 변환에 대해 깊게 생각해 본 적이 없다. 그저 기계적으로 int만 사용했고 가끔 큰 수를 다뤄야 하면 long을 사용하고, 실수를 다뤄야 할 땐 오로지 double만 사용했다. 웹 개발에서는 임베디드나 게임 프로그래밍에 비해 비교적 (물론 신경쓰긴 해야 하지만) 최적화에 덜 민감하기 때문에 input stream으로 읽어들인 이미지와 같은 큰 바이너리 데이터가 아닌 이상 거의 int만 사용했다. 그래서 원시 타입(primitive type)의 형 변환에 대해 크게 고민해 본 적이 없었다.
그래서 형 변환에 대해선 거의 대강 암기하기만 했다. 그러다 보니 틀리게 알고 있던 지식도 있었다. 알고 보니 Java 형 변환은 몇 가지 원칙만 알고 있으면 크게 외울 필요가 없었다.

형 변환은 다음과 같은 원칙을 따른다.

  1. 크기가 작은 타입의 데이터를 크기가 큰 타입의 변수에 할당할 수 있다.
  2. 크기가 큰 타입의 데이터를 크기가 작은 타입의 변수에 할당하려 할 경우 compile error가 발생한다. Compile error를 피하려면 크기가 큰 타입에 대해 explicit type casting을 수행해야 한다. 이때 overflow가 발생할 수 있다.
  3. 정수 constant는 int형이 default다.
  4. 실수 constant는 double형이 default다.
  5. 서로 다른 타입의 두 데이터 사이에 연산을 수행할 경우, 크기가 작은 타입은 크기가 큰 타입으로 implicit type casting이 발생한다.
  6. 정수와 정수 사이의 연산 결과는 정수다. 즉, 10 / 33이다.

예시

예제 1
byte a = 128;

이 경우 int형 데이터를 byte형 변수에 할당하려 했기 때문에 compile error가 발생한다.

예제 2
byte a = (byte)128;

Explicit type casting을 수행했기 때문에 128byte형이 된다. 이때 signed 오버플로우가 발생해 128은 -128이 된다.

예제 3
System.out.println(10 / 3);

두 정수 사이에 발생한 연산이므로 10 / 3int형 데이터 3을 반환한다. 즉, 출력 결과는 3이다.

예제 4
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;
예제 5
double d = (double)(10 / 3);

괄호 안 연산이 가장 먼저 수행된다. 10 / 3이 먼저 수행되고, double형으로 형 변환이 이루어진다. 즉, d에는 3.0이 저장된다.

profile
student

0개의 댓글