Java에서 객체를 정렬하거나 비교하는 방법에 대해 알아보고자 합니다. 이를 위해 필요한 것이 바로 Comparable
인터페이스와 그 안의 compareTo
메소드입니다. 또한, 이를 이용한 PriorityQueue
의 사용법도 함께 알아보도록 하겠습니다.
📚 Comparable 인터페이스란?
Comparable
은 Java에서 제공하는 인터페이스 중 하나로, 어떤 클래스가 비교 가능하다는 것을 나타내줍니다. Comparable
인터페이스를 구현하는 클래스는 자신의 인스턴스를 다른 객체와 비교할 수 있습니다.
🔍 compareTo 메소드란?
Comparable
인터페이스에는 단 하나의 메소드인 compareTo
가 포함되어 있습니다. 이 메소드는 두 개의 객체를 비교하고 그 결과를 정수형으로 반환합니다.
public int compareTo(T o);
반환 값의 의미는 다음과 같습니다:
- 양수: 호출한 객체(this)가 인수로 전달된 객체보다 큼
- 0: 두 객체가 동일함
- 음수: 호출한 객체(this)가 인수로 전달된 객체보다 작음
🎯 외우기 쉬운 암기 팁
compareTo
메소드를 이해하는 데 도움이 될 암기 팁을 몇 가지 제공하겠습니다.
compareTo
에서 "this"는 호출한 객체, "o"는 비교 대상입니다.this - o
가 양수라면 "this가 o보다 크다"로 이해하고, 음수라면 "this가 o보다 작다"로 이해합니다.- "나(this)보다 그 사람(o)이 키가 크다면, 나는 작은 것이다(음수)"
📊 비교의 예
예를 들어, 아래와 같이 Node
라는 클래스에 Comparable
인터페이스를 구현하고, compareTo
메소드를 count
필드를 기준으로 비교하도록 정의하였다고 가정해 봅시다.
public static class Node implements Comparable<Node>{
public int count;
@Override
public int compareTo(Node node){
return this.count - node.count;
}
}
이렇게 하면 count
값이 작은 Node
부터 큰 Node
까지 오름차순으로 정렬됩니다. Collections.sort()
와 같은 메소드를 사용하면 Node
인스턴스들이 count
필드의 값에 따라 정렬됩니다.
반대로 내림차순 정렬을 원한다면 compareTo
메소드를 아래와 같이 변경하면 됩니다:
@Override
public int compareTo(Node node){
return node.count - this.count;
}
이렇게 하면 count
값이 큰 Node
부터 작은 Node
까지 내림차순으로 정렬됩니다.
🏁 PriorityQueue와 함께 사용하기
PriorityQueue
는 자바의 표준 라이브러리 중 하나로, 우선 순위를 가진 요소들을 관리하는데 사용됩니다. PriorityQueue
는 기본적으로 요소를 자연스러운 순서로 정렬합니다. 자연스러운 순서는 Comparable
인터페이스를 통해 결
정되므로, 위에서 설명한 compareTo
메소드에 따라 Node
들이 PriorityQueue
에 정렬됩니다.
PriorityQueue<Node> queue = new PriorityQueue<>();
위와 같이 PriorityQueue
를 사용하면 count
필드가 가장 작은 Node
부터 큰 Node
까지 순서대로 큐에서 제거됩니다. 이는 compareTo
메소드가 this.count - node.count;
와 같이 정의되었기 때문입니다.
🔖 세 줄 요약
Comparable
인터페이스와 그 안의compareTo
메소드를 이용하여 객체 간의 비교와 정렬을 수행할 수 있습니다.compareTo
메소드의 반환 값(this - o
)에 따라 오름차순 또는 내림차순을 결정합니다.PriorityQueue
는Comparable
을 이용하여 우선순위를 가진 요소들을 관리하며,compareTo
메소드에 따라 요소들이 정렬됩니다.
'CS > JAVA' 카테고리의 다른 글
[Java] Comparable vs Comparator (0) | 2024.07.09 |
---|---|
[Java] String (Array) <-> Int (Array) 변환 정리 (1) | 2024.07.03 |
[Java] Java Record 이것의 정체 (3) | 2023.11.12 |
[Java] String, Char 대소문자 확인 및 변환 (0) | 2023.02.27 |
[JAVA] String <->Char 변환 정리 (0) | 2023.02.27 |