공부/Java

자바의 Boxing과 Unboxing: 오토박싱과 언박싱 제대로 이해하기

아찌방 2025. 5. 6. 23:47

0. 헛소리

우리가 보통 언박싱(Unboxing)이라고 하면 포장 된 물건을 꺼내보는 것을 말하죠?

자바에서의 박싱과 언박싱도 비슷합니다.

 

1. 📌 기본 개념

자바에서는 int, char, boolean 등의 기본형(primitive type)과 이들을 객체로 다룰 수 있는 래퍼 클래스(wrapper class)가 존재함.

예시)

1) int ↔ Integer

2) double ↔ Double

3) char ↔ Character

 

이들 사이에서 객체 ↔ 기본형 간의 변환을 BoxingUnboxing이라고 합니다.

  • Boxing : 기본형 → 객체형 변환
  • Unboxing : 객체형 → 기본형 변환

이 과정을 자동으로 처리하는 기능을 각각 Autoboxing, Auto-unboxing이라고 합니다.

 

2. ✅ Autoboxing과 Unboxing 예제

public class BoxingExample {
    public static void main(String[] args) {
        int primitive = 10;

        // Autoboxing
        Integer boxed = primitive;

        // Unboxing
        int unboxed = boxed;

        System.out.println("Boxed: " + boxed);
        System.out.println("Unboxed: " + unboxed);
    }
}

 

Integer boxed = primitive;

=> 문장은 자바가 Integer.valueOf(primitive)로 자동 변환해주는 기능

 

반대로 int unboxed = boxed;는 boxed.intValue()를 자동 호출해주는 것임

 

 

3. 📌 왜 필요할까?

컬렉션 프레임워크(예: List, Set, Map)는 객체만 다룰 수 있으므로, 기본형 데이터를 넣기 위해선 래퍼 객체가 필요합니다.

 

List<Integer> numbers = new ArrayList<>();
numbers.add(10); // Autoboxing으로 Integer.valueOf(10) 호출됨

 

 

4. ⚠️ 주의할 점

1) 성능 이슈

Autoboxing은 내부적으로 객체 생성을 수반하므로, 빈번한 박싱/언박싱은 성능 저하를 유발할 수 있

Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
    sum += i; // 매번 Long 객체 생성 + Unboxing 발생
}

 

2) NullPointerException 가능성

Integer value = null;
int num = value; // Runtime Error! NullPointerException

 

 

5. 📋 결론

Boxing 기본형 → 객체형 변환
Unboxing 객체형 → 기본형 변환
Autoboxing 자바 컴파일러가 자동 변환
주의사항 성능 저하, NullPointerException 가능성

 

728x90