개발자를 위한 필수 메모리 지식: 스택(Stack)과 힙(Heap) 이해하기

2025. 5. 5. 22:32·CS

https://f-lab.kr/

 

 

코드를 작성하다 보면 '메모리'라는 단어를 자주 접하게 된다. 

다양한 언어에서 변수나 객체가 어디에 어떻게 저장되는지 이해 하는 것은 중요하다고 생각한다.

 

 

일단 먼저 간단하게 메모리 구조에 대해 살펴보자.

프로그램이 운영체제로 부터 할당 받는 대표적인 메모리 공간 4가지가 있다.

 

 

 

 

 

 

 

 

 

1. 코드(Code) 영역

2. 데이터(Data) 영역

3. 스택(Stack) 영역

4. 힙(Heap) 영역

 

 

 

 

 

 

 

 

코드(code)영역

메모리의 코드 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고 부른다.

CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.

 

데이터(Data)영역

메모리의 데이터 영역은 프로그램의 전역 변수와 정적변수가 저장되는 영역이다.

데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸 한다.

 

 

스택(Stack) 메모리: 차곡차곡 쌓이는 임시 저장소

스택은 이름 그대로 마치 접시 더미처럼 데이터가 차곡차곡 쌓였다가 가장 마지막에 쌓인 것부터 순서대로 빠져나가는 구조를 가지고 있다. LIFO(Last-In, First-Out) 방식이다

 

스택은 주로 다음과 같은 데이터를 저장합니다:

  • 함수 호출 정보: 함수가 호출될 때마다 해당 함수의 매개변수, 지역 변수, 그리고 함수가 종료된 후 돌아갈 반환 주소 등이 '스택 프레임(Stack Frame)'이라는 단위로 묶여 스택에 쌓인다.
  • 원시 타입(Primitive Types) 지역 변수: 함수 내에서 선언된 int, float, boolean 등 크기가 고정된 원시 타입 변수들이 스택에 저장된다.
  • 참조 변수: 객체 자체는 힙에 저장되더라도, 해당 객체를 가리키는 참조 변수(포인터 또는 레퍼런스)는 스택에 저장될 수 있다.

 

스택의 주요 특징:

  • 빠른 속도: 데이터 접근 및 할당/해제가 매우 빠릅니다. 단순히 스택 포인터(SP)를 이동시키기만 하면 되기 때문이다.
  • 정적 할당: 컴파일 시점에 크기가 결정됩니다. 프로그램 실행 중에는 크기를 변경할 수 없습니다.
  • 자동 관리: 함수 호출이 시작되면 스택 프레임이 자동으로 할당되고, 함수가 종료되면 자동으로 해제됩니다. 개발자가 직접 메모리를 관리할 필요가 없습니다.
  • 크기 제한: 스택 영역은 운영체제에 의해 미리 정해진 크기 제한이 있습니다. 함수 호출이 너무 깊어지거나 지역 변수가 과도하게 많으면 스택 오버플로우(Stack Overflow) 에러가 발생할 수 있습니다.

 

힙(Heap) 메모리: 필요할 때 빌려 쓰는 넓은 공간

힙은 스택과 달리, 프로그래머가 원할 때 원하는 크기만큼 메모리를 할당받아 사용할 수 있는 넓은 영역이다. 마치 필요할 때 창고에서 공간을 빌려 쓰는 것과 비슷합니다.

 

힙은 주로 다음과 같은 데이터를 저장합니다:

  • 객체(Objects): 클래스의 인스턴스처럼 크기가 동적으로 결정되거나 생명주기가 긴 데이터는 주로 힙에 저장된다. (예: Java의 new 키워드로 생성된 객체)
  • 배열(Arrays): 크기가 크거나 동적으로 변할 수 있는 배열.
  • 그 외 동적으로 할당되는 데이터: 프로그램 실행 중에 크기가 결정되거나 사용 기간이 불확실한 데이터들.

힙의 주요 특징:

  • 동적 할당: 프로그램 실행 중에 개발자의 코드(예: C의 malloc, free / C++의 new, delete / Java의 new)에 의해 메모리가 할당되고 해제된다.
  • 유연한 크기: 스택보다 훨씬 큰 메모리 공간을 사용할 수 있으며, 필요한 만큼 크기를 할당받을 수 있다.
  • 상대적으로 느린 속도: 비어있는 적절한 공간을 찾아 할당하고, 나중에 해제하는 과정이 스택보다 복잡하여 속도가 느리다.

 


 

 

왜 개발자가 스택과 힙을 알아야 할까?

  • 성능 최적화: 스택 할당이 힙 할당보다 훨씬 빠릅니다. 성능에 민감한 코드에서는 가능한 스택 메모리를 활용하는 것이 유리할 수 있습니다.
  • 메모리 관련 오류 방지: 스택 오버플로우나 메모리 누수와 같은 치명적인 오류의 원인을 파악하고 예방하는 데 도움이 됩니다. 특히 C/C++ 개발자에게는 힙 메모리 관리가 매우 중요합니다.
  • 디버깅 효율 향상: 변수나 객체가 예상과 다른 값을 가지거나 프로그램이 비정상 종료될 때, 데이터가 스택과 힙 중 어디에 위치하는지 알면 문제 추적에 큰 도움이 됩니다.
  • 언어/프레임워크 이해: 사용하는 프로그래밍 언어나 프레임워크가 내부적으로 메모리를 어떻게 관리하는지 이해하면 더 효율적이고 안정적인 코드를 작성할 수 있습니다.

 

 

 

 

긴 글 읽어 주셔서 감사합니다!

 

저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

[로드밸런싱] Load Balancing이란? 서버 부하 분산의 방법  (0) 2025.05.03
[JWT] 토큰 인증에 대하여  (1) 2025.02.28
시간복잡도(Time Complexity) & 공간복잡도(Space Complexity)  (0) 2024.12.05
OOP vs FP 에 대하여..  (0) 2024.11.12
쿠키(Cookie)와 세션(Session)의 기본 개념  (0) 2024.10.13
'CS' 카테고리의 다른 글
  • [로드밸런싱] Load Balancing이란? 서버 부하 분산의 방법
  • [JWT] 토큰 인증에 대하여
  • 시간복잡도(Time Complexity) & 공간복잡도(Space Complexity)
  • OOP vs FP 에 대하여..
창MIN
창MIN
  • 창MIN
    미니의 코드
    만들고 도전하는것을 좋아합니다💻
  • Guest
    Gmail
    GitHub
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Google Cloud (6)
      • NodeJS (3)
      • NestJS (1)
      • Python (1)
      • DB (1)
      • Docker & Kubernetes (1)
      • Server & Infra (3)
      • CS (7)
      • Algorithm (2)
        • 개념 (2)
        • 문제 (0)
      • 개발 (0)
  • 인기 글

  • 태그

    쿠키와 세션의 개념
    redoc
    Cors
    cloud logging
    버킷 cors
    cors 작동
    Secret Manager
    signed url
    cloud buckets
    Cloud Function
    파일 무결성
    Google Cloud
    google api gateway
    cors 개념
    typeScript
    서버 부하
    서버 부하 분산
    Cloud Storage
    알고리즘
    nodejs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
창MIN
개발자를 위한 필수 메모리 지식: 스택(Stack)과 힙(Heap) 이해하기
상단으로

티스토리툴바