메모리의 구성
프로그램이 실행되기 위해서는 프로그램이 메모리에 로드 (Load) 되어야 하며, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
따라서 컴퓨터의 운영체제는 프로그램 실행 시 메모리 공간을 할당한다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 4개의 영역으로 구분된다.

이처럼 메모리 공간을 나누어 유사한 성향의 데이터를 묶어 저장하면 관리가 용이해지고 메모리의 접근 속도가 향상된다.
코드 영역 (Code Area)
- 프로그램의 실행코드가 저장되는 공간이다.
- C# 프로그램은 MSIL (Microsoft Intermediate Language) 또는 CIL (Common Intermediate Language) 이라고도 하는 중간 언어로 컴파일되며, 이 MSIL 코드가 코드 영역에 저장된다.
- 실행 시에 CLR (Common Language Runtime)에 의해 MSIL 코드가 실제 기계 코드로 변환되고 실행된다.
데이터 영역 (Data Area)
- 정적 변수와 상수, 문자열들이 저장되는 공간이다.
- 정적 변수는 프로그램이 시작될 때 메모리에 할당되며, 프로그램이 종료될 때까지 유지된다.
- 동일한 문자열과 상수를 여러 곳에서 사용하는 경우, 상수 풀을 활용하여 중복된 데이터를 하나로 관리한다.
스택 영역 (Stack Area)
- 메소드(함수) 호출과 지역 변수들의 저장에 사용된다.
- 각 스레드마다 별도의 스택이 생성된다.
- 스택에는 메소드 호출 시 생성되는 지역 변수, 매개 변수, 메소드의 복귀 주소 등이 저장된다.
- 메소드의 실행이 끝나면 스택에서 해당 메소드와 관련된 데이터가 제거된다.

힙 영역 (Heap Area)
- 동적으로 할당되는 데이터와 객체들을 저장하는 공간이다.
new 연산자를 사용하여 객체를 생성하거나 메모리를 동적으로 할당할 때 힙이 사용된다.
- 힙은 저장된 데이터를 스스로 제거하는 매커니즘을 갖고 있지 않다.
그 대신 CLR의 가비지 컬렉터 (Garbage Collector)가 프로그램 뒤에 숨어 동작하면서 힙에 더 이상 사용하지 않는 객체가 있으면 그 객체를 쓰레기로 간주하고 수거하는 기능을 한다.