📌 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 |