프로그래밍 언어/C#

C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값

ShovelingLife 2022. 6. 19. 16:17

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이 발생한다.

 

출처 : https://everyday-devup.tistory.com/64