본문 바로가기

C#

[C#] Boxing과 UnBoxing

✅ 핵심 정의

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