C#/TIL(Today I Learned)
2025-03-20(1) <내가 만든 데이터, Stack과 Heap 중 어디에 저장될까?>
프린스 알리
2025. 3. 20. 11:06
내가 만든 데이터, Stack과 Heap 중 어디에 저장될까?
스택(Stack)에 저장되는 데이터
지역 변수(Local Variable)
- 함수 또는 블록 내에서 선언된 변수는 기본적으로 스택에 저장된다.
- 함수가 호출될 때 메모리가 할당되며, 함수가 끝나면 자동으로 해제된다.
값 타입(Value Type) (C#, C++ 기본 타입 등)
- 대표적으로 정수형(int, long), 실수형(float, double), 불리언(bool), 구조체(struct) 등이 포함된다.
- 예제(C#)
void SomeMethod() {
int x = 10; // x는 스택에 저장됨
} // 함수가 끝나면 x가 사라짐
컴파일 타임에 크기가 결정되는 변수
- 배열의 크기가 컴파일 타임에 정해진다면, 스택에 저장될 수 있다.
- 예제(C++)
int arr[5]; // 정적 크기의 배열 -> 스택에 저장
힙(Heap)에 저장되는 데이터
참조 타입(Reference Type)
- 객체(Object), 클래스(Class), 배열(Array), 델리게이트(Delegate) 등은 힙에 저장된다.
- 예제(C#)
class Player {
public int Health;
}
void CreatePlayer() {
Player p = new Player(); // Player 객체는 힙에 저장됨
}
런타임에 크기가 결정되는 데이터
- 동적 할당(new 연산자 사용)
- 예제(C++)
int* p = new int(10); // new로 생성된 변수는 힙에 저장
클래스의 인스턴스 멤버 변수
- 클래스 내 필드(멤버 변수)는 객체가 생성될 때 힙에 저장된다.
- 단, 정적(static) 변수는 별도의 정적 메모리 영역에 저장됨.
큰 크기의 데이터
- 대형 배열이나 컬렉션(List, Dictionary 등)은 힙에 저장된다.
- 예제(C#)
int[] numbers = new int[1000]; // 힙에 저장됨
스택과 힙을 함께 사용하는 경우
참조 타입을 저장할 때
- 객체(힙에 저장)의 참조(reference)는 스택에 저장됨.
- 예제(C#)
class Example {
public int Value;
}
void Test() {
Example e = new Example(); // e는 스택에 저장, 객체 자체는 힙에 저장
}