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될 것인지를 고려하여 프로그래밍해야겠다.

태그: ,

카테고리:

업데이트:

댓글남기기