EveryDay.DevUp

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

C#

[Unity] C# Boxing , unboxing ( 박싱, 언박싱 )

EveryDay.DevUp 2020. 5. 31. 09:09

● Boxing, Unboxing 의 정의

Boxing ( 박싱 ) : 값 형식을 참조 형식으로 변환하는 것을 말한다. boxing은 암시적으로 발생한다.

( 예를 들어 int, float 를 object 로 변환하는 것을 말하는데 이 과정에서 단순 참조의 20배에 해당 하는 오버헤드와 메모리의 추가 사용이 발생합니다. )

int test = 100;
object tetsObj = test;

UnBoxing ( 언박싱 ) : 참조 형식을 값 형식으로 변환하는 것을 말한다. Unboxing은 명시적으로 발생한다.

( 예를 들어 object를 int, float로 변환하는 것을 말하는데 이 과정에서 일반적인 할당의 4배에 달하는 시간이 소요된다. )

int test = 100;
object testObj = test;
int i = (int)test;

● Boxing, Unboxing 이 사용되는 경우

void foo( int a ){}
void foo( int a, int b ) {}
void foo( int a, int b, int c ) {}

void foo(params object[] values) {}

▶ 동일한 함수이지만 인자의 개수가 유동적인 경우 params object[]를 사용하게 되는데 이때도 boxing이 발생한다;.

int a = 100;
Debug.Log( a );

public class Debug {
	public static void Log(object message)
}

▶ 인자 타입이 object인 함수의 경우에도 사용 시에 boxing이 발생한다.

public enum STATE
{
	A = 1,
	B = 2,
}

private void Start()
{
	STATE a = STATE.A;
	STATE b = STATE.B;
		
	// Enum 비교 시 a, b가 boxing이 발생한다
	if( a.Equals( b ) ){}

	int ia = 1;
	int ib = 2;
	
	// 단순 enum 비교로 boxing이 발생하지 않는다
	if( ia.Equals( ib ) ){}
}

▶ 사람의 입장에서는 enum으로 값을 비교하는 것과 int로 값을 비교하는 것에는 차이가 없어 보이지만 enum을 .Equals 로 비교하게 되면 내부적으로 object 비교가 발생하여 boxing이 발생한다.

boxing은 암시적으로 사용되고 있기 때문에 주의 깊게 생각하고 사용하지 않으면 생각보다 많은 곳에서 발생하게 된다. 꼭 필요한 곳에서 사용하는 것은 어쩔 수 없지만, 불필요한 곳에서 사용하게 되는 경우 성능 저하를 발생 시키기 때문에 유의해야한다.

참고 자료 : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/boxing-and-unboxing

 

Boxing 및 Unboxing - C# 프로그래밍 가이드

Boxing 및 Unboxing(C# 프로그래밍 가이드)Boxing and Unboxing (C# Programming Guide) 이 문서의 내용 --> Boxing은 값 형식을 object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 프로세��

docs.microsoft.com

 

'C#' 카테고리의 다른 글

[Unity] Struct (구조체)  (0) 2021.12.23
[Unity] Namespace ( 네임 스페이스 )  (0) 2020.06.16
[Unity] C# 주석  (0) 2020.05.31
[Unity] C# 코딩 규칙  (0) 2020.05.01
[Unity] C#에서의 메모리  (0) 2020.04.27