📌 Queue이란?

- 데이터를 순서대로 처리하는 자료구조

- 선입선출 (FIFO: First In, First Out) 방식

- 먼저 들어온 데이터가 먼저 나가는 줄 서기 구조

예시: 프린터 작업, BFS 탐색, 순차적 처리

 

✅ Queue의 기본 선언 방법

Queue<String> queue = enw LinkedList<>(); // 가장 유연함
Queue<String> queue = new ArrayDeque<>(); // 가장 빠름, 스택도 가능
Queue<Integer> queue = new PriorityQueue<>(); // 자동 정렬됨 (우선순위 큐)

- Queue는 인터페이스이기 때문에 직접 생성은 안 되고, 구현 클래스를 통해 생성해야 함

 

✅ Queue 인터페이스를 구현한 클래스들

  • LinkedList - List, Queue, Deque를 모두 구현한 다기능 클래스
  • ArrayDeque - 가볍고 빠른 큐, 스택 대체 가능
  • PriorityQueue - 자동 정렬되는 우선순위 큐
  • ConcurrentLinkedQueue - 멀티스레드 환경에서 안전한 비동기 큐

✅ Queue의 주요 특징

  • 선입선출 - 먼저 들어온 데이터가 먼저 처리됨
  • 제한된 접근 - 가장 앞(front)과 가장 뒤(rear)만 접근 가능
  • 순차처리 - 순서를 유지하며 처리
  • 활용도 - BFS, 캐시, 순차 이벤트 처리, 쓰레드 작업 등

📌 Deque도 Queue의 확장 인터페이스

- Deque (Double Ended Queue)

  • 양쪽에서 삽입/삭제 가능
  • 큐 + 스택 역할 전부 가능
Deque<String> deque = new ArrayDeque<>();
deque.offerFirst("A");
deque.offerLast("B");
deque.pollFirst(); // "A"
deque.pollLast(); // "B"

 

✨ Queue의 주요 메서드(공통 사용 가능)

메서드 설명 예시 코드 출력 결과
offer(E) 요소 추가 queue.offer("A") [A]
poll() 요소 꺼내고 제거(비어있으면 null) queue.poll(); "A"
peek() 요소 확인 queue.peek(); "A"
remove() 요소 꺼내고 제거(예외 발생 가능) queue.remove(); "A" 또는 예외
element() 요소 확인(예외 발생 가능) queue.element(); "A" 또는 예외

 

✨ Deque의 특화 메서드

메서드 설명 예시 코드 출력 결과
offerFirst(E) 앞에 요소 추가 deque.offerFirst("A"); [A]
offerLast(E) 뒤에 요소 추가 deque.offerFirst("B"); [A, B]
pollFirst() 앞 요소 꺼내고 제거 deque.pollFirst(); "A"
pollLast() 뒤 요소 꺼재고 제거 deque.pollLast(); "B"
peekFirst() 앞 요소 확인 deque.peekFirst(); "A"
peekLast() 뒤 요소 확인 deque.peekLast(); "B"
push(E) 앞에 추가 (스택처럼) deque.push("X"); [X]
pop() 앞에서 제거 (스택처럼) deque.pop(); "X"

 

✨ PriorityQueue의 특화 메서드

메서드 설명 예시 코드 출력 결과
comparator() 정렬 기준 반환 pq.comparator(); null 또는 Comparator 객체
iterator() 요소 순회(정렬순 아님) for (int x : pq) {..} 순회 순서 예측 불가

 

✨ LinkedList의 특화 메서드

메서드 설명 예시 코드 출력 결과
add(index, E) 인덱스 삽입 list.add(0, "apple"); [apple]
get(index) 인덱스 조회 list.get(0); "apple"
remove(index) 인덱스 제거 list.remove(0); []

 

💡 언제 Set을 써야 할까?

상황 추천 구현체 이유
일반적인 순차 처리 ArrayDeque 빠르고 효율적
우선순위가 중요함 PriorityQueue 자동 정렬됨
큐 + 리스트 같이 써야 함 LinkedList 유연하지만 무거움
스택처럼도 쓰고 싶음 ArrayDeque push/pop도 가능
멀티스레드 환경 ConcurrentLinkedQueue 동기화 처리됨

 

⚠️ 주의할 점

  • Queue는 new 불가 - 인터페이스이기 때문
  • PriorityQueue는 자동 정렬 - 기본은 오름차순 (작은 값 우선)
  • ArrayDeque는 null 저장 불가 - NullPointerException
  • LinkedList는 느림 - 유연하지만 성능 떨어짐
  • remove(), element()는 예외 - 비어있을 때 poll/peek 사용 권장
  • 인덱스 삽입 안 됨 - 순차 접근만 가능 (FIFO)

 

📌 기능 비교

클래스 선입선출 양방향 우선순위 인덱스 접근 특징
Queue (인터페이스) 기본 구조
Deque (인터페이스) 양방향 큐
LinkedList List + Queue + Deque
ArrayDeque 가장 빠름
PriorityQueue 자동 정렬 우선순위 큐

 

📌 요약

  • Queue는 자바에서 가장 많이 쓰이는 순차적 자료구조 중 하나
  • 직접 객체 생성은 불가능 → 구현체(LinkedList, ArrayDeque, PriorityQueue) 사용
  • 사용 목적에 따라 구현체 선택이 중요
  • Deque는 Queue의 확장이며, 양방향 큐이자 스택 대체도 가능

'Programming > Java' 카테고리의 다른 글

[Java] Map  (0) 2025.04.22
[Java] 컬렉션(Collection) - Set  (0) 2025.04.18
[Java] 스레드  (0) 2025.04.17
[Java] 컬렉션(Collection) - List  (0) 2025.04.17
[Java] 컬렉션(Collection) 프레임워크  (0) 2025.04.16