C#에서 박싱(Boxing)은 값 형식(value type)을 개체(object) 형식으로 변환하는 과정이며, 언박싱(Unboxing)은 그 반대로 개체 형식을 다시 값 형식으로 변환하는 과정입니다.
이번 글에서는 C#에서 박싱과 언박싱의 핵심적인 차이점을 항목별로 살펴보겠습니다.
1. 저장 위치(Storage)
박싱이 발생하면 스택(stack)에 저장된 값이 복사되어 힙(heap) 메모리에 있는 개체로 저장됩니다. 반면 언박싱은 이와 정반대의 동작을 수행합니다.
언박싱에서는 힙 메모리에 저장된 개체의 값이 복사되어 스택에 위치한 값 형식 변수에 저장됩니다.
2. 형변환 방식(Conversion)
언박싱은 명시적(explicit) 형변환이 필요하지만, 박싱은 암시적(implicit) 형변환으로 자동으로 처리된다는 점이 큰 차이입니다.
3. 예제 코드
int a = 10;
object obj = a; // 박싱: 값 형식 → 개체 형식
int b = (int)obj; // 언박싱: 개체 형식 → 값 형식
위 예제에서 변수 a가 object 타입 변수에 대입되는 순간 박싱이 일어나고, 다시 (int) 캐스팅을 통해 값을 꺼낼 때 언박싱이 일어납니다.
4. 성능 관련 팁
박싱과 언박싱은 힙 메모리 할당과 데이터 복사 작업을 수반하기 때문에 잦은 사용 시 성능 저하의 원인이 될 수 있습니다. 따라서 반복문이나 호출 빈도가 높은 코드에서는 List<T> 같은 제네릭(Generic) 컬렉션을 활용해 불필요한 박싱/언박싱을 최소화하는 것이 좋은 코딩 습관입니다.