Post List

2018/01/16

C#__6.0 박싱(Boxing)과 언박싱(UnBoxing)

이전 포스팅에 컬렉션에 대해 적으면서 '박싱과 언박싱'으로 인한 성능저하문제가 발생한다고 얘기한적이 있는데요,그래서 이번에는 박싱과 언박싱에 대해서 적어보겠습니다.
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)' 이라고 합니다.