박싱과 언박싱이 일어나는 과정을 메모리 관점에서 설명해주세요.
한 줄 요약
박싱 : 값 형식 데이터의 복사본을 힙 영역에 새로 생성된 object나 인터페이스 타입 객체에 담는 과정.
언박싱 : 힙의 박싱된 객체에서 값 형식 데이터를 꺼내 스택의 값 형식 변수에 복사하는 과정.
(이 과정에서 힙 메모리 할당 및 해제 비용이 발생합니다.)
박싱
- 값 형식 변수를 참조 형식 변수에 담아, 박싱된 변수를 복사할 경우에는 얕은 복사가 발생해 같은 메모리 주소를 참조하게 됨
사용예시
int i = 123;
// The following line boxes i.
object o = i;
언박싱
- 참조 형식 변수를 다시 값 형식으로 바꾸는 것, 값 형식으로 언박싱된 변수를 복사할 때는 깊은 복사가 발생해 실제 값의 복사본을 저장하게 됨
사용예시
o = 123;
i = (int)o; // unboxing
메모리에 미치는 영향
- 박싱과 언박싱 자체는 계산에 비용이 많이 요구되는 과정
- 값 형식이 박싱 될 때 완전히 새로운 객체를 힙 영역에 만들고 이후 사용할 때 해당 메모리 주소를 할당해야하므로 1차적으로 비용이 요구되고, 다시 언박싱 할 때는 힙 영역에 해당 주소를 해제해야 하므로 다시 비용이 요구되는 과정임
- 따라서 선언하는 변수가 참조 형식이어야 할지, 값 형식이어야 할지에 대하여 선언할 때부터 결정이 필요함
Ex) System.Collections.ArrayList 를 사용하는데 자주 박싱이 발생해야함
-> System.Collections.Generic.List<T>과 같은 제네릭 콜렉션을 사용