[유니티 C#] 박싱과 언박싱

YongSeok·2022년 8월 11일
0

📌 박싱과 언박싱

  • Boxing : 값 형식을 object 형식으로 변환하는 프로세스, 암시적
  • Unboxing : object 형식에서 값 형식으로 변환하는 프로세스, 명시적

Boxing은 값을 내부에 래핑하고 힙에 저장
값형식은 값이 직접 스택에 저장
값형식의 값을 Boxing하면 래핑해서 힙에 저장


Boxing

int i = 123;
object obj = i;				// 암시적 박싱
object obj = (object)i;		// 명시적 박싱


Unboxing

int i = 123;			// 갑 형식
object obj = i;			// 암시적 박싱
int j = (int)obj;		// 명시적 언박싱

이는 단순 참조 할당보다 최대 20배 더 오래 걸릴 수 있으며
언박싱할 때 캐스팅 프로세스는 할당보다 4배 더 오래 걸릴 수 있다


메모리에 저장되는 과정

[1] 선언된 정수형 변수 i의 값 123이 스택에 저장

public class BoxingUnboxing : MonoBehaviour
{
    void Start()
    {
        int i = 123; 	// [1]
    }
}




[2] 선언된 object형 변수 obj가 스택메모리에 할당

public class BoxingUnboxing : MonoBehaviour
{
    void Start()
    {
        int i = 123; 	// [1]
        object obj;		// [2]
    }
}




[3] obj변수에 i값을 할당 (박싱)

public class BoxingUnboxing : MonoBehaviour
{
    void Start()
    {
        int i = 123; 	// [1]
        object obj;		// [2]
        obj = i;        // [3]
    }
}

obj 변수는 값을 래핑하여 힙 메모리에 저장
obj 변수는 값이 있는 힙 메모리 주소의 값을 참조
정수형 변수 i의 값이 암시적으로 박싱 된 모습




[4] 정수형 변수j에 obj변수의 값을 할당

public class BoxingUnboxing : MonoBehaviour
{
    void Start()
    {
        int i = 123; 		// [1] 값형식
        object obj;			// [2] 참조형식
        obj = i;        	// [3] 암시적 박싱
        int j = (int)obj;	// [4] 명시적 언박싱
        					// 언박싱은 명시적이여야 한다
    }
}

변수 j 가 스택 메모리에 할당된 모습
값형식은 스택에 직접 값이 저장된다

0개의 댓글