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)' 이라고 합니다.