개발/Java

[Java] 오토 박싱 & 오토 언박싱

훈배 2024. 2. 27. 17:38

자바에는 기본 타입과 Wrapper 클래스가 존재합니다. 

  • 기본 타입 : int, long, float, double, boolean 
  • Wrapper 클래스 : Integer, Long, Float, Double, Boolean 

Wrapper 클래스

Wrapper 클래스란 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 의미합니다. 기본 타입의 데이터가 객체로 취급받아야 하는 경우 예를 들어, 메서드의 인수로 객체 타입만이 요구되는 경우에 쓰입니다. 또한 Wrapper 클래스로 인하여 더욱더 객체지향적인 프로그래밍이 가능해집니다.

 

자바의 기본 타입에 대응하여 제공하고 있는 래퍼 클래스는 다음과 같습니다.

기본 타입 래퍼 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

또한, Wrapper 클래스는 불변(immutable) 객체이기 때문에 외부에서 Wrapper 클래스에 저장된 값을 변경할 수 없습니다.

 

박싱 & 언박싱

박싱 : 기본 타입 데이터에 대응하는 Wrapper 클래스로 만드는 동작
언박싱 : Wrapper 클래스에서 기본 타입으로 변환
// 박싱
int i = 10;
Integer num = new Integer(i);

// 언박싱
Integer num = new Integer(10);
int i = num.intValue();

오토 박싱 & 오토 언박싱

JDK 1.5부터는 자바 컴파일러가 박싱과 언박싱을 자동으로 처리해 주는 기능이 추가되었습니다.

// 오토 박싱
int i = 10;
Integer num = i;

// 오토 언박싱
Integer num = new Integer(10);
int i = num;

 

성능

오토 박싱, 오토 언박싱으로 편의성이 향상 됐지만, 내부적으로 추가 연산을 거치게 됩니다.

 

오토 박싱 연산

public static void main(String[] args) {
    long t = System.currentTimeMillis();
    Long sum = 0L;
    for (long i = 0; i < 1000000; i++) {
        sum += i;
    }
    System.out.println("실행 시간: " + (System.currentTimeMillis() - t) + " ms");
}

// 실행 시간 : 28 ms

 

동일 타입 연산

public static void main(String[] args) {
    long t = System.currentTimeMillis();
    long sum = 0L;
    for (long i = 0; i < 1000000; i++) {
        sum += i;
    }
    System.out.println("실행 시간: " + (System.currentTimeMillis() - t) + " ms") ;
}

// 실행 시간 : 6 ms

100만건을 기준으로 약 5배 정도 성능 차이가 납니다. 따라서, 많은 양의 데이터를 처리해야 하는 경우에는 오토 박싱 & 오토 언박싱 연산이 이루어 지지 않도록, 타입을 통일시켜 불필요한 연산이 이루어 지지 않도록 하는 것이 바람직하겠습니다.

참조

자바의 정석

 

** 틀린 내용이 있을 시 지적해 주시면 감사하겠습니다.