반응형
이 블로그 게시물은 Unity 개발자가 반드시 숙지해야 하는 C#의 메모리 구조에 대해 설명해보려 한다.
Unity로 개발을 하다 보면 메모리 최적화, GC(Garbage Collection), 성능 이슈 같은 문제들을 접하게 되는데, 이런 문제를 효율적으로 다루기 위해서는 메모리가 어떻게 관리되고 있는 지에 대한 개념이 필요하기 때문에 정리를 해봤다.
그럼 C#의 메모리 구조
- 스택(Stack)
- 힙(Heap)
- 데이터 영역(Data Segment)
- 코드 영역(Code Segment)
으로 나누어 설명해보겠다.
1. C# 메모리 구조 구성
영역 | 설명 |
Stack | 값 형식(Value Type)의 데이터가 저장됨. 함수 호출/지역 변수 관련. 빠름. |
Heap | 참조 형식(Reference Type)의 인스턴스가 저장됨. GC에 의해 수명 관리. 느림. |
Data Segment | 전역 변수, 정적 변수 등이 저장됨. 프로그램이 끝날 때까지 유지됨. |
Code Segment | 실제 코드(명령어)가 저장되는 영역. 실행 파일의 로직이 위치. |
1-1. Stack (스택 영역)
스택은 함수 호출 시 생성되는 지역 변수나 매개변수 같은 값 형식을 저장하는 공간
- 매우 빠르게 할당 및 해제됨 (LIFO 구조)
- 스코프(scope)가 끝나면 자동 제거
- 값 타입(int, float, struct 등)은 스택에 저장됨
void PrintSum()
{
int a = 5; // 스택에 저장됨
int b = 3; // 스택에 저장됨
int sum = a + b; // 스택에 저장됨
Debug.Log(sum);
}
1-2. Heap (힙 영역)
힙은 동적으로 할당되는 객체(참조 타입)를 저장하는 공간
- new 키워드로 생성되는 인스턴스 저장
- GC(Garbage Collector)가 수명 관리
- 상대적으로 느리지만 대용량 데이터 저장에 유리
class Player
{
public string name;
}
void Start()
{
Player p = new Player(); // Heap에 할당
p.name = "John"; // p는 Stack, 인스턴스는 Heap
}
1-3. Data Segment (데이터 영역)
정적(static) 변수나 전역 변수는 이 영역에 저장
프로그램 실행 내내 유지되며, 종료될 때까지 존재한다.
public class GameManager
{
public static int totalScore = 0; // 데이터 영역에 저장됨
}
1-4. Code Segment (코드 영역)
우리가 작성한 메서드, 함수 등의 실제 실행 코드는 이 영역에 위치
- 읽기 전용 메모리 영역
- 런타임에서 CPU가 읽어 실행하는 명령어가 존재함
void Update()
{
MovePlayer(); // 코드 영역에 저장된 메서드를 실행
}

* Unity에서 왜 중요할까?
Unity는 C#을 기반으로 돌아가며, 매 프레임마다 수많은 오브젝트와 컴포넌트가 실행되기 때문에 메모리 관리가 중요하다. 그렇기 때문에 기본적으로 아래와 같은 상황들을 알아두면 좋다
- 매번 Heap에 객체를 생성하면 GC가 자주 발생해 성능 저하
- Struct(값 타입)을 잘 사용하면 메모리 할당을 줄일 수 있음
- Static을 남발하면 데이터가 오래 살아 성능 이슈로 이어질 수 있음
'잘 돌아가는 코드’ -> ‘잘 관리되는 메모리’
반응형