Deque를 찾아볼 시점이면 이미 stack(스택) 혹은 Queue(큐)가 무엇인지 알고 왔을것혹시 모르는 분이 계신다면, 아래의 링크를 확인하고 오면 이해가 휠씬 쉬울 것이다.
[Java] 스택(stack) 클래스 정리 & 사용법 / [Java] Queue(큐) 클래스 정리 & 사용법
Deque(덱/ 데크)란, Double Ended Queue라는 뜻으로, 즉 끝점이 두개인 큐라고 직역할 수 있을 것 같다.
그래서 의미 그대로 Deque는 양방향으로 열려있는 선형 자료구조로 stack과 queue 모두를 사용할 수 있다.
하지만! stack과 queue와는 다르게 FIFO, LIFO와 같은 순서에 얽매이지 않는다.
그 이유는 큐의 양쪽에서 요소의 삽입/ 삭제가 이루어지기 때문이다.
즉, Deque은 사용자의 조건에 따라 stack처럼 사용할 수도, queue처럼 사용할 수 있다.
특히 Deque에서 한 쪽에서만 입력할 수 있도록 설정한 Deque을 스크롤(scroll)이라고 하며, 한 쪽에서만 출력할 수 있도록 설정한 Deque을 셀프(self)라고 한다.
Deque는 queue와 같이 인터페이스로 정의되어 있는데, 이를 구현한 클래스에는
ArrayDeque, LinkedBlockingDeque, ConcurrentLinkedDeque, LinkedList 등이 존재한다.
여기서 ArrayDeque는 stack클래스에서 봤을 수 있다.
그 이유로는 stack클래스가 vector 클래스를 상속받으면서 발생하는 문제로 인해
공식API에서도 ArrayDeque를 사용하라고 했기 때문이다.
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.LinkedBlockingDeque;
Deque<String> deque_linkedList = new LinkedList<>();
Deque<String> deque_arrayDeque = new ArrayDeque<>();
Deque<String> deque_concurrentLinkedDeque = new ConcurrentLinkedDeque<>();
Deque<String> deque_LinkedBlockingDeque = new LinkedBlockingDeque<>();
첫 번째 칸부터 넣기(왼쪽 방향)
Type | Method | 설명 |
---|---|---|
void | addFirst(E e) | 용량 제한을 위반하지 않고 삽입이 가능한 경우 덱 앞에 요소를 삽입하고 |
현재 덱에 공간이 없다면 IllegalStateException 예외를 반환 | ||
boolean | offerFirst(E e) | 용량 제한을 위반하지 않는 한 덱 앞에 요소를 삽입 성공시 true 반환, |
용량 제한이 걸리는 경우 false를 리턴 |
마지막 칸부터 넣기(오른쪽 방향)
Type | Method | 설명 |
---|---|---|
void | addLast(E e) | 용량 제한을 위반하지 않고 삽입이 가능한 경우 덱 끝에 요소를 삽입하고 |
현재 덱에 공간이 없다면 IllegalStateException 예외를 반환 | ||
boolean | add(E e) | 용량 제한을 위반하지 않고 수행 가능시, 덱 끝에 요소를 삽입하고 성공시 true를 반환, |
현재 덱에 공간이 없다면 IllegalStateException 예외를 반환 | ||
boolean | offerLast(E e) | 용량 제한을 위반하지 않는 한 덱 끝에 요소를 삽입 |
boolean | offer(E e) | 용량 제한을 위반하지 않고 삽입이 가능하면 덱 끝에 요소를 삽입하고 성공시 true를 반환, |
현재 덱에 공간이 없다면 false를 반환 |
첫 번쨰 칸부터 삭제(왼쪽 방향)
Type | Method | 설명 |
---|---|---|
E | remove() | 덱의 대기열의 헤드(왼쪽 방향)를 삭제한 후 해당 값을 반환 |
만약 덱이 비어있다면 NoSuchElementException 예외 반환 | ||
E | removeFirst() | 덱의 첫 번째 요소를 삭제한 후 해당 값을 반환 |
만약 덱이 비어있다면 NoSuchElementException 예외 반환 | ||
E | poll() | 덱의 대기열의 헤드(왼쪽 방향)를 삭제한 후 해당 값을 반환, |
하지만 덱이 비어있다면 null을 반환 | ||
E | pollFirst() | 덱의 첫 번째 요소를 텍스트삭제한 후 해당 값을 반환, |
하지만 덱이 비어있다면 null을 반환 |
마지막 칸부터 삭제(오른쪽 방향)
Type | Method | 설명 |
---|---|---|
E | removeLast() | 덱의 마지막 요소(오른쪽 방향)를 삭제한 후 해당 값을 반환 |
만약 덱이 비어있다면 NoSuchElementException 예외 반환 | ||
E | pollLast() | 덱의 마지막 요소(오른쪽 방향)를 삭제한 후 해당 값을 반환, |
하지만 덱이 비어있다면 null을 반환 |
첫 번쨰 칸부터 검색(왼쪽 방향)
Type | Method | 설명 |
---|---|---|
E | getFirst() | 덱의 대기열의 헤드(왼쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다. |
만약 덱이 비어있다면 NoSuchElementException 예외 반환 | ||
E | peek() | 덱의 대기열의 헤드(왼쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다. |
만약 덱이 비어있다면 null 반환 | ||
E | peekFirst() | 덱의 대기열의 헤드(왼쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다. |
만약 덱이 비어있다면 null 반환 |
마지막 칸부터 검색(오른쪽 방향)
Type | Method | 설명 |
---|---|---|
E | getLast() | 덱의 마지막 요소(오른쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다. |
만약 덱이 비어있다면 NoSuchElementException 예외 반환 | ||
E | peekLast() | 덱의 마지막 요소(오른쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다. |
하지만 덱이 비어있다면 null을 반환 |
boolean contains(Object o) : 덱에 해당 요소가 포함되어 있으면 true, 아니면 false
boolean removeFirstOccurence(Object o) :
덱에서 지정한 요소의 첫 번쨰 항목(왼쪽 방향부터) 삭제
-> remove(Object o)와 동일하다.boolean removeLastOccurence(Object o) :
덱에서 지정한 요소의 마지막 항목(오른쪽 방향부터) 삭제int size() : 덱의 요소수를 반환