일반적으로 Boxing과 UnBoxing에 대해 잘 몰라도 개발은 가능하지만, 메모리의 관리가 필요하다면 필수적으로 알아두면 좋을 내용이다.
자 그럼, Boxing과 UnBoxing에 대해 알아보자. 🤔
Boxing
Boxing(박싱)이란 아래와 같이 값 형식을 Object형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것이다. 기존에 저장된 Stack 영역에서 Heap 영역에 값 형식을 저장한다.
int i = 123;
object o = i;
위의 코드를 보면, int 값 형식을 Object 참조 형식으로 형변환을 시도한다. 보통 파라미터로 전달되거나, List<Object> 형식으로 모든 값들을 입력받고자 할 때, 사용 될 수 있다.
위의 코드의 메모리 할당은 아래와 같이 이루어 진다.
Stack 영역에 있는 i 값이 o로 변환되면서, Heap 영역에 object 형식으로 선언되고, 값이 복사 된다. o는 Stack 영역에 존재하며 Boxed된 i의 주소 값을 가지고 있고, 보통 Boxing은 암시적으로 되며, 명시적으로도 가능하다.
UnBoxing
UnBoxing(언박싱)이란 아래와 같이 Object 형식에서 값 형식으로, 또는 인터페이스 형식에서 해당 인터페이스를 구현한 값 형식으로 변환한 것이다.
int i = 123; // value type
object o = i; // boxing
int j = (int)o; // unboxing
위의 그림과 같이 int를 Boxing한 o의 객체를 다시 int 타입의 j 값에 넣고 있다. UnBoxing 시 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하려하면 오류(InvalidCastException)가 발생한다.
따라서, 미리 같은 타입인지 먼저 확인하는 절차가 필요하다.
Boxing과 UnBoxing의 성능
MSDN의 설명에 따르면
This can take up to 20 times longer than a simple reference assignment. When unboxing, the casting process can take four times as long as an assignment.
- 박싱을 하면 단순 참조에 할당하는 것보다 20배까지의 시간이 소모되며, 언박싱은 할당에 4배정도 소모된다.
위의 설명처럼 Boxing과 UnBoxing에는 많은 시간이 소모되므로, 되도록이면 제네릭을 사용하여 Boxing과 UnBoxing이 일어나지 않도록 구성하는 것이 좋아보인다.
만약 어쩔 수 없이 사용해야 한다면 타입에 맞는 캐스팅으로 오류 없이 처리하자!
'🪟C# | .NET' 카테고리의 다른 글
[C#] Hashtable vs Dictionary (0) | 2023.06.23 |
---|