2026.09.22 - [TIL] - CS - 값 형식과 참조 형식
CS - 값 형식과 참조 형식
값 형식과 참조 형식은 변수가 어떤 데이터를 담는지에 따라 구분이 됩니다. 그렇다면 앞서 언급했던 변수란 무엇일까요?변수란 코드에서 보자면 값을 대입시켜 변화시킬 수 있는 요소이지만,
unitylearn.tistory.com
박싱(Boxing)
박싱(Boxing)은 값 형식의 데이터를 object와 같은 참조 형식으로 다루기 위해 힙에 객체로 포장하는 과정입니다.

위 그림에서는 값 형식인 int의 값 20을 object 형식의 변수에 대입하고 있습니다.
겉으로 보면 단순히 20을 obj에 넣는 것처럼 보이지만, 실제로는 int와 object의 저장 방식이 다르기 때문에 별도의 과정이 필요합니다.
int는 값 형식(Value Type)이고 object는 참조 형식(Reference Type)입니다.
따라서 박싱이 발생하면 힙(Heap)에 int 값을 담기 위한 새로운 객체가 만들어지고, 기존 값 20이 그 객체 내부로 복사됩니다.
그리고 obj는 값 20 자체를 가지는 것이 아니라 새롭게 생성된 객체를 가리키는 참조를 가지게 됩니다.
즉, 값 형식의 값
→ Heap에 객체 생성
→ 객체 내부에 값 복사
→ object가 객체를 참조
하는 과정이 박싱입니다.
여기서 중요한 점은 박싱 과정에서 힙 할당이 발생한다는 것입니다.
힙에 만들어진 객체가 더 이상 사용되지 않으면 이후 GC의 수거 대상이 됩니다. 따라서 박싱이 반복되면 힙에 불필요한 객체가 계속 생성되고, 이후 GC가 처리해야 할 메모리도 늘어나 성능에 영향을 줄 수 있습니다.
특히 Unity에서는 Update()나 반복문처럼 자주 실행되는 코드에서 박싱이 계속 발생하지 않는지 주의할 필요가 있습니다.
언박싱(Unboxing)
반대로 박싱되어 있는 값을 다시 값 형식으로 가져오는 과정을 언박싱(Unboxing)이라고 합니다.

위 그림에서 obj는 힙에 만들어진 boxed int 객체를 참조하고 있습니다.
이 상태에서 해당 값을 다시 int로 가져오면 객체 내부에 저장되어 있던 20이라는 값이 꺼내져 int 변수에 복사됩니다.
즉, boxed 객체
→ 내부에 저장된 값 확인
→ 값 형식의 값을 꺼냄
→ 값 형식 변수에 복사
하는 과정입니다.
다만 언박싱할 때는 박싱되어 있던 실제 값 형식과 언박싱하려는 타입이 일치해야 합니다.
예를 들어 int가 박싱되어 있다면 다시 int로 언박싱해야 합니다.
이를 바로 long과 같은 다른 값 형식으로 언박싱하려고 하면 InvalidCastException이 발생할 수 있습니다.
즉, 언박싱은 object 안의 값을 원하는 타입으로 자유롭게 바꾸는 과정이 아니라, 박싱되어 있던 원래 값 형식으로 다시 꺼내는 과정입니다.
그런데 object는 무엇일까?
여기까지 보면 한 가지 의문이 생깁니다.
값 형식인 int를 왜 object 형식으로 다룰 수 있는 걸까요?
이를 이해하려면 C#의 타입 구조를 알아야 합니다.

object는 System.Object의 C# 키워드이며, C# 타입 시스템에서 모든 형식의 최상위 기반 형식입니다.
즉, C#의 여러 데이터 형식은 궁극적으로 System.Object를 기반으로 합니다.
클래스와 같은 참조 형식은 object를 기반으로 하기 때문에, 우리가 직접 만든 Player 같은 클래스도 object 형식으로 다룰 수 있습니다.
값 형식도 마찬가지입니다. int, bool, char 같은 값 형식은 System.ValueType을 기반으로 하고, System.ValueType 역시 System.Object를 기반으로 합니다.
따라서 값 형식 역시 object 형식으로 다룰 수 있습니다.
다만 값 형식은 값을 직접 가지고 있는 반면, object는 참조 형식이기 때문에 값 형식을 그대로 참조할 수는 없습니다.
그래서 값 형식을 object로 다룰 때는 Heap에 값을 담을 객체를 새로 생성하고, 그 안에 값을 복사하는 박싱(Boxing) 과정이 발생합니다.
정리
박싱(Boxing)
값 형식의 값을 object와 같은 참조 형식으로 다루기 위해 Heap에 객체를 만들고 값을 복사하는 과정입니다. 이 과정에서 힙 할당이 발생할 수 있으므로 반복적인 박싱은 GC 부담으로 이어질 수 있습니다.
언박싱(Unboxing)
박싱된 객체 내부에서 다시 원래 값 형식의 값을 꺼내는 과정입니다. 박싱되어 있던 실제 타입과 언박싱하려는 타입이 일치해야 합니다.
object
System.Object는 C#의 모든 형식이 궁극적으로 기반으로 하는 최상위 기반 형식입니다. 그렇기 때문에 다양한 형식을 object로 다룰 수 있고, 값 형식을 object로 다룰 때 박싱이 발생합니다.
'TIL' 카테고리의 다른 글
| CS - 값 형식과 참조 형식 (0) | 2026.09.22 |
|---|---|
| Unity 2D - 무기 시스템 (전략 패턴) (0) | 2026.04.23 |