티스토리 뷰

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;와 같이 정의되었기 때문입니다.

 

 

🔖 세 줄 요약

  1. Comparable 인터페이스와 그 안의 compareTo 메소드를 이용하여 객체 간의 비교와 정렬을 수행할 수 있습니다.
  2. compareTo 메소드의 반환 값(this - o)에 따라 오름차순 또는 내림차순을 결정합니다.
  3. PriorityQueueComparable을 이용하여 우선순위를 가진 요소들을 관리하며, compareTo 메소드에 따라 요소들이 정렬됩니다.

 

'JAVA > 문법.개념' 카테고리의 다른 글

[Java] String, Char 대소문자 확인 및 변환  (0) 2023.02.27
[JAVA] String <->Char 변환 정리  (0) 2023.02.27