이번에는 C#에서 Boxing과 Unboxing에 대한 개념을 알아보도록 하겠습니다. 우선 Boxing 의 반대되는 말이 Unboxing이고 Unboxing의 반대가 Boxing입니다. Boxing이라고 하면 박스로 어떤 것을 포장하는 혹은 감싸는 의미를 갖고 있는데요. 여기서 Type을 감싸는 것을 Boxing이라고 합니다. 또 Boxing되어 있는 Type을 푸는 것을 Unboxing이라고 합니다.
정확한 의미를 알아보기 전에 Boxing과 Unboxing에 대한 예제코드를 알아보도록 하겠습니다.
예제코드에 대해서 이야기를 하면 number 라는 int 타입의 변수를 object 타입으로 바꾸는 일을 Boxing이라고 부르고, object 타입을 int 타입으로 바꾸는 것을 Unboxing이라고 합니다. 일반적으로 C/C++에서 사용하던 casting과 비슷한 느낌을 갖고 있지만, 전혀 다른 동작을 하는 기능인데요.
설명을 하기전에 C# 에서 메모리가 어떻게 관리가 되는지 알고 있어야 하기 때문에 아래 포스팅을 참고해서 스택과 힙 영역에 대한 개념을 잡아야 합니다.
https://tip1234.tistory.com/181
C# 에서 struct나 class 등 모든 것은 object 타입으로 변형이 가능합니다. 일반적으로 힙 영역에 저장되는 class의 경우 메모리 주소의 영역과 실제 메모리가 저장되는 위치가 다르기 때문에 Boxing이나 UnBoxing이 일어나지 않지만, 값 형식인 struct나 int, double, string 과 같은 것들은 스택영역에 직접 저장되기 때문에 Boxing이나 Unboxing이 일어나게 됩니다.
그래서 int를 object로 바꾸고 바꾼 메모리를 힙 영역에 저장하게 됩니다. 그러면 스택 메모리에 있던 것을 복사해서 힙 메모리에 다시 생성하게 됩니다. 그리고 이를 다시 unboxing 하면 값 형식을 추출해서 스택 메모리에 저장하게 되면서 양쪽에 메모리를 모두 접근하게 됩니다.
그렇기 때문에 일반적인 캐스팅과는 결이 많이 다르고 퍼포먼스도 떨어지게 되는데요. 최대 20배의 시간이 더 걸린다고 합니다. 또 Boxing이 된 상태에서 잘못된 형식으로 Unboxing을 하게 되면 InvalidCastException이 발생하게 됩니다. 또 null인 값을 unboxing 하려고 하면 NullReferenceException이 발생합니다. 이 경우 남이 짠 코드를 어떤 타입인지 확인하지 않으면 모르기 때문에 그닥 좋은 방법이 아니라고 볼 수 있습니다.
그래서 특별한 경우가 아닌 경우 가능하면 Boxing과 Unboxing을 사용하는 것을 권장하지 않습니다. 꼭 필요한 경우에는 사용해야하지만, 예를 들어 다른 파일에 값을 주고 받을때 해당 값에 타입을 확정할 수 없는 경우에 어쩔 수 없이 사용하겠지만요.
WPF Control 상속 관계 정리 (4) | 2020.04.17 |
---|---|
C# - 클래스(Class)와 구조체(Struct)에 대해서 알아보자 (0) | 2020.04.08 |
C# 메모리구조, 스택(Stack), 힙(Heap) (0) | 2020.03.25 |
C# 프로그래밍 Bitmap 사용방법 (2) | 2020.03.24 |
C# 프로그래밍 - 접근제한자 (0) | 2020.03.10 |
댓글 영역