Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

프로그래밍 공부

[자바] #12. 컬렉션 프레임워크 - 3. Queue, Deque 본문

자바

[자바] #12. 컬렉션 프레임워크 - 3. Queue, Deque

하 냥 2025. 2. 16. 07:13

✅ Queue 주요 특징

  1. FIFO (First-In-First-Out) → 먼저 추가된 요소가 먼저 제거됨
  2. 삽입(offer()), 삭제(poll()), 조회(peek()) 등 주요 연산 제공
  3. LinkedList, PriorityQueue, ArrayDeque 등으로 구현 가능

특히, 뒤에서 설명할 Deque는 양방향 큐(Double-Ended Queue)로,

앞뒤에서 삽입과 삭제가 모두 가능한 자료구조이다.

📌 Queue<E>의 주요 메서드

메서드 설명 실패 시 반환값
boolean offer(E e) 요소 추가 false
E poll() 요소 제거 및 반환 null (예외는 발생시키지 않음)
E peek() 맨 앞 요소 조회 (삭제 안 함) null (예외는 발생시키지 않음)
E remove() 요소 제거 및 반환 예외 발생
E element() 맨 앞 요소 조회 (삭제 안 함) 예외 발생

🔹 Queue 예제 (LinkedList 활용)

import java.util.Queue;
import java.util.LinkedList;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        queue.offer("Apple");
        queue.offer("Banana");
        queue.offer("Cherry");

        System.out.println(queue.peek());  // Apple (조회)
        System.out.println(queue.poll());  // Apple (제거)
        System.out.println(queue.poll());  // Banana (제거)
        System.out.println(queue.poll());  // Cherry (제거)
        System.out.println(queue.poll());  // null (비어있음)
    }
}

Queue는 FIFO 구조이므로 먼저 들어온 "Apple"이 먼저 나간다.


📢 Deque<E> 인터페이스 (양방향 큐)

Deque<E>는 양방향 큐(Double-Ended Queue) 로, 양쪽(앞과 뒤)에서 삽입과 삭제가 가능한 자료구조이다.

public interface Deque<E> extends Queue<E>

✅ Deque 주요 특징

  1. 양쪽에서 삽입(offerFirst(), offerLast())과 삭제(pollFirst(), pollLast())가 가능
  2. FIFO와 LIFO 모두 지원 (Queue + Stack 기능)
  3. ArrayDeque, LinkedList로 구현 가능

📌 Deque<E>의 주요 메서드

메서드 설명 실패 시 반환값
boolean offerFirst(E e) 앞쪽에 요소 추가 false
boolean offerLast(E e) 뒤쪽에 요소 추가 false
E pollFirst() 앞쪽 요소 제거 및 반환 null (예외는 발생시키지 않음)
E pollLast() 뒤쪽 요소 제거 및 반환 null(예외는 발생시키지 않음)
E peekFirst() 앞쪽 요소 조회 (삭제 X) null (예외는 발생시키지 않음)
E peekLast() 뒤쪽 요소 조회 (삭제 X) null (예외는 발생시키지 않음)
E removeFirst() 앞쪽 요소 제거 및 반환 예외 발생
E removeLast() 뒤쪽 요소 제거 및 반환 예외 발생

🔹 Deque 예제 (ArrayDeque 활용)

import java.util.Deque;
import java.util.ArrayDeque;

public class DequeExample {
    public static void main(String[] args) {
        Deque<String> deque = new ArrayDeque<>();

        deque.offerFirst("Apple");  // 앞쪽 추가
        deque.offerLast("Banana");  // 뒤쪽 추가
        deque.offerFirst("Cherry"); // 앞쪽 추가

        System.out.println(deque); // [Cherry, Apple, Banana]

        System.out.println(deque.pollFirst()); // Cherry (앞쪽에서 제거)
        System.out.println(deque.pollLast());  // Banana (뒤쪽에서 제거)
        System.out.println(deque.pollFirst()); // Apple (앞쪽에서 제거)
        System.out.println(deque.pollFirst()); // null (비어있음)
    }
}

Deque는 앞과 뒤에서 삽입 및 삭제가 모두 가능하여 유연한 자료구조다.

 

📌 Deque의 활용 - Stack처럼 사용하기

Deque는 LIFO(Last-In-First-Out) 방식의 Stack 처럼 사용할 수도 있다!

import java.util.Deque;
import java.util.ArrayDeque;

public class DequeStackExample {
    public static void main(String[] args) {
        Deque<Integer> stack = new ArrayDeque<>();

        stack.push(10); // 스택의 push (== offerFirst())
        stack.push(20);
        stack.push(30);

        System.out.println(stack.pop()); // 30 (LIFO - 후입선출)
        System.out.println(stack.pop()); // 20
        System.out.println(stack.pop()); // 10
    }
}

💡 Deque의 push()pop()을 사용하면 스택처럼 동작할 수 있다!

 

❓ ArrayDeque vs LinkedList 

비교 항목 ArrayDeque<E> LinkedList<E>
내부 구현 동적 배열 기반 이중 연결 리스트 기반
속도 빠름 (ArrayList처럼 동적 배열 사용) 느림 (포인터 참조 필요)
메모리 사용 상대적으로 적음 추가적인 참조 노드 필요
스택/큐 로 사용 ✅ 매우 적합 적합하지만 속도가 다소 느림

ArrayDeque는 LinkedList보다 성능이 더 좋고 메모리 사용이 적어, Deque 구현체로 더 선호된다.

 

👌결론 : 

Queue는 FIFO(선입선출) 방식, Deque는 양방향 삽입/삭제가 가능한 자료구조
Queue는 LinkedList, PriorityQueue 등으로 구현 가능
Deque는 ArrayDeque 또는 LinkedList로 구현 가능하며, Stack처럼도 사용 가능
빠른 성능이 필요하면 ArrayDeque가 LinkedList보다 더 효율적