C# ] 박싱(Boxing)과 언박싱(Unboxing)
이번 포스팅에서는 박싱과 언박싱에 대한 개념에 대해 알아보겠습니다. 먼저 박싱과 언박싱을 이해하기 위해서 값 타입과 참조 타입에 대한 이해가 필요합니다.
본 포스팅은 다음 순으로 작성되었습니다.
1. 값 타입 (Value Type)
2. 참조 타입 (Reference Type)
3. 박싱 (Boxing)
4. 언박싱 (Unboxing)
1. 값 타입 (Value Type)
우선, 값 타입은 Object를 상속받은 System.ValueType을 상속받은 구조체이며, 스택영역에 저장됩니다. (int, char, ... 등등) 데이터에 직접 값이 저장됩니다.
2. 참조 타입 (Reference Type)
참조 타입은 모든 타입의 base class인 System.Object를 상속받으며, 힙 영역에 저장됩니다. 데이터에 값이 저장되지 않고 해당 데이터의 참조 값이 저장됩니다.
Class A {}
A a = null;
참조 타입은 처음 변수를 선언하면 값 타입과 다르게 메모리가 생성되지 않습니다.
A a = new A();
실제 생성된 A는 힙에 메모리를 할당받고, a는 그 값에 대한 참조를 스택에 저장합니다.
A aa = a;
새로운 메모리를 할당하지 않고, 참조하는 값을 복사합니다.
3. 박싱 (Boxing)
int i = 123;
object o = i // 박싱
값 형식을 Object의 형태인 참조 형식으로 변환하는 작업을 박싱이라고 합니다.
박싱 과정에서 스택에 있는 데이터가 힙으로 복사되는 작업이 이루어집니다. 힙에 복사된 영역을 참조 타입이 가리키게 됩니다.
4. 언박싱 (Unboxing)
int i = 123; // 값 타입
object o = i; // 박싱
int j = (int)o; // 언박싱
참조 타입을 값 타입으로 변환하는 작업을 언박싱이라고 합니다.
언박싱 과정에서 힙에 있던 데이터를 스택으로 복사하는 작업이 이루어집니다.
박싱과 언박싱은 사용상의 편의성과 타입에 관계없이 사용 가능하다는 장점이 있지만, 많은 시간과 리소스가 소요되므로 가급적 사용하지 않고, 제네릭을 사용하여 처리하는 것이 바람직합니다. 박싱할때는 완전히 새로운 개체를 만들어야 하며, 이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸린다고 합니다. 언박싱할때는 캐스팅 과정에서 할당 작업보다 4배의 시간이 걸립니다.
만약, 어쩔수 없이 박싱과 언박싱을 사용해야하는 상황이라면 is 캐스팅을 통하여 오류 없이 처리하는 과정이 필요합니다.
이렇게 박싱(Boxing)과 언박싱(Unboxing)에 대해 알아보았습니다.
짠!
참고 : https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/boxing-and-unboxing