728x90
개요
Java 개발을 하다 보면 기본 데이터 타입(primitive type)과 객체형 래퍼 클래스(wrapper class) 간의 변환 과정을 자주 만나게 됩니다.
이를 박싱(Boxing)과 언박싱(Unboxing)이라고 합니다. 이번 글에서는 박싱과 언박싱의 개념, 작동 원리, 장단점에 대해서 정리하고자 합니다.
박싱(Boxing)이란 ?
박싱은 기본 데이터 타입(primitive type)을 대응하는 래퍼 클래스(wrapper class) 객체로 변환하는 과정입니다.
기본 데이터 타입(primitive type) ▶ 래퍼 클래스(wrapper class) 객체
기본 데이터 타입 & 래퍼 클래스
기본 데이터 타입 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
flaot | Float |
double | Double |
char | Character |
boolean | Boolean |
박싱(Boxing) 예시
int num = 10; // 기본 데이터 타입
Integer boxedNum = Integer.valueOf(num); // 박싱
System.out.println("박싱된 값: " + boxedNum);
언박싱(UnBoxing)이란 ?
언박싱은 래퍼 클래스 객체(wrapper class)를 기본 데이터 타입(primitive type)으로 변환하는 과정입니다
래퍼 클래스 객체(wrapper class) ▶ 기본 데이터 타입(primitive type)
언박싱(UnBoxing) 예시
Integer boxedNum = Integer.valueOf(10); // 래퍼 클래스 객체
int num = boxedNum.intValue(); // 언박싱
System.out.println("언박싱된 값: " + num);
자동 박싱(Auto-Boxing)과 자동 언박싱(Auto-Unboxing)
Java 5부터는 박싱과 언박싱을 개발자가 명시적으로 수행하지 않아도, Java 컴파일러가 이를 자동으로 처리해줍니다. 이를 자동 박싱(Auto-Boxing)과 자동 언박싱(Auto-Unboxing)이라고 합니다.
자동 박싱 예제
int num = 10;
Integer boxedNum = num; // 자동 박싱
System.out.println("자동 박싱된 값: " + boxedNum);
자동 언박싱 예제
Integer boxedNum = 20;
int num = boxedNum; // 자동 언박싱
System.out.println("자동 언박싱된 값: " + num);
박싱과 언박싱의 활용
Java의 컬렉션(List, Set, Map 등)은 객체만 저장할 수 있기 때문에 기본 데이터 타입을 저장하려면 박싱이 필요합니다.
List<Integer> list = new ArrayList<>();
list.add(10); // 자동 박싱
int num = list.get(0); // 자동 언박싱
System.out.println("리스트의 첫 번째 값: " + num);
박싱과 언박싱의 장단점
장점
- 객체와 기본 데이터 타입의 자유로운 변환
- 박싱과 언박싱 덕분에 기본 타입을 객체처럼 다룰 수 있습니다.
- 컬렉션 및 제네릭과 호환
- Java의 객체 기반 설계에 기본 타입을 적절히 사용할 수 있게 합니다.
단점
- 성능 이슈
- 박싱과 언박싱은 메모리 할당과 객체 생성이 필요하기 때문에 성능에 영향을 미칠 수 있습니다.
Integer value = null;
int num = value; // NullPointerException 발생
- NullPointerException 위험
- 래퍼 클래스가 null인 경우, 이를 언박싱하면 예외가 발생합니다.
주의사항
1. NullPointerException 방지
Integer boxedValue = null;
int value = (boxedValue != null) ? boxedValue : 0; // 안전한 처리
- 위 코드와 같이 래퍼 클래스의 값이 null인지 항상 확인해야 합니다.
2. 박싱/언박싱 과다 사용 X
int sum = 0;
for (Integer num : list) {
sum += num; // 반복적으로 언박싱 발생 (성능 저하 가능)
}
- 성능에 민감한 코드에서는 박싱과 언박싱을 최소화해야 합니다.
3. 비교 시 주의
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2); // false (참조 비교)
System.out.println(num1.equals(num2)); // true (값 비교)
- 기본 타입과 래퍼 클래스를 비교할 때는 ==는 객체 참조를 비교하고, .equals()는 실제 값을 비교하므로, 래퍼 클래스를 비교할 때는 항상 .equals()를 사용하는 것이 바람직합니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.11.21 - 코딩 관련 기초 지식 (1부터 N까지의 합 공식 : 시그마 ∑) (0) | 2024.11.21 |
---|---|
[TIL, 일일 회고] 2024.11.20 - 비트마스크를 이용한 백준-집합 문제 풀이 (1) | 2024.11.20 |
[TIL, 일일 회고] 2024.11.17 - OptionalInt 알아보기 (0) | 2024.11.17 |
[TIL, 일일 회고] 2024.11.16 - int, long, BigInteger: 자료형 선택 기준 알아보기 (0) | 2024.11.16 |
[TIL, 일일 회고] 2024.11.15 - STAR 기법이란 무엇일까❓ (0) | 2024.11.15 |