Java Wrapper Class, Auto Boxing

1. Wrapper Class

Wrapper Class란?

자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다.
대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있는데 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있습니다. 이럴 때에 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다. Wrapper Class는 java.lang 패키지에 포함되어 있습니다.

컬렉션에서 제네릭을 사용하기 위해서는 Wrapper class를 사용해줘야하는데 null 값을 반환해야만 하는 경우에는 return type 을 Wrapper class 로 지정하여 null을 반환하도록 할 수 있습니다. 아니면 옵셔널을 붙여서 반환하는 방식도 있습니다.

Primitive data type 인 경우에는 “==” 비교가 가능하지만 Wrapper class 인 경우에는 .intValue() 메소드를 통해 해당 Wrapper class 의 값을 직접 가져와서 비교해야합니다.

1
2
3
4
5
6
public class WrapperClass {
public static void main(String[] args) {
Integer phoneNumber = new Integer("123456789");
int num = phoneNumber.intValue();
}
}

위와 같은 예제는 기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고 반대로 포장객체에서 기본타입의 값을 얻어내는 과정을 언박싱이라고 합니다.

2. AutoBoxing

기본타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있습니다. 자동 박싱의 포장 클래스 타입에 기본값이 대입될 경우에 발생합니다. AutoBoxing은 JDK 1.5 부터는 AutoBoxing과 AutoUnBoxing을 제공합니다. 이 기능은 각 Wrapper class 에 상응하는 Primitive data type 일 경우에만 가능합니다.

예제 1

1
2
3
4
5
6
7
8
public class WrapperClass {
public static void main(String[] args) {
// 자동 박싱
Integer phoneNumber = 123456789;
// 자동 언박싱
int num = phoneNumber;
}
}

다음과 같이 Integer Wrapper Class에서 Primitive data type으로 AutoBoxing이 일어나게 됩니다.

예제 2

1
2
List<Integer> arrList = new ArrayList<>();
arrList.add(1);

다음과 같은 예제는 Integer라는 Wrapper class 로 설정한 collection 에 데이터를 add 할 때 Integer 객체로 감싸서 넣지 않습니다.
즉, 자바 내부에서 AutoBoxing 해주기 때문입니다.