Queue의 사전적 의미는 '무엇을 기다리는 사람', '차량 등의 줄 혹은 줄을 서서 기다리는 것'을 의미하는데 이처럼 줄을 지어 순서대로 처리되는 것이 Queue라는 자료구조이다. 큐는 데이터를 일시적으로 쌓아두기 위한 자료구조로 Stack과는 다르게 FIFO(First In First Out)의 형태를 가진다. 말 그대로 먼저 들어온 데이터가 가장 먼저 나가는 구조다.
Queue의 특징
Queue 선언
import java.util.LinkedList;
import java.util.Queue;
Queue<Integer> q = new LinkedList<>(); // int형 queue 선언
Queue<String> q = new LinkedList<>(); // String형 queue 선언
Java에서 Queue를 생성하기 위해서는 LinkedList를 활용하여 생성해야 한다.
Queue 값 추가
Queue<Integer> q = new LinkedList<>(); // int형 queue 선언
q.offer(3);
q.offer(5);
q.offer(1);
q.offer(4);
System.out.println(q); // 출력 결과 : [3, 5, 1, 4]
Queue에 값을 추가하려면 offer(value) 메서드를 사용한다. 이때, add(value) 메서드를 사용해서도 값을 추가할 수 있다.
큐 용량 초과 등의 이유로 값 추가에 실패했을 때, add() 메서드는 예외를 발생시키고 offer() 메서드는 false를 리턴한다는 차이가 있다.
Queue 값 삭제
Queue<Integer> q = new LinkedList<>(); // int형 queue 선언
q.offer(3);
q.offer(5);
q.offer(1);
q.offer(4);
q.poll();
System.out.println(q); // 출력 결과 : [5, 1, 4]
q.clear();
System.out.println(q); // 출력 결과 : []
Queue의 값을 삭제하기 위해서는 poll() 메서드를 사용한다. Queue는 FIFO 형태를 가지고 있으므로 poll() 메서드를 사용하면 데이터 중 가장 먼저 넣었던 데이터가 제거된다. Queue의 모든 데이터를 삭제하기 위해서는 clear() 메서드를 사용한다.
Queue에서 가장 먼저 들어간 값
Queue<Integer> q = new LinkedList<>(); // int형 queue 선언
q.offer(3);
q.offer(5);
q.offer(1);
q.offer(4);
System.out.println(q.peek()); // 출력 결과 : 3
peek() 메서드는 Queue에서 가장 먼저 들어간 값(poll() 메서드 사용시 가장 먼저 삭제될 값)을 리턴한다. poll() 메서드 또한 같은 값을 리턴하지만, peek()은 삭제를 하지 않고 확인만 한다는 차이가 있다.
Queue 유사 메서드와의 차이
위 표는 추가,삭제,검사의 같은 기능을 하지만 차이를 갖는 유사한 메서드들을 비교한 표이다. add(), remove(), element() 메서드는 실행에 실패할 경우 예외를 발생시키지만 offer(), poll(), peek() 메서드는 실패할 경우null 또는 false를 리턴한다는 차이가 있다.
dequeue와 peek의 경우, 직접 테스트해보며 반환값을 확인했다. 그러나 enqueue의 경우 실패하는 상황을 확인하려면 Queue의 용량이 꽉 차서 실패할 때를 확인해야 하는데, 이는 확인에 어려움을 겪어서 확실하게 확인하지는 못 했다.
참고자료(blog)
https://coding-factory.tistory.com/602
https://jinyoungchoi95.tistory.com/29
https://goodteacher.tistory.com/112