Deque 핵심 정리

revo·2025년 12월 23일

자바

목록 보기
2/30

조회 / 삽입 / 삭제 메서드 비교 (get · peek · add · offer · remove · poll)

Deque의 메서드들은 기능은 비슷한데, 실패를 처리하는 방식이 다르다.


조회 계열: getFirst / getLast vs peekFirst / peekLast

코드 비교

public E getFirst() {
    E e = elementAt(elements, head);
    if (e == null)
        throw new NoSuchElementException();
    return e;
}

public E peekFirst() {
    return elementAt(elements, head);
}

차이 핵심

메서드비어 있을 때
getFirst / getLast❌ 예외
peekFirst / peekLast⭕ null

간단 예제

Deque<Integer> dq = new ArrayDeque<>();

dq.peekFirst();   // null
dq.getFirst();    // NoSuchElementException

흐름 정리

  • peek
    → “없으면 그냥 알려줘 (null)”
  • get
    → “없으면 논리 오류니까 터져야 함”

-> 조회만 하는데도 실패 정책이 다르다


삽입 계열: addFirst / addLast vs offerFirst / offerLast

코드 비교

public boolean offerFirst(E e) {
    addFirst(e);
    return true;
}

public void addFirst(E e) {
        if (e == null)
            throw new NullPointerException();
        final Object[] es = elements;
        es[head = dec(head, es.length)] = e;
        if (head == tail)
            grow(1);
 }

차이 핵심

메서드실패 처리
add❌ 예외
offer⭕ boolean 반환

⚠️ ArrayDeque에서는 실제로 offer가 false를 반환하는 경우가 거의 없다
(용량이 자동으로 늘어나기 때문)


중요한 헷갈림 포인트 ❗

dq.offerFirst(null);

이건?

  • ❌ false 아님
  • ❌ 컴파일 에러 아님
  • 런타임 NPE

이유:

  • null은 “실패”가 아니라 금지된 입력
  • 그래서 add에서 바로 예외

간단 예제

Deque<Integer> dq = new ArrayDeque<>();

dq.addLast(1);    // OK
dq.offerLast(2);  // true
dq.offerLast(null); // NullPointerException

삭제 계열: removeFirst / removeLast vs pollFirst / pollLast

코드 비교

public E removeFirst() {
    E e = pollFirst();
    if (e == null)
        throw new NoSuchElementException();
    return e;
}

    public E pollFirst() {
        final Object[] es;
        final int h;
        E e = elementAt(es = elements, h = head);
        if (e != null) {
            es[h] = null;
            head = inc(h, es.length);
        }
        return e;
    }

차이 핵심

메서드비어 있을 때
remove❌ 예외
poll⭕ null

간단 예제

Deque<Integer> dq = new ArrayDeque<>();

dq.pollFirst();    // null
dq.removeFirst();  // NoSuchElementException

흐름 구조 (중요)

poll → null 반환
remove → poll 호출 → null이면 예외

-> remove는 poll을 감싼 “강한 버전”


전체 비교표

조회

메서드비어 있음
get예외
peeknull

삽입

메서드실패
add예외
offerfalse (ArrayDeque에선 거의 없음)

삭제

메서드비어 있음
remove예외
pollnull

언제 뭘 써야 하냐

✔ 알고리즘 / 코테

Integer cur = dq.pollFirst();
if (cur == null) break;
  • 흐름 제어
  • 예외 없음
  • peek / poll / offer 위주

✔ 논리적으로 보장된 상황

int cur = dq.removeFirst();
  • “없으면 안 되는 상황”
  • 터지는 게 맞음
  • get / add / remove

한 문장으로 정리

Deque의 메서드들은 기능보다 실패 처리 방식이 다르다.
get·add·remove는 실패 시 예외를 던지고, peek·offer·poll은 실패를 반환값(null/false)으로 표현한다.
따라서 어떤 메서드를 쓰느냐는 “실패를 예외로 볼지, 흐름의 일부로 볼지”에 달려 있다.

0개의 댓글