Home / AI / AI 용어사전 / 스택(Stack) — 함수 호출과 실행 순서를 관리하는 자료 구조
TERM
스택(Stack) — 함수 호출과 실행 순서를 관리하는 자료 구조
On this page
함수 A가 함수 B를 호출하고, B가 C를 호출한다. C가 완료되면 B로 돌아가고, B가 완료되면 A로 돌아간다. 이 순서를 관리하는 자료 구조가 스택(Stack)이다. LIFO(Last In, First Out) — 마지막에 들어온 것이 먼저 나간다.
정의
스택(Stack)은 데이터를 순서대로 쌓고, 꺼낼 때 항상 맨 위(Top)에서만 작업하는 자료 구조다. LIFO(Last In, First Out) 원칙을 따른다. 현실 예로는 접시를 쌓는 구조를 들 수 있다. 맨 위 접시부터 꺼내야 하는 것처럼, 스택도 마지막에 추가한 항목을 가장 먼저 꺼낸다. 두 가지 핵심 연산은 Push(맨 위에 추가)와 Pop(맨 위에서 제거)이다.
함수 호출 스택 — 콜 스택(Call Stack)
프로그램 실행 시 런타임은 함수 호출을 관리하기 위해 콜 스택(Call Stack)을 사용한다.
def c():
return 42
def b():
return c()
def a():
return b()
a()실행 순서는 다음과 같다.
1. a() 호출 → 스택에 a 프레임 추가 2. a 내부에서 b() 호출 → 스택에 b 프레임 추가 3. b 내부에서 c() 호출 → 스택에 c 프레임 추가 4. c 완료 → 스택에서 c 프레임 제거, b로 반환 5. b 완료 → b 제거, a로 반환 6. a 완료 → a 제거
재귀(recursion) 함수가 탈출 조건(Base Case) 없이 계속 호출되면 스택이 가득 차 스택 오버플로우(Stack Overflow) 오류가 발생한다. 오류 메시지에서 RecursionError: maximum recursion depth exceeded가 나타나는 원인이 바로 이것이다.
브라우저 히스토리와 실행 취소
스택 구조는 개발 외 영역에서도 쓰인다.
- 브라우저 뒤로가기: 방문한 페이지를 스택에 쌓고, 뒤로가기 시 마지막 페이지부터 제거
- 실행 취소(Undo): 작업 기록을 스택에 저장하고, 취소 시 마지막 작업부터 되돌림
- JSON·수식 파싱: 중괄호·괄호의 쌍을 검증할 때 스택으로 열고 닫는 괄호를 매칭
def is_balanced(s):
stack = []
pairs = {')': '(', ']': '[', '}': '{'}
for ch in s:
if ch in '([{':
stack.append(ch)
elif ch in ')]}':
if not stack or stack[-1] != pairs[ch]:
return False
stack.pop()
return len(stack) == 0
print(is_balanced("({[]})")) # True
print(is_balanced("({[})")) # FalseAI 에이전트 실행 흐름에서의 스택
AI 에이전트는 복합 작업을 처리할 때 스택과 유사한 방식으로 하위 작업(Subtask)을 관리한다. 메인 작업이 하위 작업을 호출하고, 하위 작업 완료 후 메인 작업으로 제어가 반환된다. 재귀(recursion) 기반 트리 탐색, 체인형 도구 호출, 함수형 프로그래밍의 함수 합성 모두 스택 원리에 기반한다.
스택 자료 구조는 큐(queue)와 함께 모든 알고리즘 교육의 기초로 다뤄진다. 두 개념을 비교해 이해하면 데이터 흐름 설계에서 선택 기준이 명확해진다.
관련 용어
- queue — FIFO 구조의 자료 구조 (먼저 들어온 것이 먼저 나옴)
- recursion — 함수가 자기 자신을 호출하는 패턴
- call-stack — 함수 호출 순서를 관리하는 런타임 스택
- heap — 동적으로 할당되는 메모리 영역
- dfs — 깊이 우선 탐색, 스택 기반 그래프 탐색 알고리즘