`java.util.AbstractQueue`는 자바 컬렉션 프레임워크에서 `Queue` 인터페이스를 구현하는 추상 클래스입니다. 이 클래스는 `Queue` 인터페이스의 일부 메서드를 구현하고 나머지 메서드를 구현하는 서브클래스에게 구현을 위임합니다.
`AbstractQueue` 클래스는 큐의 일반적인 속성을 구현하는 메서드를 제공합니다. 예를 들어, `offer()` 메서드는 큐에 요소를 추가하고, `poll()` 메서드는 큐에서 요소를 제거하고 반환합니다. 또한 `peek()` 메서드는 큐에서 다음에 제거될 요소를 반환합니다.
그러나 `AbstractQueue` 클래스는 큐의 구체적인 구현 방법에 대해 아무런 가정을 하지 않습니다. 따라서 구체적인 구현 방법은 서브클래스에서 구현해야 합니다.
`AbstractQueue` 클래스는 또한 `Iterator` 인터페이스를 구현하는 `iterator()` 메서드를 제공합니다. 이를 통해 서브클래스는 큐의 모든 요소를 반복할 수 있습니다.
`AbstractQueue` 클래스는 추상 클래스이기 때문에 직접 인스턴스화할 수 없습니다. 따라서 `AbstractQueue` 클래스를 상속받아서 구체적인 큐를 구현해야 합니다.
`AbstractQueue` 클래스의 서브클래스로는 `ArrayBlockingQueue`, `ConcurrentLinkedQueue`, `LinkedBlockingQueue` 등이 있습니다.`AbstractQueue` 클래스의 주요 메서드들은 다음과 같습니다.
- `offer(E e)` : 지정된 요소를 큐에 추가하고, 성공적으로 추가되면 true를 반환합니다. 큐에 더 이상 공간이 없는 경우 false를 반환합니다.
- `poll()` : 큐의 head 요소를 제거하고 반환합니다. 큐가 비어있는 경우 null을 반환합니다.
- `peek()` : 큐의 head 요소를 반환합니다. 큐가 비어있는 경우 null을 반환합니다.
- `element()` : 큐의 head 요소를 반환합니다. 큐가 비어있는 경우 NoSuchElementException을 발생시킵니다.
- `remove()` : 큐의 head 요소를 제거하고 반환합니다. 큐가 비어있는 경우 NoSuchElementException을 발생시킵니다.
서브클래스에서는 다음 메서드들을 반드시 구현해야 합니다.
- `add(E e)` : 지정된 요소를 큐에 추가합니다. 큐에 더 이상 공간이 없는 경우 IllegalStateException을 발생시킵니다.
- `remove()` : 큐의 head 요소를 제거하고 반환합니다. 큐가 비어있는 경우 NoSuchElementException을 발생시킵니다.
- `element()` : 큐의 head 요소를 반환합니다. 큐가 비어있는 경우 NoSuchElementException을 발생시킵니다.
`AbstractQueue` 클래스를 상속받아 구현된 서브클래스는 다양한 용도로 활용될 수 있습니다. `ArrayBlockingQueue` 클래스는 크기가 고정된 배열로 구현된 블로킹 큐를 제공합니다. `ConcurrentLinkedQueue` 클래스는 스레드 안전하게 구현된 링크드 리스트로 구현된 큐를 제공합니다. `LinkedBlockingQueue` 클래스는 링크드 리스트로 구현된 블로킹 큐를 제공합니다.
`AbstractQueue` 클래스는 다른 컬렉션 프레임워크와 함께 사용되어 다양한 자료 구조를 구현하는 데 사용될 수 있습니다. 예를 들어, `PriorityQueue` 클래스는 `AbstractQueue` 클래스를 상속받아 구현된 클래스 중 하나이며, 우선순위 큐를 구현하는 데 사용됩니다.`AbstractQueue` 클래스는 추상 클래스이므로 직접 사용할 수는 없습니다. 따라서 이 클래스를 상속받아 구현한 서브클래스를 사용해야 합니다. 다음은 `LinkedBlockingQueue` 클래스를 사용하는 예제 코드입니다.
import java.util.concurrent.LinkedBlockingQueue;
public class QueueExample {
public static void main(String[] args) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();
queue.offer("apple");
queue.offer("banana");
queue.offer("cherry");
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
}
}
위 예제 코드에서는 `LinkedBlockingQueue` 클래스를 사용하여 큐를 생성합니다. 이후 `offer()` 메서드를 사용하여 세 개의 요소를 추가하고, `poll()` 메서드를 사용하여 요소를 제거하면서 출력합니다. `isEmpty()` 메서드를 사용하여 큐가 비어있는지 확인하고, 비어있지 않은 경우 `poll()` 메서드를 호출하여 요소를 제거하고 출력합니다.
출력 결과는 다음과 같습니다.
apple
banana
cherry