Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 다운캐스팅 완벽 정리: 명시적 형 변환과 데이터 손실의 원리

자바 다운캐스팅이란?

자바에서 다운캐스팅(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() 같은 안전 변환 메서드를 활용하는 것이 좋습니다.

결론적으로 자바에서 변수를 더 작은 범위의 자료형으로 다운캐스팅하는 것은 가능하지만, 값이 범위를 초과하면 예측하기 어려운 결과가 나올 수 있으므로 항상 신중하게 사용해야 합니다.