본문 바로가기
Language/Java

[JAVA] Deque 인터페이스 완벽 가이드 : 스택과 큐를 넘어선 팔방미인 자료구조

by Papa Martino V 2026. 1. 18.
728x90

Deque 인터페이스
Deque 인터페이스

 

자바 프로그래밍에서 데이터를 효율적으로 관리하는 것은 애플리케이션의 성능을 결정짓는 핵심 요소입니다. 그중에서도 Deque(Double-Ended Queue)는 현대 자바 개발에서 가장 유연하고 강력한 선형 자료구조 중 하나로 꼽힙니다. 오늘은 단순히 '양방향 큐'라고만 알고 있었던 Deque의 깊은 내부 메커니즘과 실무에서의 선택 기준을 심층적으로 분석해 보겠습니다.

1. Deque란 무엇인가? (Double-Ended Queue)

Deque는 '덱' 또는 '데크'라고 발음하며, 이름에서 알 수 있듯이 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조입니다. 자바에서는 java.util.Deque 인터페이스로 정의되어 있으며, Queue 인터페이스를 상속받습니다. 이러한 구조적 유연성 덕분에 Deque는 상황에 따라 스택(Stack)으로도, 큐(Queue)로도 완벽하게 동작할 수 있습니다.

2. Deque의 핵심 메서드: 예외 발생 vs 값 반환

Deque 인터페이스는 작업 실패 시 어떻게 대응하느냐에 따라 두 가지 형태의 메서드 그룹을 제공합니다. 이 차이를 명확히 아는 것이 견고한 코드를 작성하는 첫걸음입니다.

작업 구분 예외 발생 메서드 (Throws Exception) 값 반환 메서드 (Returns Special Value)
앞단 삽입 addFirst(e) offerFirst(e)
뒷단 삽입 addLast(e) offerLast(e)
앞단 삭제 removeFirst() pollFirst()
뒷단 삭제 removeLast() pollLast()
앞단 확인 getFirst() peekFirst()

3. 주요 구현체 분석: ArrayDeque vs LinkedList

Deque 인터페이스를 구현한 클래스 중 실무에서 가장 많이 사용되는 두 가지는 ArrayDequeLinkedList입니다. 많은 개발자가 습관적으로 LinkedList를 선택하지만, 성능 관점에서는 이야기가 다릅니다.

3.1 ArrayDeque: 압도적인 성능의 강자

내부적으로 가변 배열(Resizable Array)을 사용합니다. 별도의 노드 객체를 생성하지 않기 때문에 메모리 효율이 매우 뛰어나며, 스택과 큐를 구현할 때 가장 권장되는 클래스입니다. 특히 자바의 레거시 클래스인 Stack을 대체하는 용도로 최적입니다.

3.2 LinkedList: 유연한 연결성

이중 연결 리스트 구조로, 데이터 중간에 삽입이나 삭제가 빈번할 때 유리합니다. 다만, 각 노드마다 앞뒤 포인터를 저장해야 하므로 ArrayDeque보다 메모리 소모가 크고 반복자(Iterator) 성능이 상대적으로 떨어집니다.

4. Deque를 활용한 설계 패턴

Deque는 단순한 저장을 넘어 다양한 알고리즘 설계에 활용됩니다.

  • 브라우저 방문 기록 (Back/Forward): 뒤로 가기와 앞으로 가기 기능을 구현할 때 양방향 데이터 처리가 가능한 Deque가 필수적입니다.
  • 슬라이딩 윈도우(Sliding Window) 알고리즘: 윈도우 내의 최대값이나 최소값을 실시간으로 추적할 때 O(1)의 성능으로 양 끝 데이터를 관리할 수 있습니다.
  • 우선순위 역전 방지: 작업 스케줄러에서 급한 작업은 앞단에, 일반 작업은 뒷단에 배치하여 유연한 우선순위 관리가 가능합니다.

5. 결론: 언제 Deque를 써야 할까?

결론적으로, 데이터를 양쪽 끝에서 제어해야 하거나 스택과 큐의 기능을 동시에 활용해야 할 때 Deque는 최선의 선택입니다. 특히 멀티스레드 환경이 아니라면 Stack 클래스 대신 ArrayDeque를 사용하여 성능 이점을 챙기시는 것을 강력히 추천드립니다.


콘텐츠 출처 및 참고 자료

  • Oracle Java SE Documentation: Interface Deque<E>
  • Effective Java, 3rd Edition by Joshua Bloch: Item 28: Prefer lists to arrays (Internal implementation references)
  • Java Performance: The Definitive Guide by Scott Oaks
  • GeeksforGeeks: Deque Interface in Java with Examples
728x90