JAVA 15. 컬렉션(Queue)

김창민·2024년 7월 29일

BE

목록 보기
17/50

오라클 컬렉션 스팩

컬렉션을 사용하긴 하지만, 더 자세히 알아보도록 하자.
오라클 문서

위 사진에서 볼 수 있듯 Collection은 우선 Interface이다. 그 하위에 있는 Subinterface도 무지많고, 구현체는 더 많은걸 확인할 수 있다.

구현체를 위주로 한번 살펴보자면 크게 3가지로 볼 수 있는데, Queue와 Deque는 그냥 나눠서 4개로 확인해보자

Queue

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, SynchronousQueue

Queue는 기본적으로 선입선출(FIFO)를 형식의 자료구조다.

add/offer, remove/poll, peek/element가 각각 추가, 삭제, 조회를 담당한다. 수정은 딱히 지원하지 않는다.

AbstractQueue

이름에서도 느껴지듯 Queue를 구현하는데 사용되는 추상화 클래스이다. queue의 기본적인 메소드를 제공한다.

ArrayBlockingQueue

배열 기반의 큐로 크기가 고정되어 있다. 또한 동기화와 블로킹을 지원한다.

블로킹

큐가 가득차거나 비어있을때, 제거/추가가 완료될 때 까지 스레드는 대기하면서 동기화 문제를 해결한다.

ConcurrentLinkedQueue

LinkedQueue를 구현했으며 비동기 작업에 적합한 FIFO 큐이다. 비동기 작업을 지원하지만 멀티스레드에서도 안전하게 사용할 수 있다.

DelayQueue

블로킹 지원 큐로, 지연된 작업을 처리하기위한 용도의 Queue다. 저장된 요소는 일정 시간 후에 제거가 가능하다.

LinkedBlockingQueue

LinkedList 기반의 블로킹 큐 이다. 선택적으로 크기 제한을 걸 수 있다. 크기 인수를 생략하면 크기는 Integer.MAX_VALUE로 설정된다.

LinkedList

Queue를 사용하기 위해서 가장 많이 사용하는 구현체이다. Queue가 FIFO 구조체기 때문에 LinkedList가 List로 사용될때 갖게되는 리스크를 상쇄할 수 있다.

많이 사용되는 메서드는 다음과 같다. (다른 Queue 구현체도 모두 사용이 가능함)

삽입 메서드

  1. add(E e) : 큐의 끝에 요소를 추가.
  2. offer(E e) : 큐의 끝에 요소를 추가.

제거 메서드

  1. remove() : 큐의 맨 앞 요소 삭제
  2. poll() : 큐의 맨 앞 요소 삭제

조회 메서드

  1. element() : 큐의 맨 앞 요소 조회 (삭제아님)
  2. peek() :큐의 맨 앞 요소 조회 (삭제아님)

2번 메소드들은 대상이 없으면 null을 반환하고 1번 메소드는 예외를 반환한다.

LinkedTransferQueue

size 메소드가 constant-time 작업이 아닌 비동기적 큐이다. 즉, size 도출을 위해선 요소를 순회해야한다.
또한 addAll, removeAll와 같은 대규모 작업에 대해서 원자적 수행이 보장되지 않음.

PriorityBlockingQueue

우선순위에 따라 요소를 정렬한 Queue인데 블로킹을 지원한다. FIFO가 아닌 우선순위에 따라 sort가 계속된다.

PriorityQueue

우선순위 큐는 앞서 말한것과 같이 FIFO가 아닌 우선순위에 따라 요소가 정렬된다.

우선순위는 PriorityQueue 생성시 제공되는 Comparator에 따라 결정되며, Comparator는 개발자가 결정이 가능하다.

Comparator<Integer> comparator = (a, b) -> b - a;     
PriorityQueue<Integer> queue = new PriorityQueue<>(comparator);

우선순위 큐는 동기화를 미지원하므로 단일 스레드나 외부 동기화가 필요한 멀티스레드에서 사용해야한다.

SynchronousQueue

해당 Queue는 요소를 저장하지 않는 특별한 queue이다. 요소를 삽입하는 스레드와 요소를 삭제하는 스레드가 만나서 데이터를 주고받는 방식으로 작동한다.

offer(E e)를 통해 삽입을 시도하고, 제거 스레드가 없다면 false를 반환한다.
offer(E e, long timeout, TimeUnit unit)는 주어진 시간동안 대기하며 시간 초과시 false를 반환한다.
put(E e)는 요소를 큐에 삽입하고 제거 스레드가 올때까지 대기한다.

poll()는 큐에서 요소를 제거하는 메소드이며, 삽입 메소드가 준비가 안되면 null을 반환한다.
poll(long timeout, TimeUnit unit)는 삭제 대기 시간이 추가된 메소드이다. 시간 초과시 null을 반환한다.
take()는 큐에서 요소를 제거하며, 요소가 삽입될 때 까지 대기한다.

profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글