Boxing이란 Value-Type을 Reference-Type(Object형) 으로 변환하는 것을 의미하구요.
UnBoxing이란 Boxing을 반대 개념입니다.
감이 잘 안오시죠... 예제를 보겠습니다. 아...차~ 모든 데이터 형식은 Object형의 자식이다,
Value-Type은 스택에 Reference-Type은 Heap에 생성됩니다.
int p = 123;
object o;
o = p; //명시적 변환으로 (object)p로 해도 무방...
이런 구문이 있다고 한다면... 값 타입인 변수 p의 값을 참조 타입인 변수 o에 넣습니다.
이때 바로 Boxing이 일어납니다. 반대로 p = (int) o; 이렇게 하면 UnBoxing이 일어나구요.
만약에 값 타입 변수를 개체처럼 사용하고 싶다고 하는데요. 이는 가만히 두고만 봐서는 방법이 없습니다. 왜? 개체처럼 사용하려면 Stack이 아닌 Heap에 자리를 잡고 앉아 있어야 하거든요.
그래서 Boxing을 해서 Stack의 값을 Heap영역에 복사를 해놓고 변수는 Heap영역에 복사된 값을 참조 하게 됩니다. 그림을 보도록 하겠습니다.
그림으로 표현을 해봤습니다. 그림처럼 Boxing이 일어나면 Value-Type의 값을 Heap에 복사를 하고 Reference-Type인 o는 Heap영역의 값을 참조하게 됩니다. 값이 복사된 것이니까 p의 값을 변경해도 o는 변하지 않겠죠? UnBoxing은 이와 반대인데 반드시 UnBoxing은 명시적으로 형 변환을 해줘야 합니다. 그럼 Heap영역에 있는 값이 Value-Type의 변수에 복사가 됩니다.
마지막으로 테스트 예제를 보도록 하겠습니다.
using System;
public class Class1
{
public static void Main()
{
int p = 123;
object o = p; // Boxing
try
{
int j = (short) o; //에러 발생-잘못된 형변환
Console.WriteLine("UnBoxing 되었습니다.");
}
catch (InvalidCastException e)
{
Console.WriteLine("형 변환이 잘못 되었습니다.");
}
}
}
위의 예제처럼 형 변환이 잘못 되면 예외를 발생하게 됩니다. 반드시 명시적으로 Boxing된 데이터에 맞는 형으로 형변환을 해 주어야 합니다.
댓글