Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Queue 인터페이스의 peek(), poll(), remove() 메소드 차이점 총정리

큐(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()를 사용하는 것이 좋습니다.