Java Collection - Queue

Queue는 사전적 의미로 ‘줄’을 의미한다고 한다. 구글에 Queue를 검색하면 사람들이 줄지어 서있는 사진을 볼 수 있다.

Queue는 먼저 들어온 데이터가 먼저 나간다고 해서 FIFO(First In First Out)의 형태를 갖는다.

출처 : holycoders

Queue는 위의 이미지를 통해 알 수 있듯이 데이터를 넣을때는 Enqueue, 데이터를 삭제할때는 Dequeue라고 부른다.

Queue의 특징은 다음과 같다.

  • 먼저 들어간 자료가 먼저 나오는 구조 FIFO(First In First Out) 구조
  • 큐는 한쪽 끝을 프론트(front)로 정해서 삭제 연산만 처리하고,
    나머지 한쪽 끝은 리어(rear)로 정해서 삽입 연산만 처리한다.
  • 그래프의 넓이 우선 탐색(BFS)에 사용된다고 한다.
  • 컴퓨터 버퍼(Buffer)에서 주로 사용되며, 입력이 되었지만 처리하지 못할때 큐를 만들어서 데이터를 이곳에 대기시켜놓는다.
  • 대형 메세지 서비스들은 메세지 큐를 만들어서 전송할 메세지를 큐에 담아두고, 서버가 정상적으로 작동하면 큐에서 메세지를 꺼내가도록 해놓았다. 만약 서버가 작동되지 않으면 메세지를 큐에 쌓아둔다.

오라클 레퍼런스 문서를 통해 살펴보도록 하자.

Queue는 java.util에 있는 클래스이다.

Collection<E> 인터페이스를 상속받는 인터페이스이다.

Queue 인터페이스의 주요 메소드들이다.

Methods

  • offer() : Queue에 데이터를 삽입하는데 문제가 없으면 데이터를 그대로 삽입하는 메소드이다.
  • add() : Queue에 데이터를 삽입하는 메소드이다.
  • peek() : Queue의 가장 앞에있는(head) 데이터를 반환하는 메소드이다. 만약 queue가 empty면, null을 반환한다.
  • element() : Queue의 가장 앞에있는(head) 데이터를 반환하는 메소드이다.
  • poll() : Queue의 가장 앞에있는 데이터를 삭제하고, 반환하는 메소드이다. 만약 queue가 empty면, null을 반환한다.
  • remove() : Queue의 가장 앞에있는 데이터를 삭제하고, 반환하는 메소드이다.

offer()

1
boolean offer(E e)

파라미터로 들어온 데이터를 Queue로 삽입할 수 있는지 여부를 boolean 타입으로 반환하고, true이면 데이터를 삽입하는 메소드이다.

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.LinkedList;
import java.util.Queue;

public class QueueStudy {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
System.out.println(queue.add(1));
System.out.println(queue.add(2));
System.out.println(queue.add(3));
System.out.println(queue.toString());
}
}

true
true
true
[1, 2, 3]

Queue를 사용하기 위해서는 LinkedList를 사용해야 한다. offer() 메소드를 통해서 true를 반환받으면 데이터를 Queue에 삽입할 수 있다는걸 확인했다.


add()

1
boolean add(E e)

add() 역시 offer()처럼 데이터를 삽입하는 메소드이다.

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.LinkedList;
import java.util.Queue;

public class QueueStudy {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
System.out.println(queue.add(1));
System.out.println(queue.add(2));
System.out.println(queue.add(3));
System.out.println(queue.toString());
}
}

true
true
true
[1, 2, 3]

offer()와 똑같은 역할을 수행하는데 다른게 있다면, add()는 Queue의 공간이 부족해서 데이터 삽입이 안될때, IllegalStateException을 던진다는것 밖에없다.


peek()

1
E peek()

Queue의 head에 있는 데이터를 반환하는 메소드이다. Queue의 head는 가장 먼저 나가게될, 즉 가장 먼저 들어온 데이터에 해당한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.LinkedList;
import java.util.Queue;

public class QueueStudy {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
System.out.println(queue.peek());
queue.add(3);
System.out.println(queue.peek());
System.out.println(queue.toString());
}
}

1
1
[1, 2, 3]

Queue는 First In First Out 형태의 자료구조기 때문에 peek()로 반환되는 데이터는 Queue에 가장 먼저 삽입되어 아직 제거되지 않은 데이터이다.


element()

1
E element()

Queue의 head에 있는 데이터를 반환하는 메소드이다. Queue의 head는 가장 먼저 나가게될, 즉 가장 먼저 들어온 데이터에 해당한다.

둘의 차이는 Queue가 empty상태여서 반환할 데이터가 없다면, element()NoSuchElementException을 던진다는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.LinkedList;
import java.util.Queue;

public class QueueStudy {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
System.out.println(queue.element());
queue.add(3);
System.out.println(queue.element());
System.out.println(queue.toString());
}
}

1
1
[1, 2, 3]

peek()과 똑같은 결과를 반환한다.


poll()

1
E poll()

Queue의 head 데이터를 반환하고, 데이터를 삭제하는 메소드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.LinkedList;
import java.util.Queue;

public class QueueStudy {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);
System.out.println(queue.toString());
System.out.println("head : "+queue.element());

System.out.println("poll : "+queue.poll());
System.out.println(queue.toString());
System.out.println("head : "+queue.element());
}
}

[1, 2, 3]
head : 1
poll: 1
[2, 3]
head : 2 // 데이터 삭제(poll) 이후, head가 변경되었다.

데이터를 삭제하기 전, Queue의 전체 데이터와 head 데이터를 반환하였다. 그리고 poll()로 데이터를 삭제하고, 다시 head를 출력했더니 이번엔 head 데이터가 바뀐걸 확인할 수 있었다.


remove()

1
E remove()

Queue의 head 데이터를 반환하고, 데이터를 삭제하는 메소드이다. poll()와 똑같은 역할을 수행하며, 차이점이 있다면 remove()는 Queue가 empty면, NosuchElementException을 반환한다는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.LinkedList;
import java.util.Queue;

public class QueueStudy {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.offer(3);
System.out.println(queue.toString());
System.out.println("head : "+queue.peek());

System.out.println("delete : "+queue.remove());
System.out.println(queue.toString());
System.out.println("head : "+queue.peek());
}
}

[1, 2, 3]
head : 1
remove: 1
[2, 3]
head : 2



Reference