Boxing과 Unboxing은 기본 타입과 참조 타입 간의
기본타입의 데이터(primitve type) -> 참조타입으로
참조타입의 데이터(Reference type) -> 기본타입으로
기본타입은 Stack메모리 참조타입은 Heap 메모리에 저장된다.
즉
옮기는 과정이 이루어진다.
ArrayList<int>
는 없다.
ArrayList<Integer>
만 가능하다.
이처럼 컬렉션 프레임워크가 참조자료형만 저장할 수 있기 때문에 primitive type을 Reference타입으로 변환해야 한다.
즉 ArrayList에 int 를 넣으려면 Integer같은 wrapper클래스를 사용하는 것이다.
반대로 컬렉션에서 데이터를 꺼내 사용할 때는 Unboxing을 거쳐 기본 타입으로 변환해야 한다.
하지만 명시적으로 작성해야 할 때도 있다.
박싱 언박싱은 AutoBoxing과 AutoUnboxing의 기능을 통해서 간소화될 수 있다.
이 기능은 컴파일러가 자동으로 기본 타입과 참조 타입간의 변환 코드를 삽입해주는 기능이다.
기본타입을 직접 관리해 Boxing Unboxing 과정없이 성능을 향상 시킨다. 대신 라이브러리를 사용해야한다.
루프안에서 반복적으로 박싱 언박싱이 일어날 수 있다.
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(i); // 박싱 발생
}
IntStream.range(0, 1000).forEach(list::add); // 박싱/언박싱 없음
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true (같은 객체)
Integer a = 1000;
Integer b = 1000;
//Integer의 범위가 -128에서 127을 넘겨서 캐싱된 데이터 안쓰고 다른데이터 써서 그럼
System.out.println(a == b); // false (서로 다른 객체)
java에서 Integer같은 래퍼 클래스는 캐싱을 사용한다.
특정 범위 내의 값을 재사용하도록 설계되어 있다. 이 범위는 -128~ 127의 정수 값이다.
이 범위 안의 값을 자주 사용되기 때문에, 이런 값들을 미리 캐싱해서 새로운 객체를 생성하는 대신, 동일한 객체를 재사용한다.
이를 통해 메모리 사용량을 줄인다.
기본 타입과 참조 타입 간의 변환을 쉽게 할 수 있지만 성능적인 측면에서 주의를 요한다.
https://f-lab.kr/insight/understanding-java-boxing-and-unboxing