[C#] Boxing & Unboxing

spixychz·2026년 4월 13일

기술면접

목록 보기
6/13

오늘의 질문

C#에서 BoxingUnboxing은 무엇이며, 왜 성능 문제를 발생시킬 수 있을까요?


오늘의 대답

Boxing은 스택 메모리의 값 타입 데이터를 힙 메모리에 참조 타입 객체로 변환하는 과정이며, Unboxing은 다시 값을 스택 메모리로 가져오는 과정입니다.
이 과정에서 Heap 메모리 할당과 복사가 발생하기 때문에 성능 비용이 발생할 수 있습니다.
특히 반복적으로 발생하면 Garbage Collection의 원인이 되어 성능 저하로 이어질 수 있습니다.


Boxing

값 타입 -> 참조 타입 변환

값 타입을 object 또는 인터페이스 타입으로 변환할 때 발생.

  1. Heap 메모리에 공간 확보
  2. 값 타입 데이터를 Heap으로 복사
  3. 해당 객체의 주소값을 참조 변수에 할당
int value = 10;
object obj = value; // Boxing 발생

=> 값을 감싸는 Wrapper 객체가 생성

Unboxing

참조 타입 -> 값 타입 변환

Boxing된 객체를 다시 값 타입으로 꺼내는 과정.

  1. 해당 객체가 꺼내려는 값 타입이 맞는지 확인
  2. 힙에 있는 데이터를 다시 스택의 변수로 복사
object obj = 10;
int value = (int)obj; // Unboxing

=> Heap에서 Stack으로 복사 발생

왜 성능 문제가 될까 ?

  • Heap 메모리 할당
    • Heap에 매번 새로운 객체를 만드느라 메모리 소모
  • 데이터 복사 비용
    • Stack → Heap 복사가 발생합니다.
  • GC 호출
    • 많은 Boxing은 Garbage Collection의 원인이 됩니다.

Unity에서 주의해야 할 상황

// 1. 문자열 결합
int score = 100;
string text = "Score: " + score; // score가 object로 Boxing됨

// 2. Debug.Log
int score = 10;
Debug.Log(score); // Boxing 발생

Boxing을 피하는 방법

  • Generic 사용
  • object 사용 최소화
  • ToString() 호출

결론

  • Boxing : 값 타입 → 참조 타입 변환
  • Unboxing : 참조 타입 → 값 타입 변환
  • Boxing은 Heap 할당과 복사가 발생하기 때문에 비용이 크다. 반복적인 Boxing은 GC를 유발해 성능 문제로 이어질 수 있습니다
  • 가능하면 제너릭을 사용하여 힙으로의 외출을 막는 것이 최적화의 핵심

=> "값 타입은 스택에 머물 때 가장 빠르다."

profile
UNITY로 게임 개발하는 사람

0개의 댓글