Java PriorityQueue 클래스: 초보자를 위한 가이드
서론
안녕하세요, 미래의 자바 프로그래머 여러분! 오늘은 자바의 PriorityQueue에 대해 둘러보는 시간을 가질 것입니다. 이전에 들어본 적이 없也不要緊습니다 – 처음부터 시작하여 함께 공부하겠습니다. PriorityQueue를 특별한 종류의 줄(또는 큐)로 생각해보세요. 여기서 가장 중요한 사람(또는 항목)가 항상 먼저 가는 곳입니다. 흥미롭지 않나요? 시작해보겠습니다!
클래스 선언
자바에서 PriorityQueue 클래스는 자바 컬렉션 프레임워크의 일부입니다. 데이터에 대한 VIP 명단이라고 생각하세요! 다음과 같이 선언할 수 있습니다:
import java.util.PriorityQueue;
PriorityQueue<ElementType> pq = new PriorityQueue<>();
ElementType
를 원하는 데이터 형식으로 대체하세요, 예를 들어 Integer, String, 심지어 커스텀 오브젝트(다음에 다룰 것입니다)라도 가능합니다.
매개변수
PriorityQueue를 생성할 때, 몇 가지 선택적 매개변수를 지정할 수 있습니다:
- 초기 용량: 처음에 몇 개의 항목을 저장할 수 있는지.
- 비교자: 항목의 순서를 결정하는 특별한 오브젝트.
다음은 예입니다:
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