본문 바로가기
카테고리 없음

콜 스택(Call Stack)은 어떻게 동작할까

by by_merry 2026. 5. 8.

이벤트 루프까지 이해하고 나면 자연스럽게 따라오는 개념이 있다. 바로 콜 스택(Call Stack)이다. 사실 콜 스택은 특별한 기술이라기보다, 프로그램이 실행되는 가장 기본적인 구조에 가깝다. 나도 처음에는 그냥 “함수 실행 순서 관리하는 거겠지” 정도로만 생각했는데, 이걸 제대로 이해하고 나니까 코드가 어떻게 돌아가는지 훨씬 또렷하게 보이기 시작했다.

 

콜 스택은 함수 실행 순서를 관리하는 구조다

콜 스택은 말 그대로 ‘스택(Stack)’ 구조를 사용한다. 스택은 가장 나중에 들어온 것이 가장 먼저 나가는 구조(LIFO, Last In First Out)다. 이 구조를 이용해서 함수 실행 순서를 관리한다.

예를 들어 함수 A 안에서 함수 B를 호출하면, 먼저 A가 실행되다가 멈추고 B가 스택 위에 쌓인다. 그리고 B가 끝나면 다시 A로 돌아가서 이어서 실행된다.

이걸 처음 이해했을 때 꽤 직관적이라고 느꼈다. 실제로 코드 실행 순서를 머릿속으로 따라가다 보면, 자연스럽게 “쌓였다가 빠지는” 느낌이 들기 때문이다.

나도 간단한 함수 호출 구조를 직접 그려보면서 이해했는데, 스택처럼 쌓이는 모습을 보니까 코드 흐름이 훨씬 명확해졌다.

함수가 실행될 때마다 스택에 쌓이고, 끝나면 제거된다

콜 스택의 핵심 동작은 단순하다. 함수가 호출되면 스택에 쌓이고(push), 실행이 끝나면 스택에서 빠진다(pop). 이 과정이 반복되면서 프로그램이 실행된다.

예를 들어 이런 구조를 생각해보면 이해가 쉽다.

  • main 함수 실행 → 스택에 추가
  • main에서 함수 A 호출 → A가 스택 위에 추가
  • A에서 함수 B 호출 → B가 스택 위에 추가
  • B 실행 완료 → 스택에서 제거
  • A 실행 완료 → 스택에서 제거
  • main 계속 실행

이 순서를 이해하고 나니까, 왜 함수가 중간에 멈췄다가 다시 이어서 실행되는지 자연스럽게 이해됐다.

특히 디버깅할 때 콜 스택을 보면 현재 어떤 함수가 실행 중인지 한눈에 보이는데, 이 구조를 알고 보니까 훨씬 이해하기 쉬웠다.

콜 스택이 넘치면 에러가 발생한다 (Stack Overflow)

콜 스택은 무한정 쌓일 수 있는 구조가 아니다. 일정 크기가 정해져 있기 때문에, 너무 많은 함수 호출이 쌓이면 문제가 발생한다. 이게 바로 스택 오버플로우(Stack Overflow)다.

대표적인 예가 재귀 함수다. 종료 조건 없이 계속 자기 자신을 호출하면, 스택에 계속 쌓이기만 하고 빠지지 않는다. 결국 일정 크기를 넘어서면 프로그램이 에러를 발생시키고 멈춘다.

나도 예전에 간단한 재귀 함수를 작성하다가 프로그램이 갑자기 멈춰버린 적이 있었는데, 그게 바로 이 경우였다. 그때는 이유를 몰랐는데, 나중에 보니까 콜 스택이 꽉 차버린 상황이었다.

이 경험 이후로는 재귀를 사용할 때 반드시 종료 조건을 먼저 생각하게 됐다.

한 줄로 정리하면 콜 스택은 함수 호출 순서를 관리하는 구조로, 함수가 실행될 때 쌓이고 끝나면 제거되며, 이 구조 덕분에 프로그램의 실행 흐름이 유지된다.