[Java] 자바 Queue(큐) 인터페이스 사용법 및 구현 클래스

오늘은 자바 Queue 인터페이스에 대해서 알아보겠습니다. 자바 Queue는 FIFO(First In, First Out) 구조로 처음 들어온 데이터가 제일 처음 나가는 구조입니다. 그럼 바로 자바 Queue는 무엇이고 사용법, 구현 클래스인 LinkedList와 PriorityQueue에 대해서도 간단히 알아보겠습니다.


목차


자바 Queue 인터페이스

자바 Queue 인터페이스

자바 Queue 인터페이스는 자바의 Collection 프레임워크에 속한 자료구조로 데이터의 추가와 삭제를 순서대로 처리합니다. Queue는 FIFO(First In, First Out) 원칙에 따라 데이터를 관리하며, 큐의 맨 끝에서 데이터를 추가하고(Enqueue) 큐의 맨 앞에서는 데이터가 삭제(Dequeue) 됩니다.


Queue의 특징

  • FIFO(First In FIrst Out) 구조, 먼저 들어간 자료가 먼저 나오는 구조
  • 큐의 맨 앞은 프런트(front)로 정하여 삭제 연산만 수행함
  • 큐의 맨 뒤는 리어(rear)로 정하여 삽입 연산만 수행함
  • 그래프의 넓이 우선 탐색(BFS), 네트워크 관리, 시스템 대기열, 프린터 스케줄링, 데이터 스트림 처리 등 다양한 분야에서 널리 사용

Queue 구현 클래스


LinkedList

LinkedList

LinkedList는 이중 연결 리스트 데이터 구조를 이용해 Queue 인터페이스를 구현합니다. 이중 연결 리스트는 노드로 이루어져 있는데 이 노드는 데이터 부분주소 부분을 별도로 가지고 있습니다. LinkedList에 객체를 추가하거나 삭제하면 앞, 뒤 주소만 변경되고 나머지는 변경되지 않습니다. 그러나 인덱스가 없기 때문에 특정 요소에 접근하기 위해서는 순차 탐색이 필요하므로 탐색 속도가 떨어진다는 단점이 있습니다.


자바 LinkedList에 대해서 더 궁금하시다면 여기를 클릭하세요.


PriorityQueue

PriorityQueue

자바 PriorityQueue는 자바의 Queue 인터페이스의 구현 클래스입니다. 일반적인 Queue(큐)의 FIFO(First-In-First-Out)를 따르지만 우선 순위에 따라 요소를 정렬하여 우선 순위가 가장 높은 요소 먼저 처리되도록 합니다.


자바 PriorityQueue에 대해서 더 궁금하시다면 여기를 클릭하세요.


LinkedList와 PriorityQueue 장단점 비교


LinkedList
  • 장점: 요소의 추가 및 제거가 빠름, 저장 공간을 효율적으로 사용
  • 단점: 중간에 있는 요소를 검색 또는 수정하는 데 느림
PriorityQueue
  • 장점: 우선순위에 따라 자동 정렬, 정렬된 상태를 유지하면서 데이터를 빠르게 추가함
  • 단점: 추가 및 삭제할 때의 시간 복잡도가 O(log n)으로 상대적으로 느림

자바 Queue 사용법


선언

1
2
3
import java.util.LinkedList; //import
import java.util.Queue; //import
Queue<Integer> queue = new LinkedList<>(); //int형 queue 선
cs

Queue는 주로 LinkedList를 이용해서 선언합니다. LinkedList는 요소의 추가제거의 속도가 빠르기 때문입니다.


데이터 추가

데이터 추가

자바 Queue에서 데이터를 추가할때는 add(value) 나 offer(value) 메서드를 사용하면 됩니다. add메서드는 데이터 추가가 성공하면 true를 반환하고 실패하면 IllegalStateException을 발생시킵니다. Queue는 중간에 값을 추가하는것이 불가능합니다. Queue의 데이터는 맨 뒤로만 추가될 수 있습니다.

1
2
3
4
5
6
Queue<Integer> queue= new LinkedList<>(); //int형 queue 선언
queue.add(3);     // queue에 데이터 3 추가
queue.add(7);     // queue에 데이터 7 추가
queue.offer(8);   // queue에 데이터 8 추가
 
System.out.println(queue);
cs

  • add(value) : queue에 value값 추가
  • offer(value) : queue에 value값 추가

결과

데이터 추가 결과

데이터 삭제

데이터 삭제

자바 Queu에서 첫 번째 데이터를 삭제하고 싶다면 remove() 와 poll()을 사용하면 되고 전체 데이터를 삭제하고 싶다면 clear() 메서드를 사용하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        // 값 추가
        queue.add(3);
        queue.add(7);
        queue.offer(8);
        System.out.println(“원래 데이터 : “ + queue);
        
        // 값 삭제
        Integer removedValue1 = queue.remove();
        Integer removedValue2 = queue.poll();
        System.out.println(“삭제 할 데이터 1 : “ + removedValue1); 
        System.out.println(“삭제 할 데이터 2 : “ + removedValue2); 
        System.out.println(“데이터 삭제 : “ + queue);
        
        queue.clear();
        System.out.println(“전체 데이터 삭제 : “ + queue); 
    }
}
cs

  • remove() : 첫 번째 값을 반환하고 제거, 비어있다면 null 반환
  • poll() : 첫 번째 값을 반환하고 제거, 비어있다면 null 반환
  • clear() : 전체 데이터 삭제

결과

데이터 삭제 결과

크기 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        
        // 값 추가
        queue.add(3);
        queue.add(7);
        queue.offer(8);
        System.out.println(“원래 데이터 : “ + queue);
        
        
        System.out.println(“Queue의 크기는 : “ + queue.size()); 
    }
}
cs

  • size() : Queue의 크기를 반환

결과

크기 구하기 결과

맨 앞에 있는 데이터 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();        
        // 값 추가
        queue.add(3);
        queue.add(7);
        queue.offer(8);
        System.out.println(“원래 데이터 : “ + queue);
        
        
        System.out.println(“맨 앞에 데이터는 ?? : “ + queue.element()); 
        System.out.println(“맨 앞에 데이터는 ?? : “ + queue.peek());    }
}
cs

  • peek() : 맨 앞에 데이터 조회 및 반환, Queue가 비어 있다면 null 반환
  • element() : 맨 앞에 데이터 조회 및 반환, Queue가 비어 있다면 예외 발생

결과

맨 앞에 있는 데이터 출력 결과

데이터 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        
        // 값 추가
        queue.add(3);
        queue.add(7);
        queue.offer(8);
        System.out.println(“원래 데이터 : “ + queue);
        
        
        // 향상된for문을 사용하여 값 출력
        for(Integer i : queue)
            System.out.print(i + ” “);
        
        System.out.println();
        
        // Iterator 사용 값 출력
        Iterator iter = queue.iterator();
        while(iter.hasNext())
              System.out.print(iter.next() + ” “);
        
        System.out.println();
        
        // forEach()메소드를 통해 출력( 자바 8부터 사용할 수 있다)
        queue.stream().forEach(System.out::print); 
    }
}
cs

자바 Queue에서 데이터를 출력하는 방법에는 향상된 for문, Iterator 사용, forEach() 사용 등이 있습니다.

결과

데이터 출력 결과

결론

자바 Queue는 선입선출 원칙, 다양한 구현과 활용(LinkedList, PriorityQueue), 병렬 처리와 확장성, 가독성과 관리가 편이하다는 특징이 있습니다.

소프트웨어 개발에 있어서 데이터의 일정한 순서를 유지하고 관리하는 데 자바 Queue를 활용하면, 더욱 효율적이고 견고한 프로그램을 개발할 수 있습니다.

자바 추가 정보

  • Vector에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • List 인터페이스에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • Set 인터페이스에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • 최신 자바 프레임 워크가 궁금하시다면 여기를 클릭해 주세요.

Leave a Comment