공부/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
이들 사이에서 객체 ↔ 기본형 간의 변환을 Boxing과 Unboxing이라고 합니다.
- 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