🧭 개요
최근 알고리즘 문제를 풀면서 자연스럽게 Stack이나 Queue를 사용하는 일이 많아졌습니다.
그 과정에서 Java에서는 이들 대신 Deque 사용을 권장한다는 내용을 접하게 되었고,
처음엔 “왜 굳이?”라는 의문이 들었습니다.
자세히 알아보니 생각보다 명확한 이유들이 있었고, 앞으로 실무에서도 도움이 될 것 같다는 생각이 들어
이번 기회에 Stack, Queue, Deque의 차이점과 왜 Deque가 권장되는지를 정리해보려 합니다.
📚 내용
1. Stack 클래스의 문제점
Java에서 Stack은 LIFO(후입선출) 구조를 제공하지만, 다음과 같은 단점이 존재합니다:
- 레거시 클래스: Stack은 JDK 1.0 시절부터 존재하는 오래된 클래스입니다.
- Vector 기반 구현: Stack은 Vector를 상속받고 있는데, Vector는 모든 메서드가 synchronized로 동기화되어 있습니다.
- 이는 단일 스레드 환경에서는 불필요한 성능 오버헤드로 이어집니다.
- 사용성이 제한적: 유연한 큐/스택 동작을 지원하지 않고, 일부 메서드명이 직관적이지 않습니다.
Stack<String> stack = new Stack<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop()); // B
2. Queue의 다양한 구현체
Queue는 인터페이스이기 때문에 다양한 구현체가 존재합니다:
- LinkedList: 연결 리스트 기반, 일반적인 큐 역할 가능
- PriorityQueue: 우선순위 기반 큐 (Heap 사용), Deque로 대체 불가
- ArrayDeque: 배열 기반 양방향 큐, 가장 많이 권장됨
✅ 주의: Queue 구현체 중 Vector 기반은 없습니다. Vector 기반은 오직 Stack만 해당됩니다.
3. Deque가 권장되는 이유
Java의 Deque(Double-Ended Queue) 인터페이스는 양쪽 끝에서 삽입/삭제가 가능한 큐로,
Stack과 Queue의 기능을 모두 지원합니다.
- push(), pop() → LIFO (스택처럼 사용)
- offer(), poll() → FIFO (큐처럼 사용)
특히 ArrayDeque는 다음과 같은 장점이 있습니다:
- 동기화 없는 구현으로 Stack보다 빠름
- 메모리 오버헤드가 낮고, LinkedList보다 빠를 수 있음
- Null 요소를 허용하지 않아 NPE를 방지
Deque<String> stack = new ArrayDeque<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop()); // B
Deque<String> queue = new ArrayDeque<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // A
4. 우선순위 큐는 예외
하나 유의할 점은, 우선순위 큐의 경우에는 Deque로 대체할 수 없습니다.
PriorityQueue는 내부적으로 힙(Heap) 구조로 되어 있으며,
데이터를 삽입할 때 자동 정렬되기 때문에 앞/뒤 삽입 개념의 Deque와는 성격이 완전히 다릅니다.
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(3);
pq.offer(1);
pq.offer(2);
System.out.println(pq.poll()); // 1 (가장 낮은 숫자 우선)
✅ 정리
- Java에서는 더 이상 Stack을 권장하지 않고, 대신 ArrayDeque를 사용해 LIFO 구조를 구현하는 것이 좋다.
- Vector 기반인 Stack은 동기화로 인한 성능 저하, 유연성 부족 등 단점이 있다.
- Deque는 Stack과 Queue의 장점을 모두 가진 유연한 자료구조다.
- 단, 우선순위 큐는 여전히 PriorityQueue를 사용해야 하며, Deque로 대체할 수 없다.
🔗 참고 링크
'개발메모 > 간단정리' 카테고리의 다른 글
[간단정리] RDBMS, NoSQL 특징 및 차이점 (1) | 2024.08.06 |
---|---|
[간단정리] 객체 지향 프로그래밍 SOLID 원칙 (0) | 2024.07.19 |
[간단정리] {JSON}, <XML> 이란? (0) | 2024.07.18 |
[간단정리] 메세지 큐(Message Queue)란? (1) | 2024.07.13 |
[간단정리] Domain, Host, URL, URI 용어 정리 (1) | 2024.06.29 |