프로그래밍/C#

[C#] 박싱 & 언박싱 (Boxing & UnBoxing)

QA Engineer - P군 2016. 9. 25. 21:29
반응형

박싱 & 언박싱 (Boxing & UnBoxing)

 박싱 (Boxing)   - 값(Value) 타입을 참조 (Reference) 타입으로 변환합니다.
 언박싱(UnBoxing)  - 참조 (Reference) 타입을 값(Value) 타입으로 변환합니다.

 

박싱 (Boxing)

 

박싱이란 쉽게 힙 메모리에 박스를 하나 만들고 거기에 값을 복사해서 넣는 것 입니다.

(박싱이라니..빡싱이라고 해야 발음이 올바르지 않을까?...ㅋ)

여기서 number라는 변수를 num이라는 object로 박싱을 하게 되는 과정입니다.

1
2
3
4
5
6
7
8
9
10
11
 static void Main(string[] args)
        {
 
            int i= 100;
            object o = i; //Boxing
 
            i= 123;
 
            Console.WriteLine(i);
            Console.WriteLine(o);
        }
cs


[결과]

[출처 - MSDN ]

 

여기서 보면 num이라는 오브잭트에 number의 값인 123을 박싱했을때의 값인 123을 힙 메모리에 박싱하고 그 힙을 가리키고 있습니다.

즉, 이미 박싱이 된 시점에서 그 값을 복사한 곳을 가리키기 때문에 박싱한 i를 수정해도 o 라는 박싱된 값이 변경되지 않습니다.

 

언박싱 (Unboxing)

1
2
3
4
5
6
7
8
9
10
11
 static void Main(string[] args)
        {
 
            int i = 123;
 
            object o = i; //Boxing
 
            int j = (int)o; //Unboxing
 
            Console.WriteLine(j);            
        }
cs

 

[결과]

 

 

 

 

박싱과 반대되는 개념으로 위에서 박싱한 o가 가리키는 힙 메모리에 값을 j에 복사해서 넣습니다.

이때 값 형식에 따라 캐스팅을 해주어야 합니다.

 

박싱과 언박싱에는 많은 비용이 소비 됩니다.
[MSDN - 참고]“boxing 및 unboxing 과정에는 많은 처리 작업이 필요합니다. 값 형식을 boxing할 때는 완전히 새로운 개체가 

만들어져야 하며, 이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸립니다. unboxing을 할 때는 캐스팅 과정에 할당 작업보다 4배의 시간이 걸릴 수 있습니다”


그래서 제너릭을 사용하여 박싱과 언박싱이 일어나지 않게 하는 것이 좋습니다.

 

[참고]

Boxing and Unboxing (C# Programming Guide) (MSDN) - https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

반응형