Java 오토박싱 언박싱(Auto-Boxing || Unboxing), Int ↔ Interger, Heap 휘발

습토리·2025년 2월 25일
0

Java

목록 보기
25/32

Java에서 기본형(primitive type)과 래퍼 클래스(wrapper class) 간의 변환이 자동으로 이루어지는 과정이 있습니다. 이를 오토박싱(Auto-Boxing)언박싱(Unboxing) 이라고 합니다.

하지만 단순히 자동 변환이라고만 알고 있으면 나중에 기억이 잘 안 날 수도 있어요. 그래서 제가 직접 이해한 내용을 중심으로 설명해 보겠습니다.


1. 기본형과 래퍼 클래스란?

Java에는 숫자를 직접 저장하는 기본형(primitive type)과 숫자를 객체로 감싸는 래퍼 클래스(wrapper class)가 있어요.

기본형래퍼 클래스
intInteger
doubleDouble
booleanBoolean
charCharacter

기본형은 단순한 값을 저장하지만, 래퍼 클래스는 객체로 취급됩니다. 즉, 기본형 int는 단순 숫자일 뿐이지만, 래퍼클래스 Integer힙(Heap)에 저장되는 객체예요. 처음에는 이 기본형과 래퍼클래스가 어떻게 다른지 기억이 나지 않아서 헷갈렸었어요.


2. 오토박싱(Auto-Boxing)이란?

기본형 → 래퍼 클래스로 자동 변환되는 과정입니다.

int num = 10;
Integer obj = num;  // 오토박싱 (int → Integer)

기본형 intInteger에 대입했는데도 별다른 변환 과정 없이 자동으로 객체로 감싸졌어요. 이게 바로 오토박싱입니다.


3. 언박싱(Unboxing)이란?

래퍼 클래스 → 기본형으로 자동 변환되는 과정입니다.

Integer obj = 20;
int num = obj;  // 언박싱 (Integer → int)

래퍼 클래스 Integerint 변수에 넣었는데도 자동으로 변환되었죠? 이게 언박싱입니다.


4. intInteger의 차이점

이 부분도 헷갈렸던 부분은 Heap은 휘발한다 했는데, 왜 래퍼클래스가 Heap에 저장되지? 하고 혼란스러웠는데요. 바로 사라지는 것이 아니고, 필요 없어졌을때 비로소 없어집니다. 그렇기에 래퍼클래스로 변환할 때 데이터가 아직은 남아있는 것이지요.

기본형 int래퍼 클래스 Integer
저장 위치Stack (스택)Heap (힙)
null 저장 가능?❌ 불가능✅ 가능
객체로 취급?❌ 아니요✅ 네
GC(Garbage Collector) 적용?❌ 없음✅ 적용

기본형 int는 Stack에 저장되고 함수가 끝나면 사라지지만, Integer는 Heap에 저장되어 필요 없어질 때 GC(Garbage Collector)가 정리해요.


5. Integer가 필요한 이유

1️⃣ intnull을 저장할 수 없음

int num = null;  // ❌ 컴파일 오류 발생!
Integer obj = null;  // ✅ 가능

기본형 intnull을 저장할 수 없지만, Integer는 가능하죠.
즉, 값이 없다는 상태를 나타낼 때 Integer가 필요해요.

2️⃣ 객체를 다룰 때 필요

class Person {
    Integer age;  // int 대신 Integer 사용
}
  • 객체(Person)의 속성으로 숫자를 저장할 때, null이 될 수도 있기 때문에 Integer를 사용합니다.

6. 오토박싱과 언박싱 예제

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

7. 오토박싱과 언박싱의 주의점

⚠️ 성능 문제

오토박싱과 언박싱은 객체를 생성하거나 해제하는 과정이 포함되므로 성능 오버헤드가 발생할 수 있습니다.

성능 오버헤드란?

오버헤드(Overhead)란, 어떤 작업을 수행하는 데 들어가는 추가 비용(시간, 메모리 등)을 의미해요.

성능 오버헤드(Performance Overhead)는 프로그램이 실행될 때 불필요하게 성능을 낮추는 요소를 말해요.

오토박싱과 언박싱의 성능 오버헤드

오토박싱과 언박싱은 기본형 int을 객체 Integer로 변환하거나, 객체를 기본형으로 변환하는 과정에서 추가적인 연산과 메모리 할당이 필요해요. 그래서 기본형 int를 직접 사용하는 것보다 메모리 사용량이 늘어나고, 속도가 느려질 수 있어요.

⚠️ null 값 언박싱 시 NullPointerException 발생 가능

Integer obj = null;
int num = obj;  // NullPointerException 발생 ❌
  • Integernull일 때 언박싱을 시도하면 예외가 발생할 수 있으므로 조심해야 해요.

8. 내가 이해한 정리

  • 오토박싱: 기본형 → 래퍼 클래스로 자동 변환
  • 언박싱: 래퍼 클래스 → 기본형으로 자동 변환
  • 기본적으로 int를 사용하는 것이 빠르고 효율적이지만, null을 다루거나 객체가 필요할 때 Integer를 사용
  • Integer는 Heap 메모리에 저장되며, 더 이상 사용되지 않으면 GC가 정리함
  • int는 Stack에 저장되고, 함수가 끝나면 자동으로 사라짐

---

이제 오토박싱과 언박싱 개념이 더 확실해졌어요!
저처럼 헷갈렸던 분들에게 도움이 되길 바랍니다. 😊

profile
재미난 삶을 살다

0개의 댓글