프로그래밍 공부
[자바] #12. 컬렉션 프레임워크 - 3. Queue, Deque 본문
✅ Queue 주요 특징
- FIFO (First-In-First-Out) → 먼저 추가된 요소가 먼저 제거됨
- 삽입(offer()), 삭제(poll()), 조회(peek()) 등 주요 연산 제공
- 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 주요 특징
- 양쪽에서 삽입(offerFirst(), offerLast())과 삭제(pollFirst(), pollLast())가 가능
- FIFO와 LIFO 모두 지원 (Queue + Stack 기능)
- 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보다 더 효율적
'자바' 카테고리의 다른 글
| [자바] #14. Collections 클래스 안의 여러 알고리즘 구현 메서드들 (0) | 2025.02.19 |
|---|---|
| [자바] #13. 컬렉션 프레임워크 - 4. Map (0) | 2025.02.16 |
| [자바] #11. 컬렉션 프레임워크 - 2. Set (HashSet, TreeSet) (0) | 2025.02.16 |
| [자바] #10. 컬렉션 프레임워크 - 1. 컬렉션에 대한 전반적인 이해와 ArrayList에 대해 (0) | 2025.02.16 |
| [자바] #09. 와일드카드 (Wildcard) - 2. 상한 제한과 하한 제한 (0) | 2025.02.15 |