[Java] Deque(데크 / 덱) 정리 및 사용법

hansung's·2024년 3월 20일
1

🤔 Deque란 무엇인가?


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를 사용하라고 했기 때문이다.

😎 Deque 사용법 정리


🎄 Deque 선언하기

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<>();

Deque에 요소(Element) 추가


첫 번째 칸부터 넣기(왼쪽 방향)

TypeMethod설명
voidaddFirst(E e)용량 제한을 위반하지 않고 삽입이 가능한 경우 덱 앞에 요소를 삽입하고
현재 덱에 공간이 없다면 IllegalStateException 예외를 반환
booleanofferFirst(E e)용량 제한을 위반하지 않는 한 덱 앞에 요소를 삽입 성공시 true 반환,
용량 제한이 걸리는 경우 false를 리턴

마지막 칸부터 넣기(오른쪽 방향)

TypeMethod설명
voidaddLast(E e)용량 제한을 위반하지 않고 삽입이 가능한 경우 덱 끝에 요소를 삽입하고
현재 덱에 공간이 없다면 IllegalStateException 예외를 반환
booleanadd(E e)용량 제한을 위반하지 않고 수행 가능시, 덱 끝에 요소를 삽입하고 성공시 true를 반환,
현재 덱에 공간이 없다면 IllegalStateException 예외를 반환
booleanofferLast(E e)용량 제한을 위반하지 않는 한 덱 끝에 요소를 삽입
booleanoffer(E e)용량 제한을 위반하지 않고 삽입이 가능하면 덱 끝에 요소를 삽입하고 성공시 true를 반환,
현재 덱에 공간이 없다면 false를 반환

🎋 Deque에 요소(Element) 삭제


첫 번쨰 칸부터 삭제(왼쪽 방향)

TypeMethod설명
Eremove()덱의 대기열의 헤드(왼쪽 방향)를 삭제한 후 해당 값을 반환
만약 덱이 비어있다면 NoSuchElementException 예외 반환
EremoveFirst()덱의 첫 번째 요소를 삭제한 후 해당 값을 반환
만약 덱이 비어있다면 NoSuchElementException 예외 반환
Epoll()덱의 대기열의 헤드(왼쪽 방향)를 삭제한 후 해당 값을 반환,
하지만 덱이 비어있다면 null을 반환
EpollFirst()덱의 첫 번째 요소를 텍스트삭제한 후 해당 값을 반환,
하지만 덱이 비어있다면 null을 반환

마지막 칸부터 삭제(오른쪽 방향)

TypeMethod설명
EremoveLast()덱의 마지막 요소(오른쪽 방향)를 삭제한 후 해당 값을 반환
만약 덱이 비어있다면 NoSuchElementException 예외 반환
EpollLast()덱의 마지막 요소(오른쪽 방향)를 삭제한 후 해당 값을 반환,
하지만 덱이 비어있다면 null을 반환

Deque에 요소(Element) 검색


첫 번쨰 칸부터 검색(왼쪽 방향)

TypeMethod설명
EgetFirst()덱의 대기열의 헤드(왼쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다.
만약 덱이 비어있다면 NoSuchElementException 예외 반환
Epeek()덱의 대기열의 헤드(왼쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다.
만약 덱이 비어있다면 null 반환
EpeekFirst()덱의 대기열의 헤드(왼쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다.
만약 덱이 비어있다면 null 반환

마지막 칸부터 검색(오른쪽 방향)

TypeMethod설명
EgetLast()덱의 마지막 요소(오른쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다.
만약 덱이 비어있다면 NoSuchElementException 예외 반환
EpeekLast()덱의 마지막 요소(오른쪽 방향)를 검색한 후 반환하지만, 삭제는 하지 않는다.
하지만 덱이 비어있다면 null을 반환

🎆 기타 메서드

boolean contains(Object o) : 덱에 해당 요소가 포함되어 있으면 true, 아니면 false

boolean removeFirstOccurence(Object o) :
덱에서 지정한 요소의 첫 번쨰 항목(왼쪽 방향부터) 삭제
-> remove(Object o)와 동일하다.

boolean removeLastOccurence(Object o) :
덱에서 지정한 요소의 마지막 항목(오른쪽 방향부터) 삭제

int size() : 덱의 요소수를 반환

💜 참고자료


JAVA SE 11 공식 문서

Java: 덱(Deque)의 개념과 사용

[JAVA] Deque(덱) 사용법

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글

관련 채용 정보