프로그래밍백엔드 개발자

Java에서 autoboxing과 unboxing 메커니즘이 어떻게 작동하는지, 그 위험이 무엇인지, 성능 또는 논리 오류로 이어질 수 있는 위치에 대해 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

Autoboxing은 기본 타입(int, double 등)을 해당 객체(Integer, Double 등)로 자동 변환하는 것입니다. Unboxing은 래퍼 객체를 다시 기본 타입으로 변환하는 것입니다.

할당, 메서드 인자 및 컬렉션에서 자동으로 작동합니다:

List<Integer> numbers = new ArrayList<>(); numbers.add(5); // Autoboxing 예: 5 (int) -> Integer(5) int value = numbers.get(0); // Unboxing: Integer(5) -> 5

위험:

  • unboxing 시 null로 인해 NullPointerException이 발생할 수 있습니다;
  • 래퍼 객체 생성으로 인한 메모리 및 시간 비효율적인 사용;
  • == (참조 비교)와 equals의 복잡성.

트릭 질문.

다음 코드가 예외를 발생시킬 수 있나요? 왜 그런가요?

Integer x = null; int y = x;

답변: 코드가 NullPointerException을 발생시키는데, 이는 int y = x;를 수행하려 할 때 null에서 기본 타입으로 unboxing을 시도하기 때문이며, nullint로 변환할 수 없습니다.

주제에 대한 세부 사항을 알지 못해 발생한 실제 오류 예시.


이야기

Integer 래퍼 컬렉션의 합계를 계산합니다. 합계가 증가할 때마다 새로운 Integer 객체가 생성되어 실제 서버에서 지연이 발생했습니다. 대신 int를 사용했어야 했습니다.

이야기

프로그래머가 캐시의 키로 Integer를 사용했으며, -128...127 값은 캐시되지만 나머지는 그렇지 않은 점을 고려하지 않았습니다. 이로 인해 ==가 갑자기 잘못된 결과를 반환하여 캐시에서 데이터의 잘못된 삭제가 발생했습니다.

이야기

REST API에서 nullable 값이 들어왔습니다. 수신된 Integer의 단순 unboxing이 종종 고객의 숫자 대신 예상치 못한 null로 인해 충돌을 일으켰습니다.