C#에서 boxing 및 unboxing은 값 형식과 참조 형식 사이를 변환하는 작업입니다.
Boxing은 값 유형(예: 정수 또는 부울)을 참조 유형(예: 객체)으로 변환합니다. 이는 참조 유형이 예상되는 값 유형을 저장해야 할 때 필요합니다. B. 객체 유형의 ArrayList 또는 변수. Boxing은 힙에 새 개체를 만들고 값 유형의 값을 개체에 복사합니다.
int i = 42;
object o = i; // boxing
이 예에서 정수 값 42는 힙의 새 개체에 박싱되고 해당 개체에 대한 참조는 변수 “o”에 저장됩니다.
언박싱할 때 참조 유형은 값 유형으로 다시 변환됩니다. 이전에 래핑된 개체에서 원래 값을 추출해야 하는 경우에 필요합니다. 언박싱하는 동안 힙에 있는 객체의 값이 스택의 값 유형 변수에 다시 복사됩니다.
object o = 42;
int i = (int)o; // unboxing
이 예에서 박스형 정수 값 42는 압축을 풀고 정수 변수 “i”로 다시 복사됩니다.
boxing 및 unboxing은 힙에 새 개체를 생성하는 작업을 포함하기 때문에 메모리 사용 측면에서 비용이 많이 들 수 있습니다.
값 유형을 래핑하면 런타임이 값을 저장하기 위해 힙에 새 객체를 생성합니다. 이 객체는 메모리 부여가 필요하며 결국 가비지 수집될 때까지 힙에 남아 있습니다. 또한 값 유형이 박싱될 때마다 새 개체가 생성되므로 자주 발생하면 상당한 메모리 사용량이 발생할 수 있습니다.
값 유형을 언박싱할 때 런타임은 힙에 있는 객체의 값을 스택의 값 유형 변수로 다시 복사해야 합니다. 여기에는 추가 메모리 복사 작업이 포함되며 성능 측면에서도 비용이 많이 들 수 있습니다.
일반적으로 가능하면 boxing 및 unboxing을 피하고 대신 값 유형과 제네릭을 사용하는 것이 가장 좋습니다. 값 유형은 스택에 할당되므로 힙에 개체를 할당하는 것보다 빠르고 메모리 효율적입니다. 제네릭은 boxing 및 unboxing 없이 형식이 안전한 컬렉션을 사용하는 방법을 제공하므로 메모리 사용량을 줄이고 성능을 향상시킬 수 있습니다.
