Java PriorityQueue 클래스: 초보자를 위한 가이드

서론

안녕하세요, 미래의 자바 프로그래머 여러분! 오늘은 자바의 PriorityQueue에 대해 둘러보는 시간을 가질 것입니다. 이전에 들어본 적이 없也不要緊습니다 – 처음부터 시작하여 함께 공부하겠습니다. PriorityQueue를 특별한 종류의 줄(또는 큐)로 생각해보세요. 여기서 가장 중요한 사람(또는 항목)가 항상 먼저 가는 곳입니다. 흥미롭지 않나요? 시작해보겠습니다!

Java - PriorityQueue

클래스 선언

자바에서 PriorityQueue 클래스는 자바 컬렉션 프레임워크의 일부입니다. 데이터에 대한 VIP 명단이라고 생각하세요! 다음과 같이 선언할 수 있습니다:

import java.util.PriorityQueue;

PriorityQueue<ElementType> pq = new PriorityQueue<>();

ElementType를 원하는 데이터 형식으로 대체하세요, 예를 들어 Integer, String, 심지어 커스텀 오브젝트(다음에 다룰 것입니다)라도 가능합니다.

매개변수

PriorityQueue를 생성할 때, 몇 가지 선택적 매개변수를 지정할 수 있습니다:

  1. 초기 용량: 처음에 몇 개의 항목을 저장할 수 있는지.
  2. 비교자: 항목의 순서를 결정하는 특별한 오브젝트.

다음은 예입니다:

PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());

이 코드는 최초에 10개의 정수를 저장할 수 있는 PriorityQueue를 생성하며, 정수는 가장 높은 것부터 가장 낮은 것으로 정렬됩니다.

클래스 생성자

PriorityQueue는 여러 생성자를 제공합니다. 생성자를 큐를 만들기 위한 다양한 레시피라고 생각해보세요. 주요 생성자는 다음과 같습니다:

생성자 설명
PriorityQueue() 기본 초기 용량(11)으로 빈 큐를 생성합니다
PriorityQueue(int initialCapacity) 지정된 초기 용량으로 빈 큐를 생성합니다
PriorityQueue(Comparator<? super E> comparator) 지정된 비교자로 빈 큐를 생성합니다
PriorityQueue(Collection<? extends E> c) 지정된 컬렉션의 요소들로 큐를 생성합니다

예를 들어보겠습니다:

PriorityQueue<String> fruitQueue = new PriorityQueue<>();
PriorityQueue<Integer> numberQueue = new PriorityQueue<>(20);

첫 번째 줄에서 문자열(아마도 과일 이름?)을 저장할 큐를 만듭니다. 두 번째 줄에서는 최초에 20개의 항목을 저장할 수 있는 숫자 큐를 만듭니다.

클래스 메서드

이제 PriorityQueue에서 할 수 있는 멋진 일들을 살펴보겠습니다:

메서드 설명
add(E e) 큐에 요소를 추가합니다
offer(E e) 큐에 요소를 추가합니다(채워질 경우 false를 반환합니다)
peek() 큐의 맨 앞 요소를 검색하지만 제거하지 않습니다
poll() 큐의 맨 앞 요소를 검색하고 제거합니다
remove(Object o) 지정된 요소의 단일 인스턴스를 제거합니다
size() 큐의 요소 수를 반환합니다
clear() 큐의 모든 요소를 제거합니다

이제 실제로 보여드리겠습니다:

PriorityQueue<String> animalQueue = new PriorityQueue<>();

animalQueue.add("Dog");
animalQueue.offer("Cat");
animalQueue.add("Elephant");

System.out.println("Peek: " + animalQueue.peek()); // 출력: Peek: Cat
System.out.println("Poll: " + animalQueue.poll()); // 출력: Poll: Cat
System.out.println("Size: " + animalQueue.size()); // 출력: Size: 2

"Cat"이 먼저 나왔습니까? 그 이유는 PriorityQueue가 기본적으로 문자열을 알파벳순으로 정렬하기 때문입니다.

상속된 메서드

PriorityQueue는 부모 클래스에서 메서드를 상속받습니다. 보너스 기능을 얻는 것과 같습니다! 유용한 몇 가지는 다음과 같습니다:

  • contains(Object o): 큐에 지정된 요소가 있는지 확인합니다
  • toArray(): 큐의 모든 요소를 포함하는 배열을 반환합니다
  • iterator(): 큐의 요소에 대한 이터레이터를 반환합니다

빠른 예를 보여드리겠습니다:

PriorityQueue<Integer> numberQueue = new PriorityQueue<>();
numberQueue.add(5);
numberQueue.add(2);
numberQueue.add(8);

System.out.println("Contains 2? " + numberQueue.contains(2)); // 출력: Contains 2? true

Object[] array = numberQueue.toArray();
System.out.println("First element: " + array[0]); // 출력: First element: 2

PriorityQueue에 항목 추가 예제

모든 것을 함께 집어넣어 재미있는 예제를 만들어보겠습니다. 모임을 조직하고 있고, 손님들이 도착한 순서대로 인사를 하고 싶다고 상상해보세요:

import java.util.PriorityQueue;

public class PartyGreeter {
public static void main(String[] args) {
PriorityQueue<Guest> guestQueue = new PriorityQueue<>();

guestQueue.add(new Guest("Alice", 18.30));
guestQueue.add(new Guest("Bob", 18.15));
guestQueue.add(new Guest("Charlie", 18.45));

while (!guestQueue.isEmpty()) {
Guest guest = guestQueue.poll();
System.out.println("Welcome, " + guest.name + "! You arrived at " + guest.arrivalTime);
}
}

static class Guest implements Comparable<Guest> {
String name;
double arrivalTime;

Guest(String name, double arrivalTime) {
this.name = name;
this.arrivalTime = arrivalTime;
}

@Override
public int compareTo(Guest other) {
return Double.compare(this.arrivalTime, other.arrivalTime);
}
}
}

이 프로그램은 다음과 같은 출력을 합니다:

Welcome, Bob! You arrived at 18.15
Welcome, Alice! You arrived at 18.3
Welcome, Charlie! You arrived at 18.45

이 예제에서는 Guest 클래스를 커스텀으로 만들고, 자바에게 손님들을 도착 시간에 따라 어떻게 비교할지 알려주었습니다. 그런 다음 PriorityQueue가 자동으로 우리의 손님들을 정렬해주었습니다!

그리고 이렇게 하면 됩니다! 자바의 PriorityQueue 세계로의 첫 걸음을 내딛었습니다. 연습이 쌓이면 완벽해집니다, 이러한 개념들을 실험해보세요.谁知道? 아마도 다음 모임의 손님 명단을 조직하기 위해 PriorityQueue를 사용할지도 모릅니다!

Credits: Image by storyset