---
description: 메모리 영역
---

# Memory area

컴퓨터 프로그램이 실행될 때, 메모리는 여러 영역으로 나누어져 특정 목적에 따라 사용됩니다. 이러한 메모리 영역은 다음과 같이 구분됩니다.

1. **코드 영역 (Code or Text Segment)**:
   * 프로그램의 명령어 코드가 저장되는 영역입니다.
   * CPU는 이 영역에 있는 명령어들을 하나씩 순서대로 실행합니다.
   * 이 영역은 읽기 전용으로 설정되어, 프로그램 실행 도중 코드가 변경되지 않도록 합니다.
2. **데이터 영역 (Data Segment)**:
   * 프로그램에서 선언된 전역 변수와 정적 변수가 저장되는 영역입니다.
   * 초기화된 데이터 영역과 초기화되지 않은 데이터 영역으로 나뉘어져 있을 수 있습니다.
   * 프로그램 시작 시 메모리에 할당되고, 프로그램 종료 시 메모리에서 해제됩니다.
3. **힙 영역 (Heap Segment)**:
   * 동적 메모리 할당이 이루어지는 영역입니다.
   * 프로그램 실행 중에 필요에 따라 메모리를 동적으로 할당하거나 해제할 때 사용됩니다.
   * C언어에서는 **`malloc`**, **`free`** 등의 함수로, C++에서는 \*\*`new`\*\*와 \*\*`delete`\*\*로 관리됩니다.
   * 힙 영역은 주로 큰 데이터 구조체나, 프로그램 실행 중(런타임)에 크기가 결정되는 데이터를 저장하기 위해 사용됩니다.
4. **스택 영역 (Stack Segment)**:
   * 함수의 호출 정보(호출된 함수의 주소, 매개변수, 지역 변수, 반환 주소 등)가 저장되는 영역입니다.
   * 함수가 호출될 때마다 해당 함수의 정보가 스택에 푸시되고, 함수가 종료되면 팝되어 정보가 제거됩니다.
   * 컴파일 타임에 영역의 크기가 결정됩니다.
   * 스택은 후입선출(LIFO, Last-In First-Out) 구조를 가지며, \*\*`push`\*\*와 **`pop`** 연산으로 데이터를 관리합니다.

{% hint style="info" %}
힙 영역과 스택 영역은 사실 같은 공간을 공유한다. 힙이 메모리 위쪽 주소부터 할당되면 스택은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 힙 오버플로우, 스택 오버플로우라 한다.
{% endhint %}

