센로그

[C#] Boxing(박싱), UnBoxing(언박싱) 본문

게임/Unity, C#

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

seeyoun 2023. 7. 4. 15:32

◆ Boxing

value type → reference type 으로 변환하는 것

스택 영역에 있는 데이터가 힙 영역으로 복사됨.

 


◆ UnBoxing

박싱했던 데이터를 원래 타입으로 되돌리는 것
즉, reference
type → value type 으로 변환하는 것

힙 영역에 있는 데이터가 스택 영역으로 복사됨.

 

※ 언박싱은 박싱 된 객체에 대해서만 가능하며, 참조가 끊기면 가비지가 됨!

 


◆ 이거 왜 씀?

C#에서, 모든 데이터 타입은 조상 타입인 object 타입으로부터 파생된다.

이말은 즉슨, 모든 타입이 object로 변환 가능하기 때문에, 아직 타입이 정해지지 않은 값들에 대해서 object로 선언하고 받아올 수 있다는 뜻. 그래서 템플릿 느낌으로 쓰기도 하고, 다양한 파라미터에 대한 메서드를 구현할 때 쓰이기도 했다.

(참고: https://learn.microsoft.com/ko-kr/dotnet/api/system.object?view=net-7.0)

 

또, 다음과 같이 다양한 타입을 담을 때 사용할 수도 있게 된다.

static void Main(string[] args)
{
    object[] oArray = new object[10];
    oArray[0] = "hi";	//박싱
    oArray[1] = 123;	//박싱
}

 

※ 참고
C#에서 모든 타입들의 조상에 object 타입이 존재한다. (즉, 모든 타입들은 object 타입에서 파생된다.)
따라서 모든 타입들은 object 클래스에 정의된 ToString(), Equals(), GetType(), GetHashCode(), ReferenceEquals() 메서드를 사용할 수 있다.

 


◆ 문제점

그러나 object 타입은 reference type이라는 게 문제가 된다.

위와 같은 작업을 수행하려면 value type의 데이터들을 reference type인 object로 boxing하게 된다.

 

 

value type이 reference type으로 바뀔 때(boxing), 스택에 있는 값을 복사해서 힙에 할당하게 된다. 

이는 단순 힙에 넣는 작업에 비해 20배나 많은 시간이 소요된다고 한다.

 

반대 과정인 unboxing 역시 4배 정도의 시간이 소요된다고 한다.

 

그러니까 boxing/unboxing은 꼭 필요할 때만 적당히 잘 쓰고

웬만한 건 제네릭 쓰자~

 

 

참고) object type 이외에도, 모든 value↔ reference 간의 변환을 boxing, unboxing 이라고 한다.

c#에서 데이터의 타입별로 다음과 같은 종류가 존재한다.

value type: int, byte, char, single, float, double, boolean, decimal, struct
reference type: String, Array, Object, Class, Interface, Delegate

얘네를 서로서로 변환하는 것을 boxing, unboxing 이라고 한다는 것~

Comments