자바 다운캐스팅이란?
자바에서 다운캐스팅(downcasting)은 표현 범위가 넓은 자료형을 더 좁은 자료형으로 변환하는 것을 의미합니다. 대표적인 예로 int(4바이트)를 byte(1바이트)로 변환하는 경우를 들 수 있습니다.
업캐스팅과 달리 다운캐스팅은 값이 잘려 나갈 위험이 있기 때문에 컴파일러가 자동으로 처리해 주지 않습니다. 따라서 반드시 개발자가 캐스트 연산자를 사용해 명시적으로 형 변환을 지시해야 합니다. 물론 변환 과정에서 데이터 손실이 발생할 수 있다는 점도 함께 기억해야 합니다.
다운캐스팅 예제 코드
아래 예제는 int 타입 변수를 byte 타입으로 다운캐스팅하는 코드입니다.
public class Tester {
public static void main(String[] args) {
int a = 300;
byte b = (byte)a;
System.out.println(b);
}
}실행 결과
이 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
44
왜 300이 아니라 44가 출력될까요?
int 타입의 300은 byte가 표현할 수 있는 범위(-128 ~ 127)를 초과합니다. 이런 경우 자바는 해당 값을 byte에 저장할 때 하위 8비트만 남기고 나머지 상위 비트는 모두 버립니다.
300을 2진수로 표현하면 100101100(9비트)이며, 여기서 하위 8비트인 00101100만 추출됩니다. 이 값을 십진수로 바꾸면 바로 44입니다. 즉, 상위 비트가 잘려나가면서 데이터 손실이 일어난 것입니다.
정리 및 주의사항
- 다운캐스팅은 반드시
(타입)형태의 명시적 캐스팅이 필요합니다. - 변환하려는 값이 작은 자료형의 표현 범위를 벗어나면 데이터 손실이 발생합니다.
- 값 손실 없이 안전하게 변환하려면 캐스팅 전에 범위를 검사하거나, 자바 8 이상에서 제공하는
Math.toIntExact()같은 안전 변환 메서드를 활용하는 것이 좋습니다.
결론적으로 자바에서 변수를 더 작은 범위의 자료형으로 다운캐스팅하는 것은 가능하지만, 값이 범위를 초과하면 예측하기 어려운 결과가 나올 수 있으므로 항상 신중하게 사용해야 합니다.