Boxing vs Unboxing in C#
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
C#/.NET 개발자, 특히 값 형식(value type)과 참조 형식(reference type)을 다루는 중급 이상 개발자
핵심 요약
- Boxing: 값 형식(예:
int
,bool
)을object
타입으로 암시적으로 변환하여 힙(heap) 메모리에 할당함. - Unboxing:
object
타입의 박싱된 값 형식을 명시적 형변환을 통해 다시 스택(stack)에 복사함. - 성능 영향: 과도한 박싱/언박싱은 메모리 복사와 GC 오버헤드로 인해 성능 저하를 유발할 수 있음.
섹션별 세부 요약
1. Boxing
- 값 형식(
int
,decimal
)을object
타입으로 변환할 때 자동으로 발생. - 힙 메모리 할당: 값이 스택에서 힙으로 복사되어 새로운 객체 생성됨.
- 성능 고려: 반복적인 박싱은 메모리 사용량 증가와 GC 부하로 인해 비추천됨.
2. Unboxing
- 암시적 변환의 반대:
object
타입의 박싱된 값 형식을 명시적 형변환으로 원래 타입으로 변환. - 타입 안전성: 잘못된 형변환 시
InvalidCastException
예외 발생 가능. - 힙 → 스택 복사: 원본 값 형식과 동일한 값이 스택으로 복귀.
3. 실무 적용 시 주의사항
- ArrayList(일반 컬렉션) 사용 시 박싱이 자주 발생하지만, 제네릭 컬렉션(예:
List
)은 박싱/언박싱을 방지. - 성능 민감한 애플리케이션에서는 박싱/언박싱 최소화를 권장.
결론
- 박싱/언박싱은 값 형식과 참조 형식 간의 유연한 변환을 가능하게 하지만, 성능 최적화를 위해 제네릭 컬렉션을 사용해야 함.
- 명시적 형변환을 통해 언박싱 시 타입 검증을 반드시 수행해야 하며, 잘못된 예외 처리는 애플리케이션 안정성에 영향을 줌.