c# 박싱, 언박싱이 무거운 이유

개발자 이야기

c# 박싱, 언박싱이 무거운 이유

kilius 2023. 3. 24. 18:43
728x90
반응형

C#에서 boxing 및 unboxing은 값 형식을 참조 형식으로 변환하거나 참조 형식에서 변환하는 것과 관련된 작업입니다.


박싱은 값 유형(예: 정수 또는 부울)을 참조 유형(예: 객체)으로 변환하는 프로세스입니다. 이는 ArrayList 또는 객체 유형의 변수와 같은 참조 유형이 필요한 위치에 값 유형을 저장해야 하는 경우에 필요합니다. Boxing은 힙에 새 개체를 만들고 값 유형의 값을 개체에 복사합니다.

int i = 42;
object o = i; // boxing


이 예에서 정수 값 42는 힙의 새 개체에 박싱되고 해당 개체에 대한 참조는 변수 'o'에 저장됩니다.


언박싱은 참조 유형을 다시 값 유형으로 변환하는 프로세스입니다. 이전에 박싱된 개체에서 원래 값을 추출해야 하는 경우에 필요합니다. Unboxing에는 힙에 있는 개체의 값을 스택에 있는 값 유형 변수로 다시 복사하는 작업이 포함됩니다. 

object o = 42;
int i = (int)o; // unboxing


이 예에서는 박스형 정수 값 42가 언박싱되어 정수 변수 'i'로 다시 복사됩니다.

 

boxing 및 unboxing은 힙에 새 개체를 만드는 작업을 포함하기 때문에 메모리 사용량 측면에서 비용이 많이 들 수 있습니다.


값 유형을 박싱하면 런타임은 값을 저장하기 위해 힙에 새 개체를 만듭니다. 이 개체는 메모리 할당이 필요하며 결국 가비지 수집될 때까지 힙에 남아 있습니다. 또한 값 유형이 박싱될 때마다 새 개체가 생성되어 자주 발생하는 경우 상당한 양의 메모리 사용량이 추가될 수 있습니다.


값 유형을 언박싱할 때 런타임은 힙에 있는 개체의 값을 스택의 값 유형 변수로 다시 복사해야 합니다. 여기에는 추가 메모리 복사 작업이 포함되며 이는 성능 측면에서도 비용이 많이 들 수 있습니다.


일반적으로 가능하면 boxing 및 unboxing을 피하고 대신 값 유형 및 제네릭을 사용하는 것이 가장 좋습니다. 값 유형은 스택에 할당되므로 힙에 개체를 할당하는 것보다 빠르고 메모리 효율적입니다. 제네릭은 boxing 및 unboxing 없이 형식이 안전한 컬렉션을 사용하는 방법을 제공하므로 메모리 사용량을 줄이고 성능을 향상하는 데 도움이 될 수 있습니다.

 

728x90
반응형