I'm FanJae.

[20260512] C# ( Boxing & UnBoxing ) 본문

Unity/Unity 초격차캠프

[20260512] C# ( Boxing & UnBoxing )

FanJae 2026. 5. 12. 17:03
 

1. 박싱(Boxing)

(1) 정의

- 값 형식을 참조 형식으로 변환하는 과정이다.

- 대표적인 사례에는 ArrayList 가 있다. ArrayList 는 내부적으로 object 를 저장한다.

ArrayList list = new ArrayList();
list.Add(90);

90은 원래 int 값 형식이다.

- 하지만 ArrayList 는 object 만 저장할 수 있다. 따라서 변환이 일어난다.

object obj = 90;

- 이와 같은 변환의 과정을 박싱(Boxing) 이라고 한다.


2. 언박싱(Unboxing)

(1) 정의

- 참조 형식을 다시 값 형식으로 꺼내는 과정이다.

int score = (int)obj;

- object 안에 들어있던 실제 int 값을 다시 꺼내오는 과정이다.

- 이것을 언박싱(Unboxing)이라고 한다.


3. 박싱 / 언박싱의 문제점

(1) 추가 메모리 사용

- 박싱 시 값이 힙 메모리에 복사된다.

- 언박싱 시 다시 값 형식으로 복사된다.

 

(2) 성능 비용 발생

- 변환 과정 자체가 추가 비용이다.

- 반복적으로 발생하면 성능에 영향을 줄 수 있다.

 

(3) 런타임 오류 가능성

object obj = "FanJae";

int number = (int)obj;

- 이와 같이 잘못 형변환하면 실행 중 오류가 발생한다.

- 정확하게는 런타임에 InvalidCastException이 발생한다.

 

(4) 성능 차이 분석

- 아래 예제는 100,000,000 개의 데이터를 넣을 때 걸리는 소요 시간을 출력한다.

// 1억개의 데이터를 넣는 과정에 대한 소요 시간
const int iteration = 100000000;
Stopwatch sw = new Stopwatch();

ArrayList arrayList = new ArrayList();
sw.Start();
for(int i=0; i<iteration; i++)
{
    arrayList.Add(i); // int -> object 박싱
}
sw.Stop();

Console.WriteLine($"{sw.ElapsedMilliseconds}");
sw.Reset();

List<int> genericlist = new List<int>();
sw.Start();
for(int i=0; i<iteration; i++)
{
    genericlist.Add(i);
}
sw.Stop();

Console.WriteLine($"{sw.ElapsedMilliseconds}");

- 이처럼 특정 값이 박싱되는 과정에서 상당히 많은 비용이 발생함을 확인할 수 있다.

- 따라서 박싱 / 언박싱이 일어나지 않게 하는 것이 좋다.

 
 
Comments