✅ 핵심 정의
| Boxing | 값 타입을 참조 타입(object)으로 감싸는 과정 | int → object 등 |
| Unboxing | 참조 타입에서 다시 값 타입으로 꺼내는 과정 | object → int 등 |
🔸 예제 1: Boxing
int num = 10;
object boxed = num; // Boxing 발생
- int는 값 타입 → 스택에 저장됨
- object는 참조 타입 → 힙에 저장됨
- Boxing 시: num의 값을 힙에 새로 복사해서 object로 감
🎯 즉, Boxing = 값을 힙에 복사 + 참조 타입으로 변환
🔸 예제 2: Unboxing
object boxed = 10;
int num = (int)boxed; // Unboxing 발생
- boxed는 힙에 저장된 int 값의 참조
- (int)를 통해 다시 값 타입으로 꺼냄
🎯 Unboxing = 참조 타입 → 값 타입으로 꺼내서 스택에 복사
✅ 시각화: 메모리 구조
int num = 123; // 스택에 저장
object obj = num; // 힙에 새로 생성 → obj 참조 (Boxing)
int result = (int)obj; // 다시 스택으로 복사 (Unboxing)
⚠️ 왜 중요하냐?
🎯 Boxing과 Unboxing은 힙 할당 + 복사 비용 + GC 부담을 일으킵니다!
| ❌ 성능 저하 | 매번 힙에 새 객체 생성 (Boxing) + GC 대상 |
| ❌ 타입 캐스팅 비용 | Unboxing은 명시적 형변환 필요 + 실패 시 예외 발생 |
| ❌ 반복 사용 시 심각 | 루프나 컬렉션 내부에서 발생하면 누적 성능 문제 발생 |
🔥 대표적인 실수 예시
object[] arr = new object[3];
arr[0] = 1; // Boxing
arr[1] = 3.14f; // Boxing
arr[2] = true; // Boxing
➡ 반복적 Boxing은 큰 GC 스파이크 원인
✅ 어떻게 피하나?
| ✅ object 대신 제네릭 사용 | List<T> 대신 List<int> |
| ✅ 캐스팅 대신 직접 타입 사용 | int → object → int 구조 피하기 |
'C#' 카테고리의 다른 글
| [C#] 자료구조 정리 표 (2) | 2025.08.10 |
|---|---|
| [C#] 구조체를 쓰는 이유 (1) | 2025.08.10 |
| [C#] Garbage Collector (2) | 2025.07.25 |
| [C#] LINQ와 Lazy Evaluation(지연 평가) (2) | 2025.07.25 |
| [C#] IEnumerable을 쓰는 이유 (2) | 2025.07.24 |