1 min to read
C# boxing unboxing
Boxing
: 값 형식을 Object 형식으로 변환하는 것을 얘기한다.
-
값 형식은 Stack에 저장이 되지만 Boxing이 일어나게 되면 새로운 객체가 Heap 영역에 생성이 된다.
-
Stack에 변수 i가 저장이 되어있고, Boxing이 일어나면서 Heap에 i의 123값이 저장되고 Stack에는 Heap - i 의 주소를 갖고 있는 o가 Stack에 저장된다.
- Boxing이 된 상태에서 i값을 변경하더라도 o의 값은 변경이 되지 않기 때문에 주의할 필요가 있다.
- 결과)
- Boxing이 일어나면 새로운 객체를 Heap에 할당하기 때문에 i의 주소를 참조하고 있지 않는다.
Unboxing
: Object형식에서 값 형식으로 변환하는 것을 얘기하고 과정은 두 가지 절차를 거친다.
-
개체 인스턴스가 지정한 값 형식을 Boxing한 값인지 확인
-
인스턴스의 값을 값 형식 변수에 복사
- int를 Boxing한 객체를 다시 Unboxing을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하면 오류가 발생한다(InvaildCaseException)
MSDN에서 얘기 해주는 boxing과 unboxing에 성능에 대한 얘기
This can take up to 20 times longer than a simple reference assignment.
When unboxing, the casting process can take four times as long as an assignment.
(박싱을 하면 단순히 참조에 할당하는 것보다 20배까지 시간이 소모되며, 언박싱은 할당에 4배정도 소모된다.)
저장되는 공간이 다르고 불필요한 형변환이 이루어져서 그런 것 같다.