"박싱(Boxing)과 언박싱(Unboxing)"
개발을 하다보면 값 타입인데 갑자기 느려지거나, object로 받았는데 캐스팅이 터지는 등의 상황을 만나기도 한다.
특히 C#에서는 object나 컬렉션, 인터페이스로 값을 다루는 과정에서 박싱/언박싱이 몰래 발생해서
성능과 예외의 원인이 되기도 한다.
오늘은 박싱(Boxing)과 언박싱(Unboxing)이 무엇인지, 언제 발생하고 어떻게 피하면 좋은지 정리해볼 예정이다.
1) 박싱(Boxing)과 언박싱(Unboxing)이란?
박싱(Boxing)
값 타입(int, float, struct)을 참조 타입(object 등)으로 포장해서 힙에 올리는 것
언박싱(Unboxing)
박싱된 object 안의 값을 다시 값 타입으로 꺼내는 것
(명시적 캐스팅 필요)
2) 값 타입 vs 참조타입 (+왜 박싱이 생길까?)
값 타입(Value Type)
int, float, bool, struct
보통 스택(또는 인라인)에 값 자체가 저장
참조 타입(Reference Type)
class, string, object, 배열
힙에 실제 데이터가 있고, 변수는 그 주소(참조)를 가짐
값 타입을 object로 다뤄야 하는 순간, “주소가 필요한데 값만 있네?”가 되니까
값을 힙에 복사해 넣고 object 참조로 감싸는 과정이 필요한데,
그것이 '박싱'이다.
3) 박싱/언박싱 흐름은?
박싱(Boxing)
복사 + 힙 할당 발생
(값 타입 → object로 포장)
(스택) (힙)
int x = 10; [ 10 ] <= 값이 복사되어 저장됨
│ ▲
└── (Boxing) object o ─┘ o는 힙의 10을 가리킴
언박싱(Unboxing)
형 변환 + 값 복사, 그리고 타입이 안 맞으면 예외
(object → 값 타입으로 꺼내기)
object o = (박싱된 10);
int y = (int)o; // 언박싱 (명시적 캐스팅 필요)
4) 박싱이 발생하는 대표 상황들
(1) 값 타입을 object에 담을 때
int x = 10;
object o = x; // 박싱
(2) 값 타입을 인터페이스 타입으로 받을 때 (struct + interface)
public interface IMy { void Run(); }
public struct MyStruct : IMy
{
public void Run() { }
}
IMy t = new MyStruct(); //박싱 발생 가능 (인터페이스로 받는 순간 포장)
(3) 비제네릭 컬렉션에 값 타입을 넣을 때
ArrayList list = new ArrayList();
list.Add(10); // 박싱
int v = (int)list[0]; // 언박싱
5) 언박싱이 위험한 이유
언박싱은 그 안에 실제로 들어있는 값 타입과 정확히 같은 타입으로 꺼내야 한다.
object o = 10; // 박싱된 int
long y = (long)o; // InvalidCastException! (예외. int를 long으로 언박싱 불가)
언박싱은 '(int)o'로 꺼낸 뒤에 long으로 변환해야 한다.
object o = 10;
long y = (int)o; // int로 언박싱 후 long으로 암시적 변환
6) 박싱/언박싱이 성능에 미치는 영향
힙 할당(GC 부담 증가)
복사 비용
캐스팅 비용
빈번하면 프레임 드랍
(Unity Update 루프에서 특히 치명적)
Unity 내에서는
Update()/FixedUpdate() 안에서 반복적으로 발생될 수 있고,
로그/문자열 처리, 컬렉션, 이벤트/델리게이트 패턴에서도 등장하기도 한다.
7) 예시 코드 정리
int x = 5;
object o = x; // 박싱
int y = (int)o; // 언박싱
object o2 = 5;
long z = (int)o2; // 언박싱 후 변환
8) 오늘의 한 줄 요약
『 박싱은 값 타입을 힙에 복사해 object(또는 인터페이스)로 감싸는 것이고,
언박싱은 그 값을 정확한 값 타입으로 캐스팅해 다시 꺼내는 과정이다. 』
'1일 1 cs' 카테고리의 다른 글
| 24. 스프라이트 아틀라스(Sprite Atlas)란? (0) | 2026.02.13 |
|---|---|
| 23. 스크립터블 오브젝트(ScriptalbeObject) 란? (0) | 2026.02.09 |
| 21. namespace와 partial 이란? (0) | 2026.02.07 |
| 20. 시네머신(Cinemachine)이란? (3) | 2026.02.06 |
| 19. API (Application Programming Interface) 란? (0) | 2026.02.04 |