C#/.NET(6): Boxing/Unboxing
Boxing/Unboxing의 정의
Boxing 은 값 타입을 System.Object 타입으로 converting 하는 것을 말한다.
Unboxing 은 Boxed 된 변수를 다시 값 타입으로 converting 하는 것을 말한다.
int number = 5;
string word = "abc";
- 스택:
- 변수 number(5) 가 저장
- 힙에 저장된 변수 word 의 참조값만 저장
- 힙:
- 변수 word(“abc”)가 저장
Boxing/Unboxing 예시
[Boxing 예시]
int num = 5;
object boxedNumber = num;
- 스택:
- 변수 num(5)가 저장
- 힙에 저장된 변수 boxedNumber 의 참조값만 저장
- 힙:
- 변수 boxedNumber(5)가 저장
[Unboxing 예시]
int num = 5;
object boxedNumber = num;
int unboxedNumber = (int)boxedNumber; // unboxed
Unboxing 은 System.object 의 오리지널 변수를 원래 값 타입으로 할당한다.
그리고 Unboxing 시 주의할 점은 오리지널 변수와 Unboxing 변수의 타입이 일치해야 한다.
[오리지널 값 타입과 Unboxing 값 타입이 불일치하는 경우 ]
using System;
namespace _2022_06_28
{
internal class Class1
{
static void Main(string[] args)
{
short num = 5;
object boxedNumber = num;
int unboxedNumber = (int)boxedNumber; // 타입 불일치, 예외 발생
Console.WriteLine(unboxedNumber);
}
}W
}
Boxing/Unboxing은 비용이 발생한다.
Boxing > Unboxing 시, 힙에 object를 생성하고 메모리를 할당해야하기 때문에 비용이 발생한다.
Unboxing > Boxing 시, 원래 저장된 위치인 스택으로 캐스팅해야하기 때문에 비용이 발생한다.
정리
Boxing과 Unboxing을 가능하면 피하는게 좋다는 내용을 이번 연구를 통해 찾아볼 수 있었다.
.NET의 배려로 Boxing, Unboxing을 통해 편하게 프로그램을 짤 수 있었지만, 이 과정에서 비용과 성능에 좋지 못한 영향을 끼친다. 게다가 잦은 Boxing은 사용되지 않은 리소스를 정리하기 위해 CLR이 가비지 수집을 수행하는 동작 주기를 짧아지게 할 수도 있다.
그렇다면 불필요한 Boxing을 막으려면, 통합 시스템을 개발할 때 Boxing이 될 것이 자명한 변수가 있다면 처음부터 object를 사용하여 converting을 피하는 방법이 최선이다.
그리고 값 타입이 32비트 이상으로 크고, boxing, unboxing이 자주 일어나는 구조라면 struct보다 class를 사용하는 것이 유리하다. 왜냐하면 Unboxing으로 casting 하는 편이 그나마 덜 비용이 발생하기 때문이다.
그러한 이유로 통합 시스템 개발에 참여하게 된다면, Boxing/Unboxing을 최소화하기 위해 객체의 타입을 정할 때 객체의 크기와 얼마나 자주 copy될 것인지를 고려하여 프로그래밍해야겠다.
댓글남기기