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는 스택에 저장, 객체 자체는 힙에 저장
}