Deff_Dev

[Unity/C#] 박싱, 언박싱 본문

Unity(유니티)/유니티 공부

[Unity/C#] 박싱, 언박싱

Deff_a 2024. 2. 24. 16:18

박싱과 언박싱에 대해 이해할려면 먼저 값 타입과 참조 타입에 대해 알고 있어야한다.

값 타입

  • 값 타입은 데이터를 스택(Stack)에 저장한다.
  • 값 타입에는 int, float, double, char등이 있다.
  • 각 변수들은 데이터 값을 직접 보유하고 있다.
	// 값 형식 변수 선언
	int x = 10;
	float y = 3.14f;

	// 값 형식 변수를 다른 변수에 할당하면 값이 복사
	int z = x;
	x = 20; // x의 값 변경

	Debug.Log(x); // 출력: 20
	Debug.Log(z); // 출력: 10 (z에는 이전에 복사된 값이 유지)

참조 타입

  • 참조 타입은 데이터를 힙(heap)에 저장하고, 스택에는 데이터에 대한 참조(주소)를 저장한다.
  • 참조 타입에는 class, interface, object, delegate 등이 있다.
  • 각 변수는 데이터를 가리키는 참조(주소)를 보유하고 있다.
public class MyClass
{
    public int Value;
}

// 참조 형식 변수 생성 및 초기화
MyClass obj1 = new MyClass();
obj1.Value = 10;

// 참조 형식 변수를 다른 변수에 할당하면 같은 객체를 가리키는 참조가 복사
MyClass obj2 = obj1;
obj1.Value = 20; // obj1이 가리키는 객체의 속성 변경

Debug.Log(obj1.Value); // 출력: 20 (객체를 공유하므로 obj1과 obj2는 같은 객체를 참조)
Debug.Log(obj2.Value); // 출력: 20

박싱, 언박싱

박싱과 언박싱은 값 타입과 참조 타입 간의 변환을 말한다.

박싱

  • 박싱은 값 타입을 참조 타입으로 변환하는 과정이다.
  • 값 타입의 데이터를 힙(heap) 메모리에 할당하고, 그 데이터에 대한 참조를 가리키는 참조 형식으로 변환된다.
  • 박싱은 주로 object 형식에 값을 할당, 인터페이스를 통한 형식 변환 등의 상황에 발생한다.

언박싱

  • 언박싱은 참조 타입을 값 타입으로 변환하는 과정이다.
  • 참조 타입의 데이터에서 값을 추출하여 값 타입의 변수에 할당한다.
  • 언박싱은 주로 object 형식이나 인터페이스 형식에서 값을 추출할 때 발생한다.
int value = 42; // 값 형식 변수
object obj = value; // int를 object로 변환할 때 박싱이 발생

int newValue = (int)obj; // object를 int로 변환할 때 언박싱이 발생

박싱과 언박싱을 가급적 피해야하는 이유

  1. 성능저하 
    • 박싱과 언박싱은 데이터를 메모리의 다른 위치로 이동시키는 작업이므로 성능에 부정적인 영향을 미친다.
    • 추가적인 메모리 할당 및 해제 과정에서 힙에 가비지가 쌓여 가비지 컬렉션에 무리를 줄 수 있는 작업이다.
  2. 가독성 저하
    • 코드의 어떤 지점에서 박싱이 발생하고, 어떤 데이터가 언박싱되는지 파악하기 어려울 수 있기 때문에 이는 가독성을 저하시킬 수 있다.
  3. 메모리 오버헤드
    • 박싱된 데이터는 힙(heap) 메모리에 저장되므로 메모리 오버헤드가 발생할 수 있습니다.

 

따라서 박싱과 언박싱의 사용을 최소화하고,

대신 제네릭 클래스를 사용하여 코드의 유연성과 안정성을 높이는 방법이 있다.