본문 바로가기

JAVA

Wrapper Class, AutoBoxing && UnBoxing에 대해 정복하기!

Wrapper Class 란?

객체 지향 언어인 JAVA로 프로그래밍을 할 때 때때로 기본 타입(primitive type)의 값을 객체로 다루어야 할 상황이 발생합니다.

 

예를 들어 메서드의 인수로 객체 타입만이 요구된다면?? 기본 타입의 데이터를 그대로 사용할 수 없기 때문에 변환 작업이 필요합니다.

 

또한 멀티 쓰레드 환경에서 기본형 타입의 값을 공유 데이터로 사용하고 있다고 가정해 보겠습니다. 이러한 기본형 타입의 값에 동기화 처리를(한번에 한 쓰레드만 공유 데이터에 접근할 수 있도록) 하기 위해 객체화 해야 할 필요성이 생길 수 있습니다.

 

위와 같은 상황에서 기본 타입을 객체로 다루기 위해 사용하는 클래스를 래퍼 클래스라고 합니다

 

자바에서는 모든 기본타입의 값을 갖는 객체를 java.lang 패키지에 포함해서 제공합니다.

래퍼 클래스에 종류는 밑의 그림을 참고해주세요~

 


박싱(Boxing) & 언박싱(UnBoxing)

위에서 설명한 것과 같이 기본형 값을 포장하여 객체로 만드는 것은 좋지만, 만일 값에 대한 연산이 필요할 경우 포장을 다시 뜯을 필요가 있습니다!

 

이러한 행위를 Boxing과 UnBoxing이라고 부릅니다

Boxing : 기본 타입의 데이터 -> 래퍼 클래스의 인스턴스로 변환

UnBoxing : 래퍼 클래스의 인스턴스에 저장된 값 -> 기본 타입의 데이터로 변환하는 것

 

래퍼 클래스는 생성된 인스턴스의 값만을 참조할 수 있기에, 래퍼 클래스 인스턴스 저장된 값을 직접 변경할 수 없습니다.

따라서 래퍼 클래스를 언박싱 한 뒤에 값을 변경 후 다시 박싱해야 하는 중간 단계를 거쳐야 합니다.


Auto Boxing & Auto UnBoxing

JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 자동으로 처리해주기 시작하였습니다.

이러한 자동화된 박싱과 언박싱을 오토 박싱과 오토 언박싱이라고 부릅니다.

 

// 기존 박싱 & 언박싱
Integer num = new Integer(17); // 박싱
int n = num.intValue();

// 오토 박싱 & 언박싱
Integer num = 17;
int n = num

// 연산 또한 가능
Integer num1 = new Integer(7);
Integer num2 = new Integer(3);

Integer result = num1 + num2;

 

위와 같이 오토 박싱을 이용하면 new 키워드를 사용하지 않고도 자동으로 인스턴스를 생성할 수 있고, 언박싱 메서드를 사용하지 않고도 오토 언박싱을 통해 인스턴스에 저장된 값을 바로 참조할 수 있게 됩니다.

 


주의 할 점

오토 박싱,언박싱을 통해 객체 값을 더하고 빼는 것은 문제가 없지만 값을 비교할때는 조심해야 합니다.

 

래퍼 클래스 둘을 == 로 비교 연산을 할때는 객체의 주소를 통해 값을 비교하여 의도치 않은 결과가 나타납니다.

 

또한 대용량 트래픽이 발생하는 서비스를 이용할 경우, 이러한 auto Casting이 반복적으로 일어날 경우 실행 시간에 큰 영향을 미칠 수 있으므로 주의해야 합니다!


참고

자바의 정석

https://inpa.tistory.com/entry/JAVA-☕-wrapper-class-Boxing-UnBoxing