Stack 클래스가 상속하고 있는 Vector가 문제가 되기 때문에 Deque 사용을 권장한다.
❌ Stack<Integer> stack = new Stack<>();
⭕ Deque<Integer> stack = new ArrayDeque<Integer>();
Vector는 자바 버전 1부터 있었던 굉장히 오래된 클래스이기 때문에 여러모로 취약점이 많다.
1️⃣Stack은 Vector를 상속받아 구현되어 있다.
- 상속으로 부모 메서드를 공유하기 때문에 Stack을 사용자가 잘못되게 사용할 수 있는 문제가 발생한다.
- Vector에는 원하는 index에 객체를 끼워 넣을 수 있는 insertElementAt이라는 메서드가 존재한다.
- 문제는 Stack이 Vector를 상속받았기 때문에 insertElementAt 사용이 가능하다는 점이다.
- 후입 선출이 보장되어야 하는 Stack에서 중간에 값이 삽입, 삭제될 수도 있는 상황이 발생하게 된다.
2️⃣Stack을 생성할 때 용량에 대한 설정이 불가능하고 Vector의 초기 용량인 10을 그대로 사용하여 크기가 큰 Stack을 자주 생성하게 되므로 성능적 손해가 발생한다.
3️⃣Vector 메서드는 메서드들이 synchronized 하게 구현되어 멀티 스레드 환경에서 안전(thread-safe)하도록 구현되어 있으나 이 때문에 단일 스레드 환경에서 성능 저하가 발생할 수 있다.
4️⃣또한 java 공식 문서에서도 Stack 보다 Deque로 구현할 것을 권장하고 있다
A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class.
더 완전하고 일관된 LIFO(후입선출) 스택 연산 집합은 Deque 인터페이스와 그 구현체에서 제공되며, 이 클래스보다 Deque를 사용하는 것이 권장됩니다.
Stack (Java Platform SE 8 )
The Stack class represents a last-in-first-out (LIFO) stack of objects. It extends class Vector with five operations that allow a vector to be treated as a stack. The usual push and pop operations are provided, as well as a method to peek at the top item o
docs.oracle.com
💡여러 가지 원인들을 종합하여 Deque로 Stack을 구현하는 것을 권장합니다!
그렇다면 멀티 스레드 환경에서는 백터를 사용해야 하는 건가?
그렇지도 않다...! Vector의 동기화 자체에도 문제가 많다.
Vector의 동기화는 메서드에만 synchornized 키워드로 되어 있어 메서드 자체 실행에는 안전하지만
Vector 인스턴스 객체 자체에는 동기화가 되어 있지 않아 동시다발적으로 객체에 접근해 메서드 호출이 가능한 문제점을 보유하고 있다. 결국 Vector를 사용할 이유가 성능적, 동기화적 이유가 없는 것이다.
'Backend > Java' 카테고리의 다른 글
[Java] 배열 복사 메서드 간단 정리 (0) | 2025.07.15 |
---|---|
[Java, String] split() 메서드 정리 - 문자열 자르기 (0) | 2025.07.13 |
[Java] StringTokenizer 란? (0) | 2025.07.10 |
[Java] BufferedReader, BufferedWriter 란? (0) | 2025.07.10 |
[Java] 정렬 알고리즘 정리 (1) | 2025.07.02 |