개발노하우

스택(stack)과 힙(heap)의 차이점

VictorGoodDays 2025. 1. 14. 13:49
 

스택(stack)과 힙(heap)은 프로그램 실행 중 메모리를 관리하는 주요 방식입니다. 이 둘의 차이점을 이해하면 효율적인 메모리 사용과 디버깅에 도움이 됩니다.

 

 

1. 스택 (Stack)

특징

  1. 메모리 구조:
    • LIFO (Last In, First Out) 방식으로 데이터를 관리.
    • 메모리가 연속적으로 할당됨.
  2. 속도:
    • 매우 빠르며, 메모리 할당과 해제가 자동으로 이루어짐.
  3. 범위:
    • 함수 내에서 선언된 지역 변수와 함수 호출 스택(예: 매개변수, 반환 주소 등)에 사용.
  4. 생명 주기:
    • 변수가 선언된 블록을 벗어나면 메모리가 자동으로 해제됨.
  5. 크기 제한:
    • 스택의 크기는 시스템에 의해 제한되며 상대적으로 작음.

장점

  • 자동으로 메모리를 관리하므로 메모리 누수 위험이 적음.
  • 빠른 메모리 접근 속도.

단점

  • 제한된 메모리 크기.
  • 데이터 크기와 생명 주기가 제한적(블록 범위 내).

사용 예

c
코드 복사
void example() { int x = 10; // x는 스택에 저장 int y = 20; printf("%d, %d\n", x, y); }
  • x와 y는 함수 실행 중 스택에 저장되며, 함수가 끝나면 메모리가 해제됨.

2. 힙 (Heap)

특징

  1. 메모리 구조:
    • 동적으로 할당된 메모리.
    • 메모리가 불연속적으로 할당될 수 있음.
  2. 속도:
    • 메모리 할당과 해제가 스택에 비해 느림.
  3. 범위:
    • 개발자가 명시적으로 메모리를 할당(malloc)하고 해제(free)해야 함.
  4. 생명 주기:
    • 명시적으로 해제하지 않으면 프로그램 종료 시까지 메모리가 유지됨.
  5. 크기 제한:
    • 시스템의 가용 메모리에 의존하므로 상대적으로 크기가 큼.

장점

  • 큰 데이터 구조나 수명이 긴 데이터에 적합.
  • 메모리 크기와 생명 주기를 개발자가 제어 가능.

단점

  • 메모리 누수(할당 후 해제하지 않음) 위험.
  • 동적 할당은 시간이 더 걸림.

사용 예

c
코드 복사
#include <stdlib.h> #include <stdio.h> void example() { int *ptr = (int *)malloc(sizeof(int)); // 힙에 메모리 할당 if (ptr == NULL) { printf("Memory allocation failed\n"); return; } *ptr = 42; // 힙 메모리에 값 저장 printf("%d\n", *ptr); free(ptr); // 메모리 해제 }
  • ptr이 가리키는 메모리는 힙에 위치하며, free로 해제하지 않으면 메모리 누수가 발생.

3. 차이점 비교

특징스택(Stack)힙(Heap)

할당 방식 컴파일러에 의해 자동 할당 명시적으로 malloc/free 사용
속도 빠름 느림
생명 주기 함수 블록 내에서만 유지 개발자가 직접 관리
크기 제한 상대적으로 작음 상대적으로 큼
관리 방식 시스템 자동 관리 개발자 수동 관리
사용 용도 지역 변수, 함수 호출 정보 동적 데이터 구조, 큰 크기의 데이터
에러 가능성 스택 오버플로우(Stack Overflow) 메모리 누수(Memory Leak)

4. 요약

  • 스택은 고속, 제한된 메모리 크기, 자동 관리가 필요한 지역 변수에 적합.
  • 은 유연성, 큰 데이터 관리, 동적 메모리 할당이 필요한 경우에 적합.

효율적인 메모리 관리를 위해 각 상황에 맞는 적절한 메모리 사용 방식을 선택하세요!