큐(Queue)는 데이터를 실제로 처리하기 전에 일시적으로 보관해 두기 위한 자료구조입니다. 큐는 FIFO(First-In-First-Out, 선입선출) 방식으로 동작하며, 가장 먼저 삽입된 요소가 가장 먼저 꺼내집니다.
Java의 Queue 인터페이스는 큐의 맨 앞(head)에 있는 요소를 다루는 peek(), poll(), remove() 세 가지 메소드를 제공합니다. 이들은 이름이 비슷하지만 '요소를 제거하는지 여부'와 '큐가 비어 있을 때의 동작'에서 중요한 차이가 있으므로, 상황에 맞게 올바르게 선택해야 합니다.
peek() 메소드 — 조회만 하고 제거하지 않음
peek() 메소드는 큐의 맨 앞에 있는 요소를 반환하지만, 그 요소를 큐에서 제거하지는 않습니다. 호출 후에도 큐의 내용은 그대로 유지되며, 큐가 비어 있는 경우에는 예외를 발생시키지 않고 null을 반환합니다.
예제
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String args[]) {
Queue<String> queue = new LinkedList<String>();
queue.add("Java");
queue.add("JavaFX");
queue.add("OpenCV");
queue.add("Coffee Script");
queue.add("HBase");
System.out.println("큐의 맨 앞 요소: " + queue.peek());
Iterator<String> it = queue.iterator();
System.out.println("큐의 전체 내용:");
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
실행 결과
큐의 맨 앞 요소: Java 큐의 전체 내용: Java JavaFX OpenCV Coffee Script HBase
위 실행 결과에서 볼 수 있듯이 peek()를 호출한 후에도 'Java'가 큐에 그대로 남아 있는 것을 확인할 수 있습니다.
poll() 메소드 — 조회 후 제거
poll() 메소드는 큐의 맨 앞에 있는 요소를 반환한 뒤, 해당 요소를 큐에서 제거합니다. 큐가 비어 있으면 예외 대신 null을 반환합니다.
예제
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String args[]) {
Queue<String> queue = new LinkedList<String>();
queue.add("Java");
queue.add("JavaFX");
queue.add("OpenCV");
queue.add("Coffee Script");
queue.add("HBase");
System.out.println("큐의 맨 앞 요소: " + queue.poll());
Iterator<String> it = queue.iterator();
System.out.println("큐의 전체 내용:");
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
실행 결과
큐의 맨 앞 요소: Java 큐의 전체 내용: JavaFX OpenCV Coffee Script HBase
poll()을 호출한 후 큐에서 'Java'가 사라진 것을 확인할 수 있습니다. 이것이 peek()와 poll()의 핵심적인 차이입니다.
remove() 메소드 — 조회 후 제거, 단 빈 큐에서는 예외 발생
remove() 메소드 역시 맨 앞 요소를 반환하고 제거한다는 점에서 poll()과 동일하게 동작합니다. 하지만 큐가 비어 있을 때 null을 반환하는 대신 NoSuchElementException 예외를 던진다는 점이 다릅니다.
Queue<String> emptyQueue = new LinkedList<String>(); System.out.println(emptyQueue.poll()); // null 출력 System.out.println(emptyQueue.remove()); // NoSuchElementException 발생
세 메소드 한눈에 비교하기
| 메소드 | 동작 | 빈 큐일 때 |
|---|---|---|
| peek() | 맨 앞 요소를 조회만 함 (제거하지 않음) | null 반환 |
| poll() | 맨 앞 요소를 조회한 뒤 제거함 | null 반환 |
| remove() | 맨 앞 요소를 조회한 뒤 제거함 | NoSuchElementException 발생 |
정리: 단순히 맨 앞 요소를 확인만 하려면 peek()를, 요소를 꺼내면서 빈 큐 상황을 null로 부드럽게 처리하고 싶다면 poll()을, 빈 큐인 경우를 예외로 명확하게 감지하고 싶다면 remove()를 사용하는 것이 좋습니다.