java 1.5 이후로 들어온 Queue는 컬렉션 프레임 워크를 사용하는 인터페이스 중 하나이다.
데이터를 어떠한 방식으로 저장하고, 꺼내올 것인지를 정하는 방법의 일종이라 생각하면 이해가 빠를 것이다.
그 중 가장 간단하고 기본이 되는것이 Queue 이다.
Queue에 데이터를 입력하면 순차적으로 데이터가 저장이 된다.
그리고 저장된 데이터를 다시 꺼낼때 Queue의 특징이 나타나는데, 먼저 저장된 값들이 먼저 나오게 된다.
그림으로 표현하면
이러한 그림이 나온다.
우리나라 말로는 선입선출이라 표현할 수 있고, 외국에서는 First In First Out의 앞글자를 따서 FIFO 방식이라 할 수 있다.
java에서 Queue를 사용하기 위해서는 import를 먼저 해줘야한다.
import java.util.LinkedList;
import java.util.Queue;
Queue를 구현하는데 왜 LinkedList도 필요한지 궁금할것이다.
Queue는 기존에 있던것이 아니고 자바 1.5버전 이후에 들어온 것이기 때문에 구현체를 따로 만들어줘야한다 그래서 여러가지 프레임 워크로 으로 만들 수 있는데, 가장 많이 사용하는 프레임워크가 LinkedList이다.
큐도 순차적으로 되어있는것 같은데 왜 익숙한 ArrayList 프레임워크가 아니라 LinkedList로 만드는것일까?
여기서 ArrayList와 LinkedList 의 방식의 차이를 알면 이해가 빠르다.
먼저, LinkedList는 데이터가 순차적으로 되어있는 것 같지만 사실 데이터가 순차적으로 존재하는 것은 아니다. 단지 하나의 데이터가 이전 데이터의 주소값, 이후 데이터의 주소값, 그리고 데이터의 값만 들어있는 형태이다.
때문에 LinkedList는 값을 삭제, 추가할때 각 데이터의 주소값만 변경하면 되기 때문에 삽입과 삭제가 매우 빠르다.
반면, ArrayList 는 데이터가 순차적으로 존재한다. ArrayList는 조금 복잡한 구조로 움직인다. 가장 먼저 지정된 크기보다 더 많은 데이터가 들어올 경우는 더 큰 ArrayList를 생성하고 기존의 값들이 복사 되어 저장된 후 새로운 값이 들어오는 구조이다. 삽입과 삭제의 경우도 이와 비슷하게 복사를 통해 이루어진다.
때문에 Queue 인스턴스를 만들때는 보다 삽입과 삭제가 빠른 LinkedList를 사용하여 만든다.
Queue인스턴스 생성 방법
Queue<E> que = new LinkedList<>();
일반적인 인스턴스 생성과 매우 흡사하지만 제너릭 방식으로 타입을 확정해주는것이 좋다.
Queue<Integer> que = new LinkedList<>();
que.add(1);//값 입력 방법 1
que.offer(2);//값 입력 방법 2
que.add(3);
que.offer(4);
System.out.println(que.peek()); // 가장 앞에 있는 값을 가져옴. 삭제 X
System.out.println(que);
System.out.println(que.poll()); // 가장 앞에 있는 값을 가져옴. 삭재 O
System.out.println(que);
System.out.println(que.contains(3)); // 3이 들어있는지. 있으면 true, 없으면 false
System.out.println(que.isEmpty()); // que가 비어있는지. 비어있으면 true, 아니면 false
que.remove(2);// 해당 하는 값을 제거
System.out.println(que);
System.out.println(que.size()); // que의 크기
que.clear();//que 데이터 전체 삭제
System.out.println(que);
위 코드의 출력은 이렇게 나온다