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 없이 형식이 안전한 컬렉션을 사용하는 방법을 제공하므로 메모리 사용량을 줄이고 성능을 향상하는 데 도움이 될 수 있습니다.
'개발자 이야기' 카테고리의 다른 글
피보나치 수열 함수 코딩, 뭐길래 자꾸 물어볼까요? (0) | 2023.03.28 |
---|---|
LINQ의 기능 살펴보기, C#에서 쉽게 데이터 변환 (0) | 2023.03.28 |
C# 지역변수 선언할때 'var'이 더 좋은 이유? (1) | 2023.03.24 |
c# using문 사용한 메모리 관리 (0) | 2023.03.24 |
gRPC와 Protobuf 사용한 네트워크 개발. (0) | 2023.03.24 |