본문 바로가기

JAVA

[JAVA] 오토 박싱과 오토 언박싱이란?

728x90

1. 오토 박싱(Auto Boxing)과 오토 언박싱(Auto Unboxing)이란?

오토 박싱은 자바에서 기본형(primitive type) 데이터를 자동으로 래퍼 클래스(wrapper class)로 변환하는 과정이고, 오토 언박싱은 그 반대로 래퍼 클래스 객체를 기본형으로 자동 변환하는 과정입니다. 자바 5에서 도입된 이 기능은 기본형과 객체형 간의 변환을 간편하게 만들어줍니다.

 

2. 기본형과 래퍼 클래스

자바에는 8가지 기본형 데이터 타입이 있으며, 각각에 대응하는 래퍼 클래스가 존재합니다.

기본형 (Primitive) 래퍼 클래스 (Wrapper Class)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

 

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

오토 박싱:

public class AutoBoxingExample {
    public static void main(String[] args) {
        // 오토 박싱: 기본형 int가 Integer 객체로 자동 변환
        Integer integerValue = 100;

        // Integer 객체를 출력
        System.out.println("Autoboxing: " + integerValue);
    }
}

오토 언박싱:

public class AutoUnboxingExample {
    public static void main(String[] args) {
        // 오토 언박싱: Integer 객체가 기본형 int로 자동 변환
        Integer integerValue = 200;
        int primitiveValue = integerValue;

        // int 값을 출력
        System.out.println("AutoUnboxing: " + primitiveValue);
    }
}

 

4. 성능 차이

오토 박싱과 언박싱은 자바에서 코드의 가독성을 높여주지만, 기본형과 객체형 간의 변환에는 성능 상의 오버헤드가 발생할 수 있습니다. 특히 큰 규모의 연산이나 반복 작업에서 성능 차이가 두드러지게 나타날 수 있습니다.

  • 기본형(Primitive)은 메모리 상에 직접 값을 저장하여 메모리 효율이 좋고, 연산 속도도 빠릅니다.
  • 래퍼 클래스(Wrapper Class)는 객체이므로, 힙 영역에 객체가 생성되며 이는 메모리 할당과 가비지 컬렉션 등의 부가 작업을 수반합니다.

예제:

public class PerformanceTest {
    public static void main(String[] args) {
        long startTime, endTime;

		// 1. 기본형을 사용한 반복 연산
        startTime = System.currentTimeMillis();
        int sumPrimitive = 0;
        for (int i = 0; i < 1000000; i++) {
            sumPrimitive += i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("Primitive time: " + (endTime - startTime) + " ms");
        // Primitive time: 8 ms
        
        
       	// 2. 래퍼 클래스를 사용한 반복 연산 (오토 박싱/언박싱 발생)
        startTime = System.currentTimeMillis();
        Integer sumWrapper = 0;
        for (int i = 0; i < 1000000; i++) {
            sumWrapper += i;  // 오토 박싱/언박싱 발생
        }
        endTime = System.currentTimeMillis();
        System.out.println("Wrapper time: " + (endTime - startTime) + " ms");
        // Wrapper time: 23 ms
    }
}
  • 기본형을 사용할 경우 메모리 할당과 해제 등의 오버헤드가 없기 때문에 더 빠르게 수행됩니다.
  • 반면, 래퍼 클래스는 오토 박싱/언박싱 과정에서 객체 생성과 변환 작업이 추가로 이루어져 성능 저하가 발생합니다.
  • 위에서 보이듯이, 10만건 기준으로 3배 정도 차이가 난다

 

5. 오토 박싱과 언박싱에서 주의할 점

  • NullPointerException: 오토 언박싱에서 null 값이 들어올 경우 NullPointerException이 발생할 수 있습니다. 예를 들어 Integer 타입 변수가 null인 경우, 이를 int로 언박싱하려고 하면 오류가 발생합니다.
  • Integer obj = null; int value = obj; // NullPointerException 발생
  • 성능 이슈: 반복문 안에서 자주 오토 박싱/언박싱이 발생하는 경우 성능 저하가 두드러질 수 있습니다. 이때는 가능하면 기본형 타입을 사용하는 것이 좋습니다.

 

6. 성능 최적화를 위한 팁

  • 기본형을 우선 사용: 성능이 중요한 부분에서는 래퍼 클래스보다 기본형을 사용하는 것이 좋습니다.
  • 래퍼 클래스의 캐싱(Caching): 자바는 -128에서 127 범위의 Integer 값을 캐싱하므로, 이 범위 내의 숫자에 대해서는 새로운 객체를 생성하지 않고 캐시된 객체를 재사용합니다. 하지만 범위를 벗어나는 값에 대해서는 매번 새로운 객체를 생성합니다.
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true, 캐싱된 객체

Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false, 새로운 객체

 

결론

 

오토 박싱과 언박싱은 자바 프로그래밍에서 편리함을 제공하지만, 성능이 중요한 경우에는 이를 주의해서 사용해야 합니다. 특히 반복문 내에서 불필요한 박싱과 언박싱이 발생하지 않도록 기본형을 적절히 사용하는 것이 성능 최적화에 도움이 됩니다.