Backend Roadmap/Java

오토 박싱과 오토 언박싱

jungeun919 2024. 6. 25. 14:01

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

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

 

Wrapper 클래스

  • 프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있다. 이때 기본 타입의 데이터를 객체로 포장해 주는 클래스를 Wrapper 클래스라고 한다.
  • Wrapper 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어준다.
  • Wrapper 클래스는 java.lang 패키지에 포함되어 제공된다.

 

박싱과 언박싱

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

 

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

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

 

오토 박싱과 오토 언박싱

JDK 1.5부터는 자바 컴파일러가 박싱과 언박싱이 필요한 상황에 자동으로 타입 변환을 해준다.

  • 오토 박싱은 기본 타입의 값을 해당 Wrapper 클래스의 객체로 변환하는 것을 의미한다. 오토 박싱은 코드에서 보이지 않지만 Wrapper 클래스 객체의 값을 할당하기 위해 객체를 생성한다.
  • 오토 언박싱은 Wrapper 클래스의 객체를 해당 기본 타입의 값으로 변환하는 것을 의미한다.
//오토 박싱
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");
}

//실행시간: 19ms
//동일 타입 연산
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

 

Reference

'Backend Roadmap > Java' 카테고리의 다른 글

정적 바인딩과 동적 바인딩  (0) 2024.06.25
가비지 컬렉션(Garbage Collection)  (0) 2024.06.25
스트림(Stream)  (0) 2024.06.25
자바 타입 제네릭(Generic)  (0) 2024.06.25
JVM 구조, JRE, JDK  (0) 2024.06.25