메모리 구조

문강현·2025년 11월 25일
post-thumbnail

시작하며

이 글에서는 메모리 구조에 대해 알아보도록 하겠습니다.
프로그램이 실행될 때 메모리가 어떻게 나누어지는지, 그리고 각 영역이 어떤 역할을 하는지 알아보도록 하겠습니다.

메모리 구조가 뭘까용??

프로그램은 실행 될때 운영체제로 부터 메모리 공간을 할당 받습니다. 그리고 이 메모리는 크게 4가지로 나뉩니다

  • 코드
  • 데이터
  • 스택

코드 영역

프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역입니다. 한마디로 명령문들이 저장되는 것인데, 제어문, 함수, 상수들이 이 영역에 저장됩니다.
CPU가 이 영역의 코드를 하나씩 읽어 실행합니다.
쉽게 말해 코드가 실행되기 위해 저장되어있는 영역입니다.

특징

  • CPU가 실행할 명령어가 들어 있음
  • 읽기 전용이기 때문에 실행 중 수정 불가
  • 프로그램 전체에서 공유됨
  • 예를 들어 C에서 작성한 int main() {} 함수의 컴파일 결과도 여기 저장됩니다.

데이터 영역

데이터 영역은 우리가 작성한 코드에서 전역변수, 정적변수 등이 저장되는 공간입니다.
또한 데이터영역은 크게 두가지로 나뉩니다.

초기화된 데이터 영역

int a = 10; // 초기값 있음

초기화되지 않은 데이터 영역

static int count; // 초기값 없음

특징

  • 프로그램 시작 시 함께 생성
  • 프로그램 종료까지 메모리에 남아 있음
  • 전역 상태를 저장하는 공간

힙 영역

사용자에 의해 관리되는 영역입니다. 흔히 동적으로 할당 할 변수들이 여기에 저장된다고 보시면 됩니다.
필요할 때 메모리를 요청하고, 사용이 끝나면 다시 해제해야 합니다.

예시

C언어

int* p = malloc(sizeof(int) * 10);

JS

자바스크립트 객체/배열도 대부분 힙에 저장
예)

  • JS의 객체/배열/함수 → 모두 힙에 저장
  • number, string등 원시타입들은 스택에 저장됨
const obj = { name: "강현" }; // 객체는 힙에 저장

JAVA

new String("Hello"); // 힙에 저장

특징

  • 필요할때 동적으로 생성
  • 개발자가 직접 관리(할당/해제)해야 함
  • 크기가 자유롭고 유연함
  • 하지만 잘못 사용하면 메모리 누수 발생
  • 객체나 동적 배열처럼 크기가 유동적인 데이터가 저장됨

스택 영역

스택 영역은 함수를 호출 할 때 지역변수와 매개변수가 저장되는 공간입니다. stack pop 과 같이 함수가 종료되면 해당 함수에 할당된 변수들을 메모리에서 해제시킵니다.

void test() {
    int x = 3; // 스택에 저장
}

특징

  • 함수가 호출될 때 push, 종료될 때 pop
  • 매우 빠른 접근 속도
  • 자동으로 메모리 관리됨
  • 크기는 제한적(overflow 가능)

그래서 아래와 같은 코드는 스택 오버플로우를 일으킵니다:

int arr[10000000]; // 너무 큰 배열 → 스택 오버플로우

마치며

이번 글에서는 프로그램이 실행될 때 메모리가 어떻게 나뉘는지 간단하게 정리해보았습니다.
처음 봤을때는 생각 보다 쉬워 보였지만 자료를 찾다 보니 생각 보다 깊은 내용도 많고 많이 어려워서 내용 보완 할 점이 많다고 생각 합니다.
글 읽어 주셔서 감사합니다

출처:
https://st-lab.tistory.com/198

0개의 댓글