이전 포스팅에 컬렉션에 대해 적으면서 '박싱과 언박싱'으로 인한 성능저하문제가 발생한다고 얘기한적이 있는데요,그래서 이번에는 박싱과 언박싱에 대해서 적어보겠습니다.
C#에서
object형식은 참조 형식이기 때문에 힙에 데이터를 할당합니다. 그리고 int나 double형식은 값 형식이기 때문에 스택에 데이터가 할당이 되지요.
그런데 저희는 컬렉션에서 데이터를 삽입하는 함수의 인자 타입이 object형식의 타입이였습니다. 여기에 값 형식 데이터를 삽입했었죠.
이 경우에는 어느 메모리에 데이터가 할당이 되는 걸까요?
Object형식은
값 형식의 데이터를 힙에 할당하기 위한 '박싱(Boxing)'기능을 제공합니다. Object형식에 값 형식의 데이터를 할당하려고 하면, object형식은 박싱을 통해
값 형식 데이터를 힙에 할당합니다.
1
|
Object a = 20;
| cs |
위 코드는 정수형 20이 힙에 할당되고, a는 할당된 힙의 주소를 참조하고있는 형태입니다. 간단하게 그림으로 표현하자며 아래와 같습니다.
반대로 힙에 있던 값 형식 데이터를 값 형식 객체에 다시 할당해야 하는 경우도 있겠죠,
1
2
|
Object a = 20;
Int b = (int)a;
| cs |
A 변수가 참조하고 있는 메모리로부터 값을 복사하여 b에 저장하는 과정입니다. 이 때 박싱되어 있는 값을 꺼내 값 형식 변수에 저장하는 과정을 '언박싱(UnBoxing)' 이라고 합니다.