Queue(큐)
사전적으로 Queue(큐)는 (무엇을 기다리는 사람자동차 등의)줄
이란 뜻이다. 자료구조에서 Queue(큐)는 처리를 기다리는 데이터들이 기다리는 줄이라고 보면 된다. 스택(Stack)과 더불어 가장 많이 사용되는 자료구조 중 하나로 FIFO(First In First Out) 형태로 데이터가 처리된다. 즉, 먼저 들어온 데이터가 먼저 처리된다.
큐에 데이터를 집어 넣는 동작을 'enqueue'라고 한다. 큐의 맨 뒤에 데이터를 추가하는 동작이다. 큐에서 데이터를 빼내는 동작은 'dequeue'라고 한다. 가장 앞에 있는 데이터가 dequeue 연산을 통해 큐에서 제거된다.
enqueue 연산은 항상 데이터를 큐의 맨 뒤에만 추가한다. dequeue 연산은 큐의 맨 앞에 있는 데이터만 뽑아낸다. 일렬로 줄을 선 데이터들을 앞에서부터 처리하는 것을 생각하면 편하다.
Queue 사용법
import java.util.LinkedList;
import java.util.Queue;
public class Example {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("data1"); // "data1"을 큐에 추가
queue.add("data2"); // "data2"을 큐에 추가
queue.offer("data3"); // "data3"을 큐에 추가
System.out.println(queue.poll()); // 첫 번째 값을 반환하고 큐에서 제거, 큐가 비어있다면 null
System.out.println(queue.remove()); // 첫번째 값 제거
queue.clear(); // 큐 초기
}
}
자바에서 큐를 간단하게 사용하는 방법은 LinkedList를 사용하는 것이다. LinkedList 클래스는 Deque(덱)이라는 인터페이스를 정의하고 있다. 이 Deque 인터페이스는 Queue 인터페이스를 상속하고 있으므로 LinkedList 클래스는 Queue를 구현하고 있다. 따라서 Queue<String> queue = new LinkedList<>(); 같이 할당해서 사용할 수 있다.
Queue - Enqueue 동작
Queue 클래스는 add(value) 혹은 offer(value) 메소드를 이용해서 큐에 값을 넣을 수 있다.
두 메소드 모두 큐의 맨 뒤쪽에 새로운 값을 추가하는 메소드다. 두 메소드의 차이점은 공간의 제약이 있는 큐 구현체에서 발생한다. add(value) 메소드는 큐가 꽉차는 상황에서 IllegalStateException을 발생시킨다. offer(value) 메소드는 false를 반환하도록 되어 있다. 따라서 사이즈 제약이 있는 큐를 사용하는 경우 offer(value) 메소드의 사용을 좀 더 권장한다.
Queue - Dequeue 동작
반대로 Queue 클래스는 poll() 혹은 remove() 메소드를 이용해서 큐의 값을 제거할 수 있다.
두 메소드 모두 큐의 맨 앞쪽에서 값을 제거하는 메소드다. 두 메소드의 차이점은 큐에 아무런 엘리먼트가 없는 경우 발생한다. poll() 메소드는 큐가 비어있을 경우 null을 리턴한다. 반면 remove() 메소드는 NoSuchElementException을 발생시킨다.
한번에 큐에 있는 모든 데이터를 지우고 싶으면 clear() 메소드를 호출하면된다.
Queue - Peek 동작
큐에 있는 첫 번째 데이터를 참조만하고 지우고 싶지 않은 경우도 있다. 이 경우 peek() 메소드나 element() 메소드를 이용하면 된다.
두 메소드 역시 큐가 비어있을 때 동작 차이가 있다. peek() 메소드는 큐가 비어있을 때 null을 리턴하고, element() 메소드는 큐가 비어있을 때 NoSuchElementException을 발생시킨다.
댓글