ComputerScience

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

Albosa2lol 2024. 3. 10. 09:23

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

 

기본 타입(Primitive Types)

기본 타입은 Java 언어에 내장된 가장 기본적인 데이터 타입으로, 변수가 실제 값을 직접 저장. (int, long, float, double, boolean 등)

 

기본 타입은 메모리 효율성이 높고, 속도가 빠르다. 하지만, 객체 지향 프로그래밍의 객체로 취급되지 않아 객체가 제공하는 메소드를 사용할 수 없고, null 값을 가질 수 없음

 

Wrapper 클래스

각 기본 타입에 해당하는 Wrapper 클래스는 기본 타입의 값을 객체로 취급할 수 있게 함. 이 클래스들은 java.lang 패키지에 포함되어 있으며, 기본 타입 값을 포함하고, 관련된 유용한 메서드 및 상수를 제공함(Integer, Long, Float, Double, Boolean 등)

 

Java 5부터는 오토박싱(Auto-boxing)과 언박싱(Unboxing) 기능을 통해 기본 타입과 해당 Wrapper 클래스 간의 변환을 자동으로 처리할 수 있음. 이는 개발자가 명시적으로 변환 코드를 작성하지 않아도, 필요에 따라 자동으로 기본 타입과 Wrapper 타입 간 변환을 수행함

 

박싱언박싱이란?박싱 : 기본 타입 데이터에 대응하는 Wrapper 클래스로 만드는 동작
언박싱 : Wrapper 클래스에서 기본 타입으로 변환

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

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

 

한눈에 보는 박싱과 언박싱. 기본타입과 래퍼클래스로 변환해주는 과정

 

편의성을 위해 오토 박싱과 언박싱이 제공되고 있지만, 내부적으로 추가 연산 작업이 거치게 된다.

따라서, 오토 박싱&언박싱이 일어나지 않도록 동일한 타입 연산이 이루어지도록 구현해야 함

 

오토 박싱과 동일타입 연산 간의 실제 성능 차이

 

오토박싱 연산

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");
}

 

실행 시간 : 19 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") ;
}

 

실행시간 : 4ms

 

100만건 기준으로 약 5배의 성능 차이가 난다.

따라서 서비스를 개발하면서 불필요한 오토 캐스팅이 일어나는 지 확인하는 습관을 가지자.

'ComputerScience' 카테고리의 다른 글

프로세스 & 스레드  (1) 2024.04.07
Casting (업캐스팅 & 다운캐스팅)  (0) 2024.03.26
[Java] 원시 타입 vs 참조 타입  (0) 2024.03.03
Call by value와 Call by reference  (0) 2024.02.25
Java 컴파일 과정  (1) 2024.02.20