HOWTO · Java
Java의 대기열에 넣고 빼기
Java의 Enqueue 및 Dequeue 및 기타 모든 관련 정보 이해
이 페이지의 내용
Java에서 enqueue는 FIFO 큐의 뒤쪽에 요소를 추가하고, dequeue는 앞쪽 요소를 제거하는 작업입니다. Queue 인터페이스가 이러한 작업을 정의하며, LinkedList는 이를 구현하는 클래스 중 하나입니다. 삽입 성공 여부나 꺼낼 앞쪽 요소의 유무를 반환값으로 확인하려면 offer와 poll을 사용하세요.
큐와 FIFO
큐는 선입선출(FIFO) 순서로 요소를 처리합니다. 먼저 추가한 값이 먼저 제거됩니다. 요소는 뒤쪽에 추가하고, 앞쪽에서 제거하거나 확인합니다. 이 순서는 프로그램이 제출된 작업, 이벤트 또는 메시지를 도착한 순서대로 처리해야 할 때 유용합니다.
Java 컬렉션 프레임워크의 Queue는 인터페이스입니다. 특정 저장 방식에 얽매이지 않고 일반적인 큐 작업을 정의합니다. 구현체마다 용량 제한과 성능 특성이 다를 수 있으므로, 모든 큐가 똑같이 동작한다고 가정하지 말고 애플리케이션에 맞는 구현체를 선택하세요.
순서 규칙에 관한 설명은 Java FIFO 큐 안내에서도 확인할 수 있습니다.
Enqueue와 Dequeue
Enqueue는 큐의 뒤쪽에 항목을 추가하는 작업이고, dequeue는 앞쪽 항목을 제거하는 작업입니다. 이 용어들은 큐 작업을 가리키며, Deque 인터페이스가 dequeue 작업과 같다는 뜻은 아닙니다. Deque는 양쪽 끝에서 삽입과 제거를 지원하는 컬렉션을 위한 별도의 Java 인터페이스입니다.
큐의 앞쪽 요소는 제거하지 않고 확인할 수도 있습니다. 이렇게 하면 큐의 순서를 유지하면서 다음에 처리할 항목을 결정할 수 있습니다.
Java의 Queue 메서드
삽입할 때 add(E)와 offer(E)는 모두 큐가 요소를 받아들이면 해당 요소를 추가합니다. 용량 제한에 따른 동작은 다릅니다. 용량 제한 때문에 삽입할 수 없으면 add는 IllegalStateException을 던지고, offer는 false를 반환합니다. 무제한 큐에는 고정 용량이 없을 수 있으므로 결과는 구현체에 따라 달라집니다.
제거할 때 remove()는 앞쪽 요소를 가져와 제거하지만, 큐가 비어 있으면 NoSuchElementException을 던집니다. poll()도 앞쪽 요소를 가져와 제거하지만, 제거할 요소가 없으면 null을 반환합니다. 빈 큐가 정상적으로 발생할 수 있고 호출 코드가 반환값으로 이를 처리해야 한다면 poll()을 사용하세요.
element()와 peek()는 앞쪽 요소를 제거하지 않고 확인합니다. 큐가 비어 있으면 element()는 NoSuchElementException을 던지고 peek()는 null을 반환합니다. 두 메서드 중 하나를 선택하면 예외를 명시적으로 발생시킬지, 센티널 값을 반환할지 정할 수 있습니다. poll()과 peek()는 앞쪽 요소가 없음을 나타내는 데 null을 사용하므로, 저장된 값과 이 결과를 구분해야 하는 경우 큐에 null을 저장하지 마세요.
LinkedList로 Enqueue와 Dequeue 구현하기
다음 전체 프로그램은 Queue<String> 인터페이스를 LinkedList<String> 구현체와 함께 사용합니다. 값 두 개를 추가하고 앞쪽 요소를 확인한 다음 FIFO 순서로 각 값을 제거합니다.
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.offer("Second");
System.out.println("Head: " + queue.peek());
System.out.println("Removed: " + queue.poll());
System.out.println("Removed: " + queue.poll());
}
}
Head: First
Removed: First
Removed: Second
기록된 실행에서는 위와 같은 출력이 나왔습니다. 첫 번째 확인은 First를 제거하지 않고 읽으며, 이어지는 두 번의 poll() 호출은 First와 Second 순서로 제거합니다. 코드에서 필요한 큐 작업에만 의존하도록 변수 타입을 Queue<String>으로 선언하고, 구체적인 구현은 LinkedList가 제공합니다. 용량과 순서 동작이 애플리케이션에 적합하다면 다른 Queue 구현체로 바꿀 수도 있습니다.
핵심은 호출 코드에 필요한 빈 큐 및 용량 정책을 선택하는 것입니다. 반환값을 일반적인 제어 흐름에 활용하려면 offer, poll, peek을 사용하고, 해당 조건을 예외로 호출자에게 알리려면 add, remove, element를 사용하세요.