본문 바로가기
Education/Bit 18th

Boxing과 unBoxing

by ★용호★ 2009. 9. 20.

이번 강좌는 BoxingUnBoxing에 대한 설명인데요...

 

원래는 이 부분이 데이터 형 변환 쪽에 들어가야 하는데 혹시... 데이터 형 변환 강좌를 보지 않고

 

넘어가시는 분들도 있겠다 싶어 따로 뺐습니다. 양은 많지 않지만 중요한 부분이라서요...

 

그렇다고 완전하게 이해하고 외울 필요는 없구요. 간단하게 용어를 알고 의미를 아시면 되겠습니

 

다.

 

설명을 시작하지요... "마리상.. 요이... 스따또~!! " ^^;

 

박싱과 언박싱 이것 역시 간단하게 먼저 정의를 하지요...

 

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된

 

데이터에 맞는 형으로 형변환을 해 주어야 합니다.

 

지금까지 Boxing과 UnBoxing에 대해서 알아 보았습니다. 이 기법이 많은 장점이 있다고

 

하나 마리는 아직 초보인지라... 상세하가 알지는 못하네요. 차츰 실력이 늘어가면서

 

성능면에서 심각한 고민을 할 때 자연스레 생각하게 된다니...기다려 볼 수 밖에

 

여러분도 의미 정도만 알고 넘어가는 시간이 되었음 합니다. ^^;

'Education > Bit 18th' 카테고리의 다른 글

중첩 클래스...  (0) 2009.09.22
선문비트 프로그램 - 첫째날 -  (0) 2009.09.21
If와 Switch  (0) 2009.09.19
const와 readonly  (0) 2009.09.19
Boxing & Unboxing  (0) 2009.09.19

댓글