■ 기본 개념
- Boxing : Value Type(Int, float, struct 등)을 Reference Type(Object) 으로 Cast 하는 것
- Unboxing : Reference Type을 Value Type으로 Cast 하는 것
■ 동작원리
기본적으로 Value Type의 경우 stack에 할당되고 Reference Type의 경우 heap 상에 할당이 되는데
Value Type(Primitive Value Type 포함) Define시 동일한 field를 가지는 Hidden Class(Boxed Class) 가
heap 상에 생성이 된다.
Boxing 작업이 필요할 경우 해당 Hidden Class의 instance가 instantiated 및 initialized 되면서 value type의
모든 data가 reference type 인 hidden class에 값이 복사되고 이 클래스를 참고하게되면서 boxing이 완료된다.
Unboxing 시에는 반대의 과정을 생각해 보면 된다.
이미 value type 과 연관된 hidden class가 생성이 되어 있기 때문에 unboxing은 명시적으로 진행해야 하며,
type이 다를 경우에 InvalidCastException이 발생할 수 있다.
또, 같은 이유로 boxed 된 값들만이 unboxing이 가능하다.
■ Generic과 관련된 사항(Boxing Performance Issue)
간단한 예를 들어 보자.
Collection의 ArrayList Class를 이용했을 때,
ArrayList list = new ArrayList();
for (int i = 0; i < 100; i++)
list.Add(i); // Boxing
foreach (int value in list)
Console.WriteLine(value); // Unboxing
Generic의 List<T> Class를 이용했을 때,
List<int> list = new List<int>();
for (int i = 0; i < 100; i++)
list.Add(i);
foreach (int value in list)
Console.WriteLine(value);
간단한 예라서 실제 느껴지는 성능 차이가 없을지도 모르지만,
boxing 100번, unboxing 100번의 연산이 이루어지는 경우와 그렇지 않은 경우는 성능 차이가 날 수 밖에 없다.
이게 100번이 아니라 천만 단위로 또는 억단위로 이루어졌을 때는 어떨까??
Boxing과 Unboxing은 쉽게 사용 가능하지만 많은 item을 가진 iterating에 있어서 커다란 성능 손실이 발생할 수 있다는 것을 명심해야 한다.
[출처] http://alucinor.tistory.com/24