카테고리 없음
자바 공부#2_04. Stack
코딩연습중
2025. 4. 6. 13:56
Stack?
Stack은 한쪽 끝에서만 데이터를 추가하거나 삭제할 수 있는 자료구조이다. 후입선출(Last-In-First-Out, LIFO)의 구조를 가진다. 가장 마지막에 추가된 요소가 가장 먼저 제거된다.
Java에서는 Stack을 구현하기 위해 java.util.Stack 클래스를 사용할 수 있다. 하지만 Stack 클래스는 오래된 Vector 기반이기 때문에, 최근에는 성능이 더 좋은 Deque 계열의 ArrayDeque 또는 LinkedList로 대체하는 경우가 많다.
1. Stack의 주요 메서드
- push(E item) : 데이터를 스택에 추가한다.
- pop() : 가장 마지막에 들어간 데이터를 제거하고 반환한다.
- peek() : 데이터를 제거하지 않고, 가장 위에 있는 데이터를 반환한다.
- empty() : 스택이 비어있는지 여부를 확인한다.
- search(Object o) : 해당 객체가 스택에서 몇 번째에 있는지 반환한다 (1부터 시작). 못 찾으면 -1 반환.
Stack 사용 예시
- 괄호의 유효성 검사
- 웹 브라우저의 뒤로가기 기능
- 재귀적 연산 (ex. DFS)
- 수식 계산기 (후위표기법 등)
Stack의 시간복잡도
| push() | O(1) |
| pop() | O(1) |
| peek() | O(1) |
| search() | O(n) |
2. Stack vs ArrayDeque vs LinkedList
| 내부 구조 | 동기화 | 성능 | 특징 | |
| Stack | Vector 기반 | O | 느림 | 동기화 지원. 오래된 방식 |
| ArrayDeque | 배열 기반 | X | 빠름 | 가장 많이 사용됨. Null 불가 |
| LinkedList | 연결 리스트 | X | 느림 | 요소 간 삽입/삭제에 유리 |
사용 시 주의할 점
- Stack 클래스는 동기화를 지원하기 때문에 멀티스레드 환경에서는 유용할 수 있으나, 단일 스레드 환경에서는 오히려 성능 저하 요인이 될 수 있다.
- ArrayDeque는 스택/큐 양방향 모두 지원하며 null 값을 허용하지 않는다.
- LinkedList는 스택으로도 사용할 수 있지만 메모리 사용량이 많고 성능이 좋지 않을 수 있다.
필요에 따라 Stack의 구현체는 목적에 맞게 선택하는 것이 중요하다. 단순한 스택 구조가 필요하다면 ArrayDeque를 사용하는 것이 일반적이다.