Programming and my thoughts

Boxing, Unboxing 은 공부할 때 처음에 많이 나오는 주제인데...

막상 정의해보려고 하면... 깜깜한 경우가 ㅎㅎ 있어서 여기에 정리해두고자 한다.


1
2
3
4
5
6
int i = 123;
// boxing, the following line boxes i.
object o = i;  
 
= 123;
= (int)o;  // unboxing
cs


Boxing 과 Unboxing 에 대한 예제는 위 하나로 충분하다.

단, 아래 그림을 이해하는 것이 필수적이다.



이 그림은


1
2
3
int i = 123;
// Boxing copies the value of i into object o.
object o = i;  
cs


위 과정을 표현한 것이다.


i 는 value-type 이고... o 는 object-type 인데... 값 복사가 발생한다. 

i 는 stack 영역에 있고...

o 의 메모리 포인터 자체는 stack 영역에 있으나... 이 메모리 포인터가 가리키는 대상은 heap 영역의 int 값 123 을 가리키게 된다.


위 상태에서...


o = 456 을 하면 당연히 i 는 123 에서 안 바뀌고... o 만 456 이 된다.

정확히 표현하면... o 가 가리키고 있는 heap 영역의 int 값을 456 으로 바꾸는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Small { public int SMALL = 10; }
class Big : Small { public int BIG = 20; } 
 
var s = new Small();
Console.WriteLine(s.SMALL); // 10
 
var b = new Big();
Console.WriteLine(b.BIG); // 20
 
Small s2 = b;
Console.WriteLine(((Big)s2).BIG); // 20
 
Small s3 = s;
Console.WriteLine(((Big)s3).BIG); // InvalidCastException
cs


출처 : https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing