박싱 & 언박싱
JAVA

박싱 & 언박싱

박싱 & 언박싱의 탄생

자바의 데이터 타입은 크게 기본형(primitive)과 참조형(Reference) 타입이 있습니다.

기본형은 주로 간단한 데이터를 표현합니다. (숫자, 문자, 논리 값 등..)

참조형은 기본형 외 모든 데이터타입을 표현할 수 있습니다.

 

이렇게 딱 각자가 할일을 하면 좋겠지만, 특정한 상황에서는 기본형이 참조형이 돼야 할 필요가 생깁니다.

 

Case 1. 숫자 <-> 문자 형변환(Casting) 시

"12345"를 숫자로 형변환을 하고 싶으면, 'Integer.parseInt( )'를 사용해야 한다.

(오브젝트 타입으로 변환하려면 'Integer.valueOf( )'를 사용하자)

숫자끼리는 (타입)으로 형변환을 해도 되었다.

 

Case 2. Collection 사용 시

Map의 경우에는 기본형 타입을 쓸 수 없다.

그래서 Map<String,Map <String, int>는, Map <String, Integer>로 사용해야 한다.

 

등등...

 

이런 상황을 위해서 Wrapper 클래스를 만들어 두었습니다.

이 클래스를 사용하면, 기본형 타입을 참조형으로 감싸서 활용을 할 수 있게 됩니다.

그리고 이렇게 감싸는 동작을 박싱(Boxing), 참조형을 다시 기본형으로 푸는 형식을 언박싱(Unboxing)이라고 합니다.

 

 

박싱 & 언박싱 사용해보기

// Boxing
int beforeBoxing = 17;
Integer afterBoxing = new Integer(beforeBoxing);
Integer afterBOxing2 = new Integer(17);

afterBoxing.equals(afterBoxing2) // true

// Unboxing
int unBoxing1 = afterBoxing.intValue();
int unBoxing2 = afterBoxing2.intValue();

unBoxing1 == unBoxing2; // true

 

명시적 박싱 & 언박싱과 묵시적인 박싱과 언박싱(오토 박싱, 언박싱)

사실 이렇게 명시적으로 박싱을 하지 않아도, 박싱 기능은 그대로 수행이 됩니다.

//Auto boxing
int beforeBoxing = 17;
Integer afterBoxing = beforeBoxing;
Integer afterBoxing2 = 17;
Integer afterBoxing3 = Integer.valueOf("1234");

afterBoxing.equals(afterBoxing2); // true

//Auto unboxing
int i = afterBoxing;
int i1 = afterBoxing2;

System.out.println(i == i1); // true

이렇게 묵시적으로도 박싱과 언박싱이 되는 기능을, 오토 박싱과 오토 언박싱이라 합니다.

 

자바 9로 오면서, 오토 박싱/언박싱이 강화되었습니다.

 

'JAVA' 카테고리의 다른 글

객체 생성  (0) 2021.10.29
Arrays.asList( )와 List.of( )  (0) 2021.10.25