본문 바로가기

C#(ASP.NET)

Boxing And Unboxing


■ 기본 개념
  - 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