Java에서 기본형(primitive type)과 래퍼 클래스(wrapper class) 간의 변환이 자동으로 이루어지는 과정이 있습니다. 이를 오토박싱(Auto-Boxing) 과 언박싱(Unboxing) 이라고 합니다.
하지만 단순히 자동 변환이라고만 알고 있으면 나중에 기억이 잘 안 날 수도 있어요. 그래서 제가 직접 이해한 내용을 중심으로 설명해 보겠습니다.
Java에는 숫자를 직접 저장하는 기본형(primitive type)과 숫자를 객체로 감싸는 래퍼 클래스(wrapper class)가 있어요.
| 기본형 | 래퍼 클래스 |
|---|---|
int | Integer |
double | Double |
boolean | Boolean |
char | Character |
기본형은 단순한 값을 저장하지만, 래퍼 클래스는 객체로 취급됩니다. 즉, 기본형 int는 단순 숫자일 뿐이지만, 래퍼클래스 Integer는 힙(Heap)에 저장되는 객체예요. 처음에는 이 기본형과 래퍼클래스가 어떻게 다른지 기억이 나지 않아서 헷갈렸었어요.
기본형 → 래퍼 클래스로 자동 변환되는 과정입니다.
int num = 10;
Integer obj = num; // 오토박싱 (int → Integer)
기본형 int를 Integer에 대입했는데도 별다른 변환 과정 없이 자동으로 객체로 감싸졌어요. 이게 바로 오토박싱입니다.
래퍼 클래스 → 기본형으로 자동 변환되는 과정입니다.
Integer obj = 20;
int num = obj; // 언박싱 (Integer → int)
래퍼 클래스 Integer를 int 변수에 넣었는데도 자동으로 변환되었죠? 이게 언박싱입니다.
int와 Integer의 차이점이 부분도 헷갈렸던 부분은 Heap은 휘발한다 했는데, 왜 래퍼클래스가 Heap에 저장되지? 하고 혼란스러웠는데요. 바로 사라지는 것이 아니고, 필요 없어졌을때 비로소 없어집니다. 그렇기에 래퍼클래스로 변환할 때 데이터가 아직은 남아있는 것이지요.
기본형 int | 래퍼 클래스 Integer | |
|---|---|---|
| 저장 위치 | Stack (스택) | Heap (힙) |
| null 저장 가능? | ❌ 불가능 | ✅ 가능 |
| 객체로 취급? | ❌ 아니요 | ✅ 네 |
| GC(Garbage Collector) 적용? | ❌ 없음 | ✅ 적용 |
기본형 int는 Stack에 저장되고 함수가 끝나면 사라지지만, Integer는 Heap에 저장되어 필요 없어질 때 GC(Garbage Collector)가 정리해요.
Integer가 필요한 이유int는 null을 저장할 수 없음int num = null; // ❌ 컴파일 오류 발생!
Integer obj = null; // ✅ 가능
기본형 int는 null을 저장할 수 없지만, Integer는 가능하죠.
즉, 값이 없다는 상태를 나타낼 때 Integer가 필요해요.
class Person {
Integer age; // int 대신 Integer 사용
}
null이 될 수도 있기 때문에 Integer를 사용합니다.int num1 = 5;
Integer obj1 = num1; // 오토박싱 (int → Integer)
Integer obj2 = 10;
int num2 = obj2; // 언박싱 (Integer → int)
System.out.println(obj1); // 출력: 5
System.out.println(num2); // 출력: 10
오토박싱과 언박싱은 객체를 생성하거나 해제하는 과정이 포함되므로 성능 오버헤드가 발생할 수 있습니다.
오버헤드(Overhead)란, 어떤 작업을 수행하는 데 들어가는 추가 비용(시간, 메모리 등)을 의미해요.
성능 오버헤드(Performance Overhead)는 프로그램이 실행될 때 불필요하게 성능을 낮추는 요소를 말해요.
오토박싱과 언박싱은 기본형 int을 객체 Integer로 변환하거나, 객체를 기본형으로 변환하는 과정에서 추가적인 연산과 메모리 할당이 필요해요. 그래서 기본형 int를 직접 사용하는 것보다 메모리 사용량이 늘어나고, 속도가 느려질 수 있어요.
null 값 언박싱 시 NullPointerException 발생 가능Integer obj = null;
int num = obj; // NullPointerException 발생 ❌
Integer가 null일 때 언박싱을 시도하면 예외가 발생할 수 있으므로 조심해야 해요.오토박싱: 기본형 → 래퍼 클래스로 자동 변환언박싱: 래퍼 클래스 → 기본형으로 자동 변환int를 사용하는 것이 빠르고 효율적이지만, null을 다루거나 객체가 필요할 때 Integer를 사용Integer는 Heap 메모리에 저장되며, 더 이상 사용되지 않으면 GC가 정리함int는 Stack에 저장되고, 함수가 끝나면 자동으로 사라짐---
이제 오토박싱과 언박싱 개념이 더 확실해졌어요!
저처럼 헷갈렸던 분들에게 도움이 되길 바랍니다. 😊