박싱은 원시타입의 값을 해당하는 래퍼 클래스의 객체로 변환하는 것을 말한다.
각각의 원시 타입에는 해당하는 래퍼 클래스가 있어서 그 원시 타입의 값을 객체로 다룰 때 사용하는 것이 박싱이다.
프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있다.
예를 들어, 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수 없다.
이때 기본 타입의 데이터를 먼저 객체로 변환한 후 작업을 수행해야한다.
자바의 기본 타입에 대응하여 자바에서 제공하고 있는 래퍼 클래스는 아래와 같다.
래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을 변경할 수 없다.
값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있다.
- 기본 타입의 데이터를 래퍼 클래스의 인스턴스로 변환하는 과정을 박싱(Boxing)
- 래퍼 클래스의 인스턴스에 저장된 값을 다시 기본 타입의 데이터로 꺼내는 과정을 언박싱(UnBoxing)
JDK 1.5부터 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리해준다
이렇게 자동화된 박싱과 언박싱을 오토 박싱과 오토 언박싱 이라고 부른다.
- 오토박싱을 이용하면 new 키워드를 사용하지 않고도 자동으로 인스턴스를 생성할 수 있다.
자동 박싱과 언박싱은 코드를 간결하게 해주는 장점이 있다. 하지만 다음의 문제들이 발생할 수 있다.
- 박싱된 값은 원시 타입에 비해 더 많은 메모리를 차지하며, 시간을 소요하는 문제가 있다.
- 래퍼 클래스의 경우 'null'값을 가질 수 있지만, 원시타입의 경우 null값을 가질 수 없어서 타입을 변환하는 과정에서 'NullPointerException'이 발생한다.
Integer i = null; int Autobox_i = i; // NullPointerException 발생. System.out.println(Autobox_i);
- ==연산자 사용 시 주의
원시 타입을 비교할 때는 '==' 연산자가 값을 비교하지만, 래퍼 클래스를 비교할 때는 '=='가 참조를 비교한다. 참조하는 메모리 영역이 같은 것인지를 비교하기 때문에 두 래퍼 객체의 값을 비교할 때 'equals()' 메서드를 사용한다.Integer a = 200; Integer b = 200; System.out.println(a == b); // 출력: false Integer c = 100; Integer d = 100; System.out.println(c == d); // 출력: true
- 자바는 -128 ~ 127의 값을 내부적으로 Integer 객체를 재사용해서 메모리 영역에 할당하기 때문에 '=='연산으로 비교는 가능하지만 그 이상의 값은 새로운 메모리 영역을 생성하므로 '=='로 정확하게 비교할 수 없기 때문에 'equals()' 메서드를 사용한다.