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에 저장되고, 함수가 끝나면 자동으로 사라짐---
이제 오토박싱과 언박싱 개념이 더 확실해졌어요!
저처럼 헷갈렸던 분들에게 도움이 되길 바랍니다. 😊