피드로 돌아가기
Value Types vs Reference Types, Struct vs Class, and Boxing & Unboxing — The Complete C# Guide
Dev.toDev.to
Backend

C# 값 형식과 참조 형식의 메모리 저장 방식 차이와 boxing의 성능 영향을 설명하는 가이드

Value Types vs Reference Types, Struct vs Class, and Boxing & Unboxing — The Complete C# Guide

Libin Tom Baby2026년 3월 30일8intermediate

Context

C#에서 struct와 class의 동작 방식 차이를 이해하지 못하면 메모리 누수와 성능 저하를 예측할 수 없다. Boxing이 암묵적으로 발생하면서 성능이 저하되는 상황도 충분히 인식되지 못하고 있다.

Technical Solution

  • 스택은 빠른 할당/해제와 LIFO 구조를 가지며 값 형식과 메서드 호출 프레임을 저장한다.
  • 힙은 가비지 컬렉터가 관리하며 참조 형식의 실제 객체 데이터를 저장한다.
  • 값 형식(local variable)은 스택에 저장되고, 클래스의 필드로 선언되면 힙에 저장된다.
  • Boxing은 int, struct 같은 값 형식을 object로 변환할 때 힙 메모리를 할당하고 데이터를 복사하는 비용이 큰 작업이다.
  • Unboxing은 힙의 데이터를 다시 스택으로 복사하는 과정이며 타입 검사와 복사가 수반된다.
  • record struct(C# 10)는 힙 할당 없이 값 같음과 불변성을 지원하는 값 형식이다.

Impact

Boxing이 빈번한 반복문이나 대량 컬렉션에서 힙 할당 증가와 가비지 컬렉션 빈도 상승으로 성능이 저하된다.

Key Takeaway

값 형식은 직접 데이터를 저장하고 기본적으로 스택에 위치하며, 참조 형식은 힙 메모리를 가리키는 포인터를 저장한다. Boxing은 암묵적으로 발생하며 비용이 크므로 제네릭(List) 사용으로 방지해야 한다.


고성능이 요구되는 시나리오에서 작은 크기(16바이트 이하)의 불변 데이터를 처리할 때 struct를 사용하여 힙 할당과 GC 부담을 피하고, 불변성과 값 같음이 필요한 경우 C# 10의 record struct를 적용한다.

원문 읽기