백엔드 개발자라면 대답해야 할 100가지 질문

11. Queue에서 Poll()과 remove()의 차이점은 무엇인가요?

ignuy 2023. 8. 7.

Queue에서는 Enqueue, Dequeue와 같은 기본적인 같은 동작을 하는 메서드가 여러 개 있다. 그 대표적인 경우가 Poll()과 remove()이다.

Poll vs Remove

/**
 * Retrieves and removes the head of this queue.  This method differs
 * from {@link #poll poll} only in that it throws an exception if this
 * queue is empty.
 *
 * @return the head of this queue
 * @throws NoSuchElementException if this queue is empty
 */
E remove();

/**
 * Retrieves and removes the head of this queue,
 * or returns {@code null} if this queue is empty.
 *
 * @return the head of this queue, or {@code null} if this queue is empty
 */
E poll();

위 코드라인은 Queue 인터페이스의 메소드에 대해 설명하고 있는 주석문이다. 이를 정리하자면,,,

  • remove()
    • queue의 head에 있는 값을 반환하고 이를 삭제한다.
    • queue가 비어있을 때는 NoSuchElementException을 던진다.
  • poll()
    • queue의 head에 있는 값을 반환하고 이를 삭제한다.
    • queue가 비어있을 때는 null을 반환한다.

즉 예외상황에 대한 처리 방식만 다를 뿐 똑같은 dequeue기능을 수행한다. 다른 경우도 확인해 보자.

add vs offer

/**
 * Inserts the specified element into this queue if it is possible to do so
 * immediately without violating capacity restrictions, returning
 * {@code true} upon success and throwing an {@code IllegalStateException}
 * if no space is currently available.
 *
 * @param e the element to add
 * @return {@code true} (as specified by {@link Collection#add})
 * @throws IllegalStateException if the element cannot be added at this
 *         time due to capacity restrictions
 * @throws ClassCastException if the class of the specified element
 *         prevents it from being added to this queue
 * @throws NullPointerException if the specified element is null and
 *         this queue does not permit null elements
 * @throws IllegalArgumentException if some property of this element
 *         prevents it from being added to this queue
 */
boolean add(E e);

/**
 * Inserts the specified element into this queue if it is possible to do
 * so immediately without violating capacity restrictions.
 * When using a capacity-restricted queue, this method is generally
 * preferable to {@link #add}, which can fail to insert an element only
 * by throwing an exception.
 *
 * @param e the element to add
 * @return {@code true} if the element was added to this queue, else
 *         {@code false}
 * @throws ClassCastException if the class of the specified element
 *         prevents it from being added to this queue
 * @throws NullPointerException if the specified element is null and
 *         this queue does not permit null elements
 * @throws IllegalArgumentException if some property of this element
 *         prevents it from being added to this queue
 */
boolean offer(E e);
  • add()
    • Queue의 rear에 값을 추가한다.
    • 값이 정상적으로 추가되었다면 true를 반환한다.
    • 큐의 용량 한계로 인해 값을 추가하지 못하는 상황에는 IllegalStateException 예외를 던진다.
  • offer()
    • Queue의 rear에 값을 추가한다.
    • 값이 정상적으로 추가되었다면 true를 반환한다.
    • 큐에 임의의 이유로 값이 정상적으로 추가되지 않은 상황에는 false를 반환한다.

element vs peek

/**
 * Retrieves, but does not remove, the head of this queue.  This method
 * differs from {@link #peek peek} only in that it throws an exception
 * if this queue is empty.
 *
 * @return the head of this queue
 * @throws NoSuchElementException if this queue is empty
 */
E element();

/**
 * Retrieves, but does not remove, the head of this queue,
 * or returns {@code null} if this queue is empty.
 *
 * @return the head of this queue, or {@code null} if this queue is empty
 */
E peek();
  • element()
    • 큐의 head의 값을 반환한다. poll이나 remove와는 다르게 head를 지우지는 않는다.
    • 큐가 비어있어 head가 가리키는 값이 없다면 NoSuchElementException 예외를 던진다.
  • peek()
    • 큐의 head의 값을 반환한다. poll이나 remove와는 다르게 head를 지우지는 않는다.
    • 큐가 비어있어 head가 가리키는 값이 없다면 null을 반환한다.

댓글