Deff_Dev
[Unity/C#] 박싱, 언박싱 본문
박싱과 언박싱에 대해 이해할려면 먼저 값 타입과 참조 타입에 대해 알고 있어야한다.
값 타입
- 값 타입은 데이터를 스택(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로 변환할 때 언박싱이 발생
박싱과 언박싱을 가급적 피해야하는 이유
- 성능저하
- 박싱과 언박싱은 데이터를 메모리의 다른 위치로 이동시키는 작업이므로 성능에 부정적인 영향을 미친다.
- 추가적인 메모리 할당 및 해제 과정에서 힙에 가비지가 쌓여 가비지 컬렉션에 무리를 줄 수 있는 작업이다.
- 가독성 저하
- 코드의 어떤 지점에서 박싱이 발생하고, 어떤 데이터가 언박싱되는지 파악하기 어려울 수 있기 때문에 이는 가독성을 저하시킬 수 있다.
- 메모리 오버헤드
- 박싱된 데이터는 힙(heap) 메모리에 저장되므로 메모리 오버헤드가 발생할 수 있습니다.
따라서 박싱과 언박싱의 사용을 최소화하고,
대신 제네릭 클래스를 사용하여 코드의 유연성과 안정성을 높이는 방법이 있다.
'Unity(유니티) > 유니티 공부' 카테고리의 다른 글
[Unity/C#] 데이터 형 변환 (0) | 2024.03.04 |
---|---|
[Unity/C#] 변수 (0) | 2024.02.25 |
[Unity/C#] 유니티 이벤트 함수 (0) | 2024.02.24 |
[Unity/C#] 생명주기와 yield return 호출 순서 (0) | 2024.02.22 |
[Unity/C#] RigidBody의 AddForce와 AddRelativeForce 차이점 (0) | 2023.11.14 |