자바 Queue는 java.util 패키지에서 사용할 수 있는 인터페이스이며 java.util.Collection 인터페이스를 확장합니다. 자바 List와 마찬가지로 자바 Queue는 순서가 있는 요소(또는 객체)의 컬렉션이지만 삽입 및 삭제 작업을 다르게 수행합니다. 우리는 요소를 처리하기 전에 Queue를 사용하여 요소를 저장할 수 있습니다.
자바 Queue
이 섹션에서는 자바 Queue에 대한 몇 가지 중요한 사항을 논의하겠습니다:
- java.util.Queue 인터페이스는 java.util.Collection 인터페이스의 하위 타입입니다.
- 실제 세계의 대기열(예: 은행이나 ATM에서)과 마찬가지로 Queue는 요소를 대기열의 끝에 삽입하고 대기열의 시작부분에서 제거합니다.
- 자바 Queue는 요소의 정렬된 목록을 나타냅니다.
- 자바 Queue는 FIFO(선입선출) 순서를 따라 요소를 삽입하고 제거합니다. FIFO는 First In First Out의 약자입니다.
- 자바 Queue는 Collection 인터페이스의 모든 메서드를 지원합니다.
- 가장 자주 사용되는 Queue 구현은 LinkedList, ArrayBlockingQueue 및 PriorityQueue입니다.
- BlockingQueue는 null 요소를 허용하지 않습니다. null 관련 작업을 수행하면 NullPointerException이 발생합니다.
- BlockingQueue는 생산자/소비자 기반 응용 프로그램을 구현하는 데 사용됩니다.
- BlockingQueue는 스레드로부터 안전합니다.
- 모든 Java.util 패키지에 있는 모든 큐는 Unbounded 큐이며, java.util.concurrent 패키지에 있는 큐는 Bounded 큐입니다.
- 모든 Deque는 스레드 안전하지 않습니다.
- ConcurrentLinkedQueue는 링크된 노드를 기반으로 하는 Unbounded 스레드 안전한 큐입니다.
- 모든 큐는 큐의 끝에 삽입을 지원하고 큐의 시작에서 제거를 지원하지만 Deque는 제외됩니다.
- Deque는 큐이지만 양쪽 끝에서 요소의 삽입 및 제거를 지원합니다.
자바 큐 클래스 다이어그램
자바 큐 인터페이스는 Collection 인터페이스를 확장합니다. Collection 인터페이스는 Iterable 인터페이스를 확장합니다. 자주 사용되는 Queue 구현 클래스 중 일부는 LinkedList, PriorityQueue, ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue 등이 있습니다. AbstractQueue는 Queue 인터페이스의 뼈대 구현을 제공하여 Queue를 구현하는 데 필요한 노력을 줄입니다.
자바 큐 메소드
이 섹션에서는 유용하고 자주 사용되는 일부 Java 큐 메소드를 논의하겠습니다:
- int size(): Set의 요소 수를 가져오는 데 사용됩니다.
- boolean isEmpty(): Set이 비어 있는지 확인합니다.
- boolean contains(Object o): 이 Set이 지정된 요소를 포함하면 true를 반환합니다.
- Iterator iterator(): 이 세트의 요소에 대한 반복자를 반환합니다. 요소는 특정한 순서로 반환되지 않습니다.
- boolean removeAll(Collection c): 이 세트에서 지정된 컬렉션에 포함된 모든 요소를 제거합니다 (옵션 작업).
- boolean retainAll(Collection c): 이 세트에서 지정된 컬렉션에 포함된 요소만 유지합니다 (옵션 작업).
- void clear(): 세트에서 모든 요소를 제거합니다.
- E remove(): Retrieves and removes the head of this queue.
- E poll(): Retrieves and removes the head of this queue, or returns null if this queue is empty.
- E peek(): Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.
- boolean offer(E e): 용량 제한을 위반하지 않고 즉시이 큐에 지정된 요소를 삽입합니다.
- E element(): Retrieves, but does not remove, the head of this queue.
- boolean add(E e): 용량 제한을 위반하지 않고 즉시이 큐에 지정된 요소를 삽입하며 성공하면 true를 반환하고 현재 공간이 없으면 IllegalStateException을 throw합니다.
- Object[] toArray(): 이 세트의 모든 요소를 포함하는 배열을 반환합니다. 이 세트가 반복자에 따라 요소 반환에 대한 특정한 순서를 보장하는 경우이 메서드는 동일한 순서로 요소를 반환해야 합니다.
Java Queue Basics
Java Queue가 Java Collection을 확장하므로 모든 Collection 인터페이스 작업도 지원합니다. 다음 예제에서 몇 가지 간단한 작업을 살펴 보겠습니다:
package com.journaldev.queue;
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue queue = new LinkedList<>();
queue.add("one");
queue.add("two");
queue.add("three");
queue.add("four");
System.out.println(queue);
queue.remove("three");
System.out.println(queue);
System.out.println("Queue Size: " + queue.size());
System.out.println("Queue Contains element 'two' or not? : " + queue.contains("two"));
// 큐를 비우는 작업
queue.clear();
}
}
출력:-
[one, two, three, four]
[one, two, four]
Queue Size: 3
Queue Contains element 'two' or not? : true
Java 배열을 큐로 변환
여기서 우리는 “Collections.addAll()” 메서드를 사용하여 Java 배열을 큐로 변환하는 방법을 하나의 간단한 예제로 살펴볼 수 있습니다.
import java.util.*;
public class ArrayToQueue {
public static void main(String[] args) {
String nums[] = {"one","two","three","four","five"};
Queue<String> queue = new LinkedList<>();
Collections.addAll(queue, nums);
System.out.println(queue);
}
}
출력:- 위의 프로그램을 실행하면 다음 출력을 얻게됩니다:
[one, two, three, four, five]
Java 큐를 배열로 변환
여기서 우리는 “toArray()”를 사용하여 Java 큐를 Java 배열로 변환하는 방법을 하나의 간단한 예제로 살펴보겠습니다.
import java.util.*;
public class QueueToArray {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
queue.add("two");
queue.add("three");
queue.add("four");
queue.add("five");
String strArray[] = queue.toArray(new String[queue.size()]);
System.out.println(Arrays.toString(strArray));
}
}
출력:- 위의 프로그램을 실행하면 다음 출력을 얻게됩니다:
[one, two, three, four, five]
Java 큐 공통 작업
Java Queue는 Collection 인터페이스에서 지원하는 모든 작업과 추가 작업을 지원합니다. 두 가지 형태로 거의 모든 작업을 지원합니다.
- 한 세트의 작업은 작업이 실패할 경우 예외를 throw합니다.
- 다른 세트의 작업은 작업이 실패할 경우 특별한 값을 반환합니다.
다음 표는 모든 대기열 공통 작업을 간단히 설명합니다.
Operation | Throws exception | Special value |
---|---|---|
Insert | add(e) | offer(e) |
Remove | remove() | poll() |
Examine | element() | peek() |
다음 섹션에서 각 작업을 선별하여 일부 유용한 예제와 함께 상세히 논의할 것입니다.
자바 대기열 삽입 작업
이 섹션에서는 자바 대기열 삽입 작업에 대해 일부 유용한 예제와 함께 상세히 설명하겠습니다. 이 작업이 성공적으로 수행되면 “true” 값을 반환합니다. 대기열은 두 가지 형식으로 삽입 작업을 지원합니다:
- Queue.add(e):
작업이 실패할 경우 예외를 throw합니다.- Queue.offer(e):
작업이 실패할 경우 특별한 값을 반환합니다.
참고:- 여기서 특별한 값은 “false” 또는 “null”일 수 있습니다.
Queue add() 작업
add() 작업은 대기열에 새 요소를 삽입하는 데 사용됩니다. 삽입 작업이 성공적으로 수행되면 “true” 값을 반환합니다. 그렇지 않으면 java.lang.IllegalStateException을 throw합니다. 이 기능을 설명하는 간단한 예제를 개발해 보겠습니다.
import java.util.concurrent.*;
public class QueueAddOperation {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
System.out.println(queue.add("one"));
System.out.println(queue.add("two"));
System.out.println(queue);
System.out.println(queue.add("three"));
System.out.println(queue);
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 나옵니다:
true
true
[one, two]
Exception in thread "main" java.lang.IllegalStateException: Queue full
큐가 두 개의 요소로 제한되어 있기 때문에 BlockingQueue.add()를 사용하여 세 번째 요소를 추가하려고하면 위에 표시된대로 예외가 발생합니다.
Queue offer() 작업
offer() 작업은 새로운 요소를 큐에 삽입하는 데 사용됩니다. 삽입 작업을 성공적으로 수행하면 “true” 값을 반환하고, 그렇지 않으면 “false” 값을 반환합니다. 이 기능을 설명하는 간단한 예제를 개발해 보겠습니다.
import java.util.concurrent.*;
public class QueueOfferOperation {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
System.out.println(queue.offer("one"));
System.out.println(queue.offer("two"));
System.out.println(queue);
System.out.println(queue.offer("three"));
System.out.println(queue);
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 나옵니다:
true
true
[one, two]
false
[one, two]
큐가 두 개의 요소로 제한되어 있기 때문에 BlockingQueue.offer() 작업을 사용하여 세 번째 요소를 추가하려고하면 위에 표시된대로 “false” 값을 반환합니다.
Java 큐 삭제 작업
이 섹션에서는 몇 가지 유용한 예제와 함께 Java 큐 삭제 작업에 대해 자세히 설명하겠습니다. 삭제 작업은 큐의 헤드 요소를 성공적으로 수행하면 해당 요소를 반환합니다. 큐는 두 가지 형태로 삭제 작업을 지원합니다:
- Queue.remove():
작업이 실패하면 예외가 발생합니다.- Queue.poll():
작업이 실패하면 특수 값이 반환됩니다.
NOTE:- 여기에서 특수 값은 “false” 또는 “null”일 수 있습니다.
Queue remove() 작업
remove() 작업은 큐의 헤드에서 요소를 삭제하는 데 사용됩니다. 삭제 작업을 성공적으로 수행하면 큐의 헤드 요소를 반환합니다. 그렇지 않으면 java.util.NoSuchElementException을 throw합니다. 이 기능을 설명하는 간단한 예제를 개발해 봅시다.
import java.util.*;
public class QueueRemoveOperation
{
public static void main(String[] args)
{
Queue<String> queue = new LinkedList<>();
queue.offer("one");
queue.offer("two");
System.out.println(queue);
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
}
}
출력:- 위의 프로그램을 실행하면 다음 출력이 표시됩니다:
[one, two]
one
two
Exception in thread "main" java.util.NoSuchElementException
우리의 큐에는 두 개의 요소만 있기 때문에 세 번째로 remove() 메서드를 호출하려고하면 위에서 보여진 예외가 발생합니다. NOTE:- Queue.remove(element)은 큐에서 지정된 요소를 삭제하는 데 사용됩니다. 삭제 작업을 성공적으로 수행하면 “true” 값을 반환합니다. 그렇지 않으면 “false” 값을 반환합니다.
Queue poll() 작업
poll() 작업은 큐의 헤드에서 요소를 삭제하는 데 사용됩니다. 삭제 작업을 성공적으로 수행하면 큐의 헤드 요소를 반환합니다. 그렇지 않으면 “null” 값을 반환합니다. 이 기능을 설명하는 간단한 예제를 개발해 봅시다.
import java.util.*;
public class QueuePollOperation
{
public static void main(String[] args)
{
Queue<String> queue = new LinkedList<>();
queue.offer("one");
queue.offer("two");
System.out.println(queue);
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
}
}
출력:- 위의 프로그램을 실행하면 다음 출력이 나타납니다:
[one, two]
one
two
null
큐에 요소가 두 개만 있기 때문에 세 번째로 poll() 메서드를 호출하면 위와 같이 null 값을 반환합니다.
Java Queue Examine 작업
이 섹션에서는 몇 가지 유용한 예제와 함께 Java Queue Examine 작업에 대해 자세히 설명하겠습니다. 이 작업이 성공적으로 수행되면 큐의 헤드 요소를 제거하지 않고 반환합니다. 우리가 아는 바와 같이 큐는 두 가지 형태의 examine 작업을 지원합니다:
- Queue.element():
이 작업이 실패하면 예외를 throw합니다.- Queue.peek():
이 작업이 실패하면 특수한 값을 반환합니다.
참고:- 여기서 특수한 값은 “false” 또는 “null”일 수 있습니다
Queue element() 작업
element() 작업은 큐의 헤드에서 요소를 제거하지 않고 가져오는 데 사용됩니다. 이 작업이 성공적으로 수행되면 큐의 헤드 요소를 반환합니다. 그렇지 않으면 java.util.NoSuchElementException을 throw합니다. 이 기능을 설명하는 간단한 예제를 개발해 보겠습니다.
import java.util.*;
public class QueueElementOperation {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
System.out.println(queue.element());
System.out.println(queue);
queue.clear();
System.out.println(queue.element());
}
}
출력:- 위의 프로그램을 실행하면 다음 출력이 나타납니다:
one
[one]
Exception in thread "main" java.util.NoSuchElementException
만약 빈 큐에 element() 메소드를 호출하려고 하면 위에 표시된 대로 예외가 발생합니다.
큐 peek() 작업
peek() 작업은 큐의 맨 앞에서 요소를 검색하는 데 사용됩니다. 이 작업을 성공적으로 수행하면 큐의 맨 앞 요소를 반환합니다. 그렇지 않으면 null 값을 반환합니다. 이 기능을 설명하는 간단한 예제를 개발해 보겠습니다.
import java.util.*;
public class QueuePeekOperation {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
System.out.println(queue.peek());
System.out.println(queue);
queue.clear();
System.out.println(queue.peek());
}
}
출력:- 위의 프로그램을 실행하면 다음 출력이 나옵니다.
one
[one]
null
빈 큐에 peek() 메소드를 호출하려고 하면 위에 표시된 대로 예외가 발생하지 않고 null 값을 반환합니다.
자바 큐 카테고리
자바에서는 많은 큐 구현을 찾을 수 있습니다. 우리는 이를 다음 두 가지 유형으로 넓게 분류할 수 있습니다.
- 바운드 큐
- 무바운드 큐
보호된 대기열은 용량에 의해 제한되는 대기열로, 큐의 최대 크기를 생성 시에 제공해야 합니다. 예를 들어, ArrayBlockingQueue (이전 예제 참조)입니다. 비제한 대기열은 용량으로 제한되지 않는 대기열로, 큐의 크기를 제공하지 않아야 합니다. 예를 들어, LinkedList (이전 예제 참조)입니다. java.util 패키지에 있는 모든 큐은 비제한 대기열이며, java.util.concurrent 패키지에 있는 큐는 제한된 대기열입니다. 다른 말로, 이를 다음 두 유형으로 크게 분류할 수 있습니다:
- 차단 큐
- 비차단 큐
BlockingQueue 인터페이스를 구현하는 모든 큐은 BlockingQueues이며 나머지는 비차단 큐입니다. BlockingQueues는 작업을 완료하거나 시간 제한이 만료될 때까지 차단되지만, Non-BlockingQueues는 그렇지 않습니다. 어떤 큐는 Deques이고 어떤 큐는 PriorityQueues입니다.
BlockingQueue 작업
큐의 두 가지 형태의 작업 외에도 BlockingQueue는 아래에 표시된 두 가지 형태의 작업을 지원합니다.
Operation | Throws exception | Special value | Blocks | Times out |
---|---|---|---|---|
Insert | add(e) | offer(e) | put(e) | offer(e, time, unit) |
Remove | remove() | poll() | take() | poll(time, unit) |
Examine | element() | peek() | N/A | N/A |
일부 작업은 작업을 완료할 때까지 차단되며 다른 일부는 시간이 초과될 때까지 차단됩니다. 이것이 Java에서 대기열에 대한 간단한 소개입니다. 이 Java 대기열 예제들이 대기열 컬렉션 프로그래밍을 시작하는 데 도움이 되기를 바랍니다. 내 자습서를 좋아하시거나 의견이나 제안 또는 유형 오류가 있는 경우 댓글을 남겨 주세요. 감사합니다.
Source:
https://www.digitalocean.com/community/tutorials/java-queue