아디봉의.net

c# 박싱과 언박싱 본문

C#/C# 객체지향

c# 박싱과 언박싱

아디봉 2012. 9. 27. 17:50

c#에서는 서로 성질이 다른 데이터 타입인 값타입과 참조타입을 두고 있다.

그리고 값타입과 참조타입이 서로 공존하기때문에 문제가 발생한다. 예를 들어 함수의 매개변수를 Object 형으로 했다면 참조타입으로 지정한것이다. Object 형은 모든 클래스의 최상위의 형이기 때문에 업캐스팅의 원리에 의해서 모든 객체는 Object형으로 형변환될 수 있다.

 

public class Top{

public static void say(Object obj){

//...

}

}

 

Top.Say(new Object());

Top.Say("Hello");

Top.Say(3);

 

Boxing : 값타입을 참조타입으로 변환하는 기법

UnBoxing : 참조타입을 값타입으로 변환하는 기법

 

Boxing

Boxing 을 하는 기본적인 방법은 값타입을 객체화 하기 위한 메모리를 힙에 생성한 후 값타입에 들어있는 값을 복사하는 것이다.

 

using System;

class Boxing Test1 {

public static void Main(){

int p = 123;

object o = p;

Console.WriteLine(o);

}

}

 

123

 

값타입의 값을 object obj에 담기 위해 제일 먼저 힙 영역에 박스라는 것을 만듬

그리고 생성한 이박스에 값을 복사해서 넣어주면 모든 변환이 끝남

새로 생성된 참조값은 o가 가지게 된다.

 

UnBoxing

Boxing 된 참조타입을 다시 값타입으로 변환하는 것을 말함. boxing의 반대되는 개념이다.

 

Boxing 의 순서

- 해당 객체가 지정한 값타입을 Boxing 한 값인지 확인

- Boxing 된 객체라면 객체의 값을 값타입 변수에 복사한다.

- Boxing 된 메모리와 UnBoxing한 메모리 두개가 존재한다.

 

일단 unboxing 하려면 참조타입 객체가 Boxing 된 것인지를 확인한다. 확인이 되면 값타입의 메모리에 값만을 복사하게 된다.

이때 값타입의 메모리와 힙에 있는 메모리는 전혀 별개의 메모리이다. 즉 unboxing 된 것과 boxing 된 것은 전혀 별개의 메모리라는 것이다(중요)

 

using System;

class UnBoxingTes1{

public static void Main(){

int p = 123;

object o = p; //boxing  - 참조타입으로 변함

int j = (int) o; //unboxing 명시적 캐스팅 - 값타입으로 변함

Console.WriteLine("j = " + j);

Console.WriteLine("p =" + p);

Console.WriteLine("o =" + o);

 

}

}

 

j =123, p=123, o = 123

 

unboxing 은 반드시 명시적으로 이루어지며, boxing된 변수의 공간과는 별도에 메모리 공간에 값이 저장됨

지정한 값타입의 unboxing 변환이 런타임에 성공적으로 수행하려면 boxing 된 object  o값을 값타입의 변수에 할당하면된다.

이때 반드시 명시적으로 boxing 된 데이터 타입에 맞는 형으로  형변환해줘야 한다.

 

 

구조체의 Boxing 과 클래스의 형변환

 

 

'C# > C# 객체지향' 카테고리의 다른 글

추상클래스와 추상함수  (0) 2012.09.26
생성자를 호출하는 THIS() , BASE()  (0) 2012.09.26
c#객체지향 생성자(Constructor)  (0) 2012.09.25
C# 상속  (0) 2012.09.20
C# 오버로딩(overloading)  (0) 2012.09.20