ArrayDeque
참고 링크
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayDeque.html
ArrayDeque
java.lang.Object
java.util.AbstractCollection<E>
java.util.ArrayDeque<E>
Serializable: 원격으로 객체를 전송, 파일 I/O 가능
Cloneable: Object 클래스의 clone() 메서드가 제대로 수행될 수 있음을 지정
Iterable<E>: forEech 구문 사용 가능
Collection<E>: 여러개의 데이터를 한 데이터에 담아 처리할 메서드를 지정
Deque<E>: Stack, Queue 와관련된 메소드 지정
Queue<E>: 큐를 처리하는 것과 관련된 메서드 지정,Deque기능이 사용중인 클래스와 호환된다.
동적 배열을 사용하여 데이터를 저장하는 Java 의 double-ended queue(양방향 큐) 이다.
내부적으로 데이터를 저장하고 관리하는 방식은 배열을 사용하되, 원형 배열처럼 동작하여 메모리 공간을 효율적으로 사용한다.
이를 통해 양쪽 끝에서 삽입과 삭제를 빠르게 수행할 수 있다.
// 스택처럼 사용
public class ArrayDequeStackExample {
public static void main(String[] args) {
Deque<Integer> stack = new ArrayDeque<>();
// 스택에 데이터 추가 (push)
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println("스택 내용: " + stack); // 출력: [30, 20, 10]
// 스택에서 데이터 제거 (pop)
int top = stack.pop();
System.out.println("pop된 값: " + top); // 출력: 30
// 스택 내용 확인
System.out.println("현재 스택: " + stack); // 출력: [20, 10]
}
}
// 큐처럼 사용
public class ArrayDequeQueueExample {
public static void main(String[] args) {
Deque<Integer> queue = new ArrayDeque<>();
// 큐에 데이터 추가 (offer)
queue.offer(10);
queue.offer(20);
queue.offer(30);
System.out.println("큐 내용: " + queue); // 출력: [10, 20, 30]
// 큐에서 데이터 제거 (poll)
int first = queue.poll();
System.out.println("poll된 값: " + first); // 출력: 10
// 큐 내용 확인
System.out.println("현재 큐: " + queue); // 출력: [20, 30]
}
}
Stack vs Deque(ArrayDeque)
Java 공식 문서에서도
Stack대신Deque를 사용하는 것을 권장하고 있다.Deque는 더 현대적이고 유연한 인터페이스를 제공하며,ArrayDeque는 스택과 큐의 특성을 모두 제공하기 때문에 훨씬 더 나은 대안이다.Stack 을 사용하지 말아야 하는 이유는 다음과 같다.
Java 에서
Vector는 메서드에는synchronized가 걸려있지만, 클래스 자체에는synchronized가 걸려있지 않기 때문에, 완벽한 Thread Safe 가 아니라고 할 수 있다. ->Vector는deprecated된 클래스이다.모든 작업에 Lock 이 사용된다.
단일 스레드 실행 성능이 저하 될 수 있다. -> Thread Safe 가 무조건 좋은 것은 아니다..
단순한 Iterator 의 탐색 작업에서도 get() 메서드 실행 시 매번 Lock 이 발생하게 되므로 오버헤드가 커진다.
추가적으로 Stack 은 Vector 상속받았기 때문에 다중 상속을 지원하지 않는다.
Last updated