Queue<E>
인터페이스Java의 Queue
인터페이스는 컬렉션 프레임워크의 일부로, FIFO(First-In-First-Out, 선입선출) 방식의 요소 관리가 필요한 경우에 사용한다.
Queue 인터페이스를 구현한 주요 클래스에는 LinkedList
, PriorityQueue
, ArrayDeque
등이 있다.
LinkedList
Queue
인터페이스를 구현하므로, 큐로서 사용 가능ArrayDeque
Deque(Double-Ended Queue)
를 구현하여 양쪽 끝에서 요소를 추가 및 제거 가능PriorityQueue
Queue<E>
인터페이스 메서드Queue<E>
인터페이스는 큐 메모리 구조를 표현하기 위해, 다음과 같은 Collection
인터페이스 메서드만을 상속받아 사용한다.
boolean add(E e)
해당 큐의 맨 뒤에 전달된 요소를 삽입함. 만약 삽입에 성공하면 true
를 반환하고, 큐에 여유 공간이 없어 삽입에 실패하면 IllegalStateException
을 발생시킴.
E element()
해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.
boolean offer(E e)
해당 큐의 맨 뒤에 전달된 요소를 삽입함.
E peek()
해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.
만약 큐가 비어있으면 null을 반환함.
E poll()
해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환하고, 해당 요소를 큐에서 제거함.
만약 큐가 비어있으면 null을 반환함.
E remove()
해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 제거함.
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
// 큐의 생성
LinkedList<String> qu = new LinkedList<String>();
// Deque<String> qu = new ArrayDeque<String>();
// add() 메소드를 이용한 요소의 저장
qu.add("넷");
qu.add("둘");
qu.add("셋");
qu.add("하나");
// peek() 메소드를 이용한 요소의 반환
System.out.println(qu.peek()); // 넷
System.out.println(qu); // [넷, 둘, 셋, 하나]
// poll() 메소드를 이용한 요소의 반환 및 제거
System.out.println(qu.poll()); // 넷
System.out.println(qu); // [둘, 셋, 하나]
// remove() 메소드를 이용한 요소의 제거
qu.remove("하나");
System.out.println(qu); // [둘, 셋]
}
}
PriorityQueue<E>
클래스일반적인 queue는 먼저 들어간 데이터가 먼저 나가는 FIFO 형식의 구조이다. 반면에 우선순위 큐의 경우 들어가는 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 자료구조이다.
선언 방법은 아래와 같다.
// 기본형: 우선순위가 낮은 숫자가 먼저 나옴 (작은 숫자)
PriorityQueue<Integer> pQ = new PriorityQueue<>();
// 우선순위가 높은 숫자가 먼저 나옴 (큰 숫자)
PriorityQueue<Integer> pQ = new PriorityQueue<>(Collections.reverseOrder());
add()
와 offer()
의 차이boolean add(E e)
우선순위 큐에 원소를 추가. 큐가 꽉 찬 경우 OutOfMemoryError 예외 발생
boolean offer(E e)
우선순위 큐에 원소를 추가. 값 추가 실패 시 false를 반환
import java.util.PriorityQueue;
public class Example {
public static void main(String[] args) {
// 기본형: 우선순위가 낮은 숫자가 먼저 나옴 (작은 숫자)
PriorityQueue<Integer> pQ = new PriorityQueue<>();
pQ.offer(1); // pQ에 원소 1 추가
pQ.offer(6); // pQ에 원소 6 추가
pQ.offer(2); // pQ에 원소 2 추가
// pQ가 비어있면: true, 그렇지 않으면 : false
while(!pQ.isEmpty()) {
// pQ에 첫 번째 값을 반환하고 제거, 비어있다면 null 반환
System.out.println("pQ.poll() = " + pQ.poll());
}
}
}
// pQ.poll() = 1
// pQ.poll() = 2
// pQ.poll() = 6
참고자료
http://www.tcpschool.com/java/java_collectionFramework_stackQueue
https://kbj96.tistory.com/49