
자료구조는 프로그래밍의 기초이자 핵심입니다. 그 중에서도 스택(Stack)은 가장 기본적이면서도 강력한 자료구조 중 하나입니다. 이 글에서는 스택의 기본 개념부터 Java와 Python에서의 구현 방법까지, 실무에서 바로 활용할 수 있는 지식을 제공합니다.
스택은 후입선출(LIFO: Last In, First Out) 원칙을 따르는 선형 자료구조입니다. 쉽게 말해, 가장 나중에 들어온 데이터가 가장 먼저 나가는 구조를 가집니다.
스택은 다양한 실제 애플리케이션에서 활용됩니다:
메모리 관리
브라우저 기능
문서 편집기
컴파일러
Java에서는 스택을 구현하는 두 가지 주요 방법이 있습니다:
Stack<Integer> stack = new Stack<>();
stack.push(1); // 데이터 삽입
int top = stack.pop(); // 데이터 추출
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 데이터 삽입
int top = stack.pop(); // 데이터 추출
Python에서는 리스트를 사용하여 스택을 쉽게 구현할 수 있습니다:
stack = []
stack.append(1) # push: 데이터 삽입
top = stack.pop() # pop: 데이터 추출
from collections import deque
stack = deque()
stack.append(1) # push: 데이터 삽입
top = stack.pop() # pop: 데이터 추출
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("pop from empty stack")
def peek(self):
if not self.is_empty():
return self.items[-1]
raise IndexError("peek from empty stack")
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)
# 사용 예시
stack = Stack()
stack.push(1)
stack.push(2)
print(stack.pop()) # 출력: 2
print(stack.peek()) # 출력: 1
| 언어 | 권장 구현체 | 이유 |
|---|---|---|
| Java | Deque 인터페이스 | LIFO 원칙 준수, 성능 최적화 |
| Python | collections.deque | O(1) 시간 복잡도, 스레드 안전성 |
Vector 상속으로 인한 문제
성능 이슈
LIFO 원칙 준수
유연한 구현체 선택
ConcurrentLinkedDequeArrayDeque스택 크기 관리
스레드 안전성
ConcurrentLinkedDeque(Java) 사용ArrayDeque(Java) 또는 deque(Python) 사용성능 최적화
스택은 단순하면서도 강력한 자료구조입니다. Java에서는 Stack 클래스보다 Deque 인터페이스를 사용하는 것이 더 현대적이고 효율적인 방법입니다. 특히 실무에서는 스레드 안전성과 성능을 고려하여 적절한 구현체를 선택하는 것이 중요합니다.
Deque 인터페이스를 사용하여 스택을 구현하는 것이 권장됩니다.