CS/Java (CS)

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

ummchicken 2023. 11. 7. 10:54

✔️ 오토 박싱 & 오토 언박싱

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

 

 

  • 기본 타입 (primitive type) : stack 에 값을 저장
    • 정수 타입(byte, short, int, long)
    • 소수 타입(float, double)
    • bool 타입(boolean)
    • 문자 타입(char)

 

  • Wrapper 클래스 : stack 에 주소를 저장하고 heap 에서 값을 참조
    • 정수 타입(Byte, Short, Integer, Long)
    • 소수 타입(Float, Double)
    • bool 타입(Boolean)
    • 문자 타입(Character)
    • 값 비교에는 equals를 사용합니다. ==는 인스턴스의 주소비교에 사용

 

 

 

 

 

 

 

✔️ 박싱

기본 타입 데이터에 대응하는 Wrapper 클래스로 만드는 동작 (Primitive -> Wrapper)

 

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

 

 

 

  • 명시적인 박싱 : 프로그래머가 코딩하여 명시적으로 wrapper로 변환하는 것 (직접 타입변환을 기재하는 경우)
int intData = 512;

// 명시적인 방식
Integer integerData = (Integer)intData;

 

 

 

  • 묵시적인 박싱 : 프로그래머가 임의로 박싱을 해주는 것이 아니라 자동으로 박싱이 되는 것
int intData = 512;
 
// 묵시적인 방식
Integer integerData = intData;

 

 

 

 

 

 

✔️ 언박싱

Wrapper 클래스에서 기본 타입으로 변환 (Wrapper -> Primitive)

 

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

 

 

 

  • 명시적인 언박싱 : 프로그래머가 코딩하여 명시적으로 primitive로 변환하는 것 (Auto)
int intData = 512;

// 명시적인 언방식
int sum = (int)integerData + 100;
System.out.println(sum);

 

 

 

  • 묵시적인 언방식 : 코드상 프로그래머가 임의로 언박싱을 하는 것이 아니라 자동으로 언박싱이 되는 현상
int intData = 512;

// 묵시적인 언방식
int sum = integerData + 100;
System.out.println(sum);

 

 

 

 

 

 

✔️ Boxing / Unboxing 성능 고려 요소

→ Java에서 아무리 기능적 편의성을 위하여 박싱과 언박싱 그리고 오토박싱을 제공하지만,
명백히 다른 타입 간의 형변환은 어플리케이션의 성능에 영향을 미칠 수 밖에 없다.

 

 

  • Auto Boxing을 포함한 연산
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("processing time: " + (System.currentTimeMillis() - t) + " ms") ;
}

// processing time: 21 ms

 

 

 

  • 동일 primitive 타입간 연산
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("processing time: " + (System.currentTimeMillis() - t) + " ms") ;
}

// processing time: 4 ms

 

→ 총 100만번의 sum 연산을 통해 대략 5배의 결과차이를 보이는 것으로 확인했다.
100만건의 결과는 서비스 어플리케이션에서는 결코 작은 숫자는 아닐 것

→ 따라서 작성한 코드에 불필요한 auto casting이 반복적으로 이루어지고 있는지 확인하는 것은
대용량 서비스를 개발하는데 있어서 필수적으로 파악해야하는 요소임

 

 

 

 

 

 

 


출처