면접대비

Java의 Boxing과 Unboxing

코딩하는흑구 2021. 4. 4. 15:28

안녕하세요. 

 

이번 주제는 Boxing과 Unboxing 에 대해서 입니다.

 

Java에서의 primitive 데이터 타입

  • 정수타입(byte, short, int, long)
  • 소수타입(float, double)
  • bool 타입(boolean)
  • 문자타입(char)

 

이렇게 4가지가 존재하게 되는데요. 그와 마찬가지로 Wrapper 타입이라고 각 primitive 별 참조타입이 따로 존재하게 됩니다.

 

Wrapper 타입

  • 정수타입(Byte, Short, Integer, Long)
  • 소수타입(Float, Double)
  • bool 타입(Boolean)
  • 문자타입(Character)

 


 

Boxing / Unboxing 의미와 사용이유

위의 primitive 타입과 wrapper 타입을 서로 왔다갔다 할때(Casting), 

  • Boxing : Primitive -> Wrapper
  • Unboxing : Wrapper -> Primitive

위의 방향에 따라 boxing 과 unboxing이라는 개념을 갖게 됩니다.

 

기존의 자바에 Collection 자료구조 인터페이스들이 하나둘씩 추가됨에 따라 기본타입을 활용해서 Collection에 담을 수 없게 됩니다.

 

그로 인애 primitive 타입을 내부로 감싼 Wrapper 타입을 활용하게 되고 좀더 유연한 Collection 사용이 가능해지도록 하였습니다.

 


 

Boxing / Unboxing 선언 및 실행

명시적 선언

ex ) 직접 타입변환을 기재하는 경우.

Integer a1 = new Integer(1);
int a2 = (int)a1;

 

묵시적 선언(Auto)

ex) 직접 선언하지 않아도 자동으로 Boxing Unboxing을 지원해주는 기능

Integer a1 = new Integer(1);
int a2 = a1;

 


 

Boxing / Unboxing 성능 고려 요소

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

 

아무리 작은 차이가 존재한다고 할지라도 어플리케이션의 성능측면에서 봤을때 반드시 필요한 상황(1건이라던가 대용량이 아닐때)이 아니라면 지양해야하는 기능일 것이다.

 

아래의 예제를 보자

 

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만건의 결과는 서비스 어플리케이션에서는 결코 작은 숫자는 아닐것이다.

 

어떤 숫자들을 정산하거나 결과집합을 내는데에 있어서 100만은 상당히 작은 숫자일 수도 있으며 심지어는 1억건의 결과집합을 수행해야할 수 있다.

 

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