박싱 & 언박싱 (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
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 람다식 (lambda) - 1 (0) | 2016.09.25 |
---|---|
[C#] 값 형식 & 참조형식 (Value Type & Reference Type) (0) | 2016.09.25 |
[C#] 대리자 (Delegate) - 델리게이트 (0) | 2016.09.25 |
[C#] 기본 - 네임 스페이스 , 메소드 (0) | 2016.04.05 |
[C#] 기본 - C++과 C# 의 다른 점 (1) | 2016.04.05 |