
박싱(Boxing)과 언박싱(Unboxing) 이해하기
C#과 같은 .NET 기반 언어에서는 값 타입(value type)과 참조 타입(reference type)의 개념이 뚜렷하다.
이 두 타입 간의 상호작용 중 중요한 개념이 박싱(Boxing)과 언박싱(Unboxing)이다.
박싱(Boxing)이란?
박싱은 값 타입을 참조 타입으로 변환하는 과정이다.
예를 들어, int, float, bool과 같은 값 타입을 object 형식으로 취급하고자 할 때 발생한다.
박싱이 일어나면, 값 타입의 데이터를 Heap(힙) 메모리에 할당하고, 그 참조를 object 타입 변수에 저장한다.
int number = 123;
object obj = number; // 박싱
위 코드에서 number는 값 타입이고, obj는 참조 타입이다.
이때 CLR(Common Language Runtime)은 number의 값을 Heap에 저장하고 그 주소를 obj에 넣는다.
언박싱(Unboxing)이란?
언박싱은 박싱된 객체에서 다시 원래의 값 타입으로 꺼내오는 과정이다. 이 과정에서는 명시적인 형 변환이 필요하며, 잘못된 형변환은 InvalidCastException을 유발한다.
object obj = 123; // 박싱
int number = (int)obj; // 언박싱
주의할 점은 박싱된 데이터의 원래 타입과 언박싱하려는 타입이 정확히 일치해야 한다는 것이다.
예를 들어, object로 박싱된 값이 int인데 이를 long으로 언박싱하려고 하면 런타임 오류가 발생한다.
박싱과 언박싱의 성능 영향
박싱과 언박싱은 단순한 타입 변환처럼 보일 수 있으나, 실제로는 추가적인 메모리 할당과 캐스팅이 발생하기 때문에 성능에 영향을 줄 수 있다. 특히 반복문 안에서 값 타입을 박싱하거나, 박싱된 데이터를 자주 언박싱하는 경우 성능 저하를 유발할 수 있다.
for (int i = 0; i < 1000000; i++)
{
object obj = i; // 박싱
int value = (int)obj; // 언박싱
}
이런 경우, 박싱과 언박싱 없이 동작하도록 제네릭(Generic)을 사용하는 것이 권장된다.
제네릭을 활용한 박싱 방지
.NET에서는 제네릭을 사용함으로써 불필요한 박싱과 언박싱을 줄일 수 있다. 예를 들어 ArrayList는 모든 데이터를 object로 취급하기 때문에 박싱이 필요하지만, List<T>는 제네릭이기 때문에 값 타입도 직접 저장할 수 있어 박싱이 발생하지 않는다.
// 박싱 발생
ArrayList list1 = new ArrayList();
list1.Add(123); // int -> object
// 박싱 없음
List<int> list2 = new List<int>();
list2.Add(123); // int 그대로 저장
'C# > TIL(Today I Learned)' 카테고리의 다른 글
| 2025-04-26 <Action과 Func와 람다 함수> (0) | 2025.04.26 |
|---|---|
| 2025-04-26 <형변환> (0) | 2025.04.26 |
| 2025-04-23 <const와 readonly> (0) | 2025.04.23 |
| 2025-04-19 <ArraySegment> (0) | 2025.04.19 |
| 2025-04-18 <SocketAsyncEventArgs 이해하기> (2) | 2025.04.18 |
댓글