대부분의 사람들에게 "대기열"이라는 단어는 기분 좋은 연상을 거의 떠올리지 않습니다. 그러나 오늘 우리는 다른 대기열인 Java 대기열에 대해 이야기하고 있습니다. Java에서 큐는 Queue 인터페이스를 상속하고 Collection 인터페이스를 확장하는 모든 것입니다 . 즉, 대기열을 컬렉션처럼 취급할 수 있습니다.

Java의 대기열은 FIFOLIFO 라는 두 가지 작동 원리를 지원합니다 .

FIFO (First In, First Out) 원칙은 일반 대기열을 제어합니다. 대기열에 추가된 첫 번째 요소가 가장 먼저 대기열에서 나갑니다 .

LIFO (Last In, First Out) 원칙은 스택의 동작을 설명합니다. 큐에 마지막으로 추가된 요소가 가장 먼저 스택을 떠납니다 . 예를 들어, 카드 덱으로 작업하는 방법은 다음과 같습니다. 덱 맨 아래에 도달할 때까지 한 번에 맨 위에서 카드를 제거합니다.

Java의 대기열 계층 구조 다음과 같습니다.

여기에서 Queue에는 LinkedList , ArrayDequePriorityQueue 의 3가지 구현 클래스가 있음을 알 수 있습니다 . LinkedListArrayDeque는 Queue 가 아니라 Deque를 직접 상속합니다 .

Deque 는 Java 6에 추가된 인터페이스입니다. 여기에는 대기열에 유용한 여러 메서드가 포함되어 있으며 대기열이 양방향(또는 양방향) 대기열로 작동할 수 있습니다. 즉,FIFOLIFO.

Deque 인터페이스의 두 자손 중 하나는 ArrayDeque 입니다 . 양방향 대기열을 지원하여 양쪽 끝에서 요소를 삽입하고 제거할 수 있습니다. 크기가 자동으로 커지는 동적 배열이기도 합니다.

Queue 의 직계 후손인 PriorityQueue 클래스 도 있습니다 . 이 클래스는 Deque를 구현하는 클래스와 다르게 작동합니다 .

PriorityQueue 는 기본적으로 자연 순서에 따라 요소를 구성하는 우선순위 대기열입니다. 여기서 정렬은 Comparable Comparator 인터페이스를 사용합니다. 원칙은 TreeSet 또는 TreeMap — Comparable 인터페이스를 사용하고 고유한 정렬 순서를 갖는와 동일합니다


PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));

priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");

while (!priorityQueue.isEmpty()) {
   System.out.println(priorityQueue.remove());
}

이 예제를 실행하면 콘솔에 다음과 같은 내용이 표시됩니다.



앤드류

정규 컬렉션이 아닌 큐로 작업하고 있으므로 목록에서 요소를 제거해야 합니다. 이를 위해 다음 구조를 사용합니다.


while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.remove());
}

Deque 인터페이스는 Queue 메서드를 상속 하고 몇 가지 흥미로운 자체 메서드를 추가합니다 .

무효 addFirst(E obj) 대기열 앞에 obj 요소를 추가합니다.
무효 addLast(E obj) 대기열 끝에 obj 요소를 추가합니다.
전자 getFirst() 대기열에서 첫 번째 요소를 반환합니다.
전자 getLast() 대기열에서 마지막 요소를 반환합니다.
부울 offerFirst(E obj) obj 요소를 대기열 앞에 추가하고 요소가 추가되면 true를 반환합니다. 그렇지 않으면 false 를 반환합니다 .
부울 offerLast(E obj) 대기열 끝에 obj 요소를 추가하고 요소가 추가되면 true를 반환합니다. 그렇지 않으면 false 를 반환합니다 .
전자() 대기열에서 첫 번째 요소를 가져와서 제거합니다.
무효 푸시(E obj) 대기열 앞에 obj 요소를 추가합니다.
전자 엿보기() 대기열에서 첫 번째 요소를 반환하지만 제거하지는 않습니다.
E 엿보기마지막() 대기열에서 마지막 요소를 반환하지만 제거하지는 않습니다.
E pollFirst() 대기열에서 첫 번째 요소를 반환하고 제거합니다. 요소가 없으면 null을 반환합니다 .
설문마지막() 대기열에서 마지막 요소를 반환하고 제거합니다. 요소가 없으면 null을 반환합니다 .
E 제거마지막() 대기열의 첫 번째 요소를 반환하고 제거합니다. 요소가 없으면 예외를 throw합니다.
전자 removeFirst() 대기열의 마지막 요소를 반환하고 제거합니다. 요소가 없으면 예외를 throw합니다.
부울 removeFirstOccurrence(객체 객체) 대기열에서 obj 의 첫 번째 항목을 제거합니다.
부울 removeLastOccurrence(개체 객체) 대기열에서 obj 의 마지막 항목을 제거합니다.

이제 이러한 방법 중 몇 가지를 실제로 살펴보겠습니다.

먼저 큐에 요소를 추가해 보겠습니다.


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); // Adds "Apple" to the end of the queue
        deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
        deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue
  
        System.out.println(deque);
    
[오렌지, 사과, 파인애플]

이제 대기열에서 값을 가져옵니다.


	Deque<String> deque = new ArrayDeque<>();

	deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 

         
        System.out.println("The first element is: "+ deque.getFirst());
                          
        System.out.println("The last element is: " + deque.getLast());
                          
    }
    

이 코드는 대기열의 첫 번째 요소와 마지막 요소를 표시합니다.

첫 번째 요소: 오렌지
마지막 요소: 파인애플


         Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue

System.out.println(deque);
    

이 코드를 실행하면 다음을 얻습니다.

오렌지
애플

[파인애플,레몬]

pop()poll() 의 차이점은 목록이 빈 목록인 경우 pop()은 NoSuchElementException을 발생시키지만 poll()은 null을 반환한다는 것 입니다 .

이제 pollFirst()pollLast() 메서드를 살펴보겠습니다 .


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
    
오렌지
레몬
[사과, 파인애플]

두 메서드 모두 대기열에서 값을 반환하고 제거합니다.

다음은 peekFirst()peekLast() 메서드를 사용하는 예입니다 .


Deque<String> friends = new ArrayDeque<>();

friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");

System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());

System.out.println(friends);
    
첫 번째 요소: John
마지막 요소: Oliver
[John, Rob, Greg, Max, Oliver]

두 메서드 모두 대기열에서 첫 번째/마지막 요소를 반환하고 제거하지 않습니다. 대기열이 비어 있으면 null이 반환됩니다.

잘하셨어요! 오늘 우리는 Java에서 대기열을 사용하는 방법을 배웠습니다. 이제 실제로 사용하는 방법을 알았습니다.