Stack
Stack (스택)
1. 개요
스택(Stack)은 데이터의 삽입과 삭제가 한쪽 끝에서만 이루어지는 선형 자료구조로, 가장 나중에 들어온 데이터가 가장 먼저 나가는 LIFO(Last-In-First-Out, 후입선출) 원리를 따르는 추상 데이터 타입(ADT, Abstract Data Type)이다.
이해를 돕기 위한 대표적인 비유로 '쌓여 있는 접시'를 들 수 있다. 접시를 쌓을 때는 맨 위에 놓아야 하며, 접시를 꺼낼 때도 가장 위에 있는(가장 최근에 놓은) 접시부터 가져가야 하는 구조와 동일하다. 이러한 특성 때문에 스택은 작업의 역순 추적이 필요한 알고리즘이나 함수 호출 관리 등에 필수적으로 사용된다.
2. 주요 연산 및 동작 원리
스택은 매우 단순한 인터페이스를 가지며, 모든 연산은 스택의 최상단인 Top에서만 발생한다.
2.1 핵심 연산
| 연산 | 정의 | 시간 복잡도 | 상태 변화 |
|---|---|---|---|
| Push | 스택의 최상단(Top)에 새로운 데이터를 추가함 | $O(1)$ | Top 포인터 증가 $\rightarrow$ 데이터 삽입 |
| Pop | 스택의 최상단(Top)에 있는 데이터를 제거하고 반환함 | $O(1)$ | 데이터 추출 $\rightarrow$ Top 포인터 감소 (비어있을 시 Underflow 발생) |
| Peek / Top | 최상단 데이터를 제거하지 않고 값만 확인함 | $O(1)$ | 상태 변화 없음 |
| isEmpty | 스택이 비어 있는지 여부를 확인함 | $O(1)$ | Boolean 값 반환 |
3. 구현 방법
스택은 물리적 저장 방식에 따라 크게 두 가지 방법으로 구현할 수 있다.
3.1 배열(Array) 기반 구현 (정적 구현)
- 특징: 고정된 크기의 배열을 사용하여 구현한다.
- 장점: 인덱스를 통한 접근이 빨라 구현이 매우 간단하고 메모리 오버헤드가 적다.
- 단점: 선언 시 크기를 지정해야 하므로, 스택이 가득 찼을 때 데이터를 더 넣을 수 없는 '스택 오버플로우' 위험이 있으며, 메모리 낭비가 발생할 수 있다.
3.2 연결 리스트(Linked List) 기반 구현 (동적 구현)
- 특징: 노드(Node) 간의 연결을 통해 데이터를 저장한다.
- 장점: 메모리가 허용하는 한 동적으로 크기를 확장할 수 있어 유연하다.
- 단점: 각 데이터마다 다음 노드를 가리키는 포인터 공간이 추가로 필요하여 메모리 사용량이 증가하며, 포인터 조작으로 인해 배열보다 약간의 오버헤드가 발생한다.
3.3 Python 구현 예시
# Python의 list는 동적 배열이므로, 아래 구현은 동적 크기 조절이 가능한 스택입니다.
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item) # 리스트의 끝에 추가
def pop(self):
if not self.is_empty():
return self.items.pop() # 리스트의 끝에서 제거 및 반환
raise IndexError("Stack is empty (Underflow)")
def peek(self):
if not self.is_empty():
return self.items[-1]
return None
def is_empty(self):
return len(self.items) == 0
# 사용 예시
s = Stack()
s.push(10)
s.push(20)
print(s.pop()) # 출력: 20
4. 시간 및 공간 복잡도 분석
스택은 데이터의 삽입과 삭제가 항상 한쪽 끝에서만 일어나므로 매우 효율적인 성능을 보인다.
- 시간 복잡도:
- 삽입(Push): $O(1)$
- 삭제(Pop): $O(1)$
- 조회(Peek): $O(1)$
- 탐색(Search): $O(n)$ (특정 요소를 찾기 위해 모든 요소를 Pop 해야 함)
- 공간 복잡도:
- $O(n)$ (저장하는 데이터의 개수 $n$에 비례하여 메모리 사용)
5. 큐(Queue)와의 차이점 비교
스택과 큐는 모두 선형 자료구조이지만, 데이터가 나가는 순서에서 결정적인 차이가 있다.
| 구분 | 스택 (Stack) | 큐 (Queue) |
|---|---|---|
| 원리 | LIFO (Last-In-First-Out) | FIFO (First-In-First-Out) |
| 입출력 지점 | 한쪽 끝(Top)에서만 입출력 | 한쪽(Rear)으로 입력, 반대쪽(Front)으로 출력 |
| 비유 | 쌓여 있는 접시, 프링글스 과자통 | 편의점 음료수 진열대, 대기열(줄 서기) |
| 주요 용도 | 되돌리기, 함수 호출 관리, DFS | 프로세스 스케줄링, 캐시 구현, BFS |
6. 메모리 영역에서의 스택 (Stack Segment)
컴퓨터 구조에서 프로세스가 실행될 때 할당받는 메모리 영역 중 하나인 스택 세그먼트(Stack Segment)는 프로그램의 실행 흐름을 제어하는 핵심적인 역할을 한다.
6.1 스택 프레임 (Stack Frame)
함수가 호출될 때마다 해당 함수만을 위한 독립적인 메모리 공간인 스택 프레임이 생성되어 스택에 쌓인다. 스택 프레임에는 다음과 같은 정보가 저장된다. - 지역 변수(Local Variables): 함수 내부에서 선언된 변수. - 매개변수(Parameters): 함수로 전달된 인자 값. - 리턴 주소(Return Address): 함수 종료 후 돌아가야 할 원래 코드의 위치.
6.2 동작 과정
- 함수 호출: 새로운 스택 프레임이
Push되어 현재 실행 지점 위에 쌓인다. - 함수 실행: 해당 프레임 내의 지역 변수와 매개변수를 사용하여 연산을 수행한다.
- 함수 종료: 실행이 완료되면 해당 스택 프레임이
Pop되어 제거되며, 저장된 리턴 주소를 통해 이전 함수로 복귀한다.
7. 주요 활용 사례
스택은 "최근의 상태를 기억했다가 되돌아가는" 모든 로직에 활용된다.
7.1 사례별 동작 과정
- 웹 브라우저 뒤로 가기
Push: 페이지 A $\rightarrow$ 페이지 B $\rightarrow$ 페이지 C 순으로 방문 기록 저장Pop: '뒤로 가기' 클릭 시 페이지 C 제거 $\rightarrow$ 페이지 B 노출- 수식의 괄호 검사
Push: 여는 괄호(발견 시 스택에 삽입Pop: 닫는 괄호)발견 시 스택에서(를 제거결과: 최종적으로 스택이 비어 있으면 괄호 짝이 맞는 것으로 판정- 후위 표기법(Postfix Notation) 계산
Push: 피연산자(숫자) 발견 시 스택에 삽입Pop: 연산자 발견 시 스택에서 피연산자 2개를 꺼내 연산 후 결과를 다시Push
7.2 기타 활용
- 재귀 알고리즘과 DFS:
- 재귀 함수는 호출될 때마다 시스템 스택에 스택 프레임을 쌓으며 동작한다.
- 깊이 우선 탐색(DFS)은 그래프의 한 경로를 끝까지 탐색한 후, 다시 되돌아와 다른 경로를 찾아야 한다. 이때 '되돌아갈 지점'을 기억하기 위해 스택 구조를 사용하며, 재귀 함수를 이용한 DFS 구현은 시스템 스택을 통해 이 과정을 자동으로 처리한다.
- 텍스트 에디터의 Undo(되돌리기): 사용자의 작업 이력을 스택에 저장하여 최신 작업부터 취소한다.
8. 스택 오버플로우 (Stack Overflow)
스택 오버플로우란 스택 영역에 할당된 메모리 용량을 초과하여 데이터를 삽입하려고 할 때 발생하는 런타임 에러이다.
8.1 주요 원인 및 사례
- 무한 재귀 호출 (Infinite Recursion): 종료 조건이 잘못 설정된 재귀 함수가 계속해서 자신을 호출하여 스택 프레임을 무한히 생성할 때 발생한다.
- 예:
def recurse(): recurse()와 같이 기저 사례(Base Case)가 없는 함수 호출 - 과도한 지역 변수 선언: 함수 내에서 매우 큰 크기의 배열을 지역 변수로 선언하여 한 번의 함수 호출만으로도 스택 용량을 초과하는 경우 발생한다.
- 예: 스택 메모리가 1MB인데, 함수 내에서
int arr[1000000](약 4MB)를 선언하는 경우
8.2 해결 방안
- 재귀 조건 검토: 재귀 함수의 기저 사례(Base Case)가 정확히 정의되었는지 확인한다.
- 반복문 전환: 재귀 구조를
while이나for문을 이용한 반복문 구조로 변경하여 스택 사용량을 줄인다. - 힙(Heap) 영역 활용: 큰 데이터는 지역 변수가 아닌 동적 할당(malloc, new 등)을 통해 힙 영역에 저장한다.
분류: 기술 / 컴퓨터구조 / 메모리영역
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.