PROGRAMMING/JAVA

"Cannot cast from Object to long" 오류 이해 및 해결 방법

OJR 2025. 4. 12. 03:30

 

 

1. 오류 메시지의 배경

오류 메시지 “Cannot cast from Object to long”은
객체(Object) 타입을 자바의 원시형 long으로 직접 캐스팅(casting)하려 할 때 발생

예를 들어, 다음과 같은 코드가 있을 때:

 
Long obj = 123L;
long num = (long) obj;  // 오류 발생!

 

위 코드는 컴파일 타임에 오류가 발생
왜냐하면, 변수 obj는 실제로 Long 타입의 객체인데,
이를 바로 원시형 long으로 캐스팅하려고 하기 때문

 

2. 문제의 원인: Primitive vs Wrapper

Java에서는 원시형(primitive) 데이터 타입과 객체(참조형) 데이터 타입을 구분

  • Primitive 타입 (예: long, int, float 등):
    메모리 상의 값 자체를 저장합니다.
  • Wrapper 클래스 (예: Long, Integer, Float 등):
    원시형 데이터를 객체로 감싸서 다룹니다. 예를 들어, Long 클래스는 long 값을 객체로 표현할 수 있게 해줍니다.

Java에서는 이러한 두 타입 간의 자동 변환(autoboxing & unboxing)이 도입되어 있어
대부분의 경우 직접 변환 없이도 사용할 수 있습니다.
하지만, Autoboxing이 적용되는 상황과 그렇지 않은 경우가 있습니다.

Autoboxing과 Unboxing

  • Autoboxing: 원시형을 자동으로 해당 래퍼 클래스로 변환하는 과정
Long obj = 123L;  // long 123L이 자동으로 Long 객체로 변환됨.
  • Unboxing: 래퍼 클래스 객체를 자동으로 원시형으로 변환하는 과정
Long obj = 123L;
long num = obj;   // 자동으로 obj.longValue() 호출됨.

 

자동 unboxing은 변수 선언 시 타입이 명확할 때만 작동합니다.
그런데 변수의 타입이 Object인 경우, 컴파일러는 해당 객체가 반드시 래퍼 클래스임을 보장할 수 없으므로
자동 unboxing을 적용하지 않습니다.

3. 오류가 발생하는 경우

예를 들어, 다음과 같이 Object 타입의 변수에 값을 담은 경우를 고려해 봅니다.

Object obj = 123L; 
long num = (long) obj;   // 컴파일 오류 발생!

여기서 변수 obj는 Object 타입입니다. 실제로는 Long 객체가 할당되어 있지만,
컴파일 타임에 컴파일러는 이를 단순히 Object 타입으로 취급합니다.
따라서 (long) obj는 Object 타입을 원시형 long으로의 직접적인 캐스트를 시도하게 되고,
이는 허용되지 않습니다.

4. 올바른 해결 방법

이 오류를 해결하는 일반적인 두 가지 방법은 다음과 같습니다.

방법 1: 명시적 캐스팅 후 unboxing 수행

먼저 obj를 Long으로 캐스팅한 후, 해당 객체의 longValue() 메서드를 호출하여 원시형 long으로 변환합니다.

Object obj = 123L;
long num = ((Long) obj).longValue();

이렇게 하면 먼저 obj가 Long 타입임을 컴파일러에게 명시하고, longValue()를 호출함으로써 unboxing이 안전하게 수행됩니다.

방법 2: 변수의 타입을 명확히 하기

가능하다면 변수의 타입을 Object 대신 Long으로 선언해서 자동 unboxing이 작동하게 하는 방법도 있습니다.

Long obj = 123L;
long num = obj;  // 자동 unboxing이 적용됨

5. 왜 자동 unboxing이 실패할 때가 있는가?

자동 unboxing은 다음과 같은 경우에 실패할 수 있습니다.

  • 변수 타입이 Object인 경우:
    컴파일러는 Object 타입에서 원시형으로의 변환이 안전한지 확신할 수 없으므로, 자동 unboxing을 적용하지 않습니다.
  • null 값인 경우:
    만약 래퍼 객체가 null이면 자동 unboxing 시 NullPointerException이 발생할 수 있기 때문에 주의해야 합니다.

따라서, 변수의 타입이 불명확하거나 Object로 선언된 경우에는 명시적 캐스팅과 unboxing 메서드 호출을 사용하여 안전하게 변환해야 합니다.

6. 결론

Java에서 “Cannot cast from Object to long” 오류는 객체를 원시형으로 직접 캐스팅할 수 없다는 점에서 기인합니다.

  • 문제의 원인:
    Object 타입의 변수에 저장된 래퍼 객체를 원시형 long으로 직접 캐스트하려는 시도
  • 해결 방법:
    1. 변수 타입을 명확히 하여 자동 unboxing을 활용하거나,
    2. 먼저 명시적 캐스팅을 통해 Long으로 변환한 후, longValue() 메서드를 호출하여 unboxing을 수행

Java의 autoboxing과 unboxing 메커니즘을 정확히 이해하는 것은 이러한 오류를 예방하는 데 큰 도움이 됩니다.
상황에 따라 적절한 방법을 선택하여 안정적인 코드 작성을 진행하시기 바랍니다.