본문 바로가기
  • 개발하는 곰돌이
Programming Language/Kotlin & Java

Kotlin에서 두 객체의 비교(CompareTo)

by 개발하는 곰돌이 2022. 12. 9.

개요

Java에서는 두 객체를 비교하려면 Comparable 인터페이스의 CompareTo() 메소드를 구현하여 객체를 비교해야 했다. Kotlin에서도 마찬가지로 두 객체를 비교하려면 Comparable 인터페이스의 CompareTo() 메소드를 구현해야 하는것은 동일하지만 이 과정만 수행해놓으면 훨씬 직관적으로 두 객체를 비교할 수 있다. 이에 대해 알아보도록 하자.

 

Comparable 인터페이스의 CompareTo() 메소드는 현재 객체와 파라미터로 받은 객체 사이의 특정 연산을 통해 결과가 양수이면 현재 객체가 더 크고, 결과가 음수이면 현재 객체가 더 작다고 판별한다.

Java에서의 두 객체 비교

Java에서 두 객체를 비교하려면 객체의 클래스에서 Comparable 인터페이스의 CompareTo() 메소드를 구현하고, 이를 토대로 두 객체를 비교해야 했다. 아래의 코드는 사람을 나타내는 Person 클래스에서 키를 우선적으로 비교하고 키가 같다면 몸무게를 비교하는 경우를 나타낸 것이다.

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person(170, 60);
        Person person2 = new Person(178, 68);
        Person person3 = new Person(178, 70);

        if (person2.compareTo(person1) > 0)
            System.out.println("2번 사람은 1번 사람보다 큽니다.");
        else
            System.out.println("2번 사람은 1번 사람보다 작습니다.");
        if (person2.compareTo(person3) > 0)
            System.out.println("2번 사람은 3번 사람보다 큽니다.");
        else
            System.out.println("2번 사람은 3번 사람보다 작습니다.");
    }

    static class Person implements Comparable<Person> {
        int height;
        int weight;

        public Person(int height, int weight) {
            this.height = height;
            this.weight = weight;
        }

        @Override
        public int compareTo(@NotNull Person o) {
            if (this.height == o.height) return this.weight - o.weight;
            else return this.height - o.height;
        }
    }
}

/*
2번 사람은 1번 사람보다 큽니다.
2번 사람은 3번 사람보다 작습니다.
*/

Java에서는 이와 같이 직접적으로 CompareTo() 메소드를 직접 호출하여 그 결과값을 토대로 두 객체를 비교해야 했다. 그러다보니 직관성이 조금 떨어지는 면이 있었다.


Kotlin에서의 두 객체 비교

Kotlin에서도 두 객체를 비교하기 위해 객체의 클래스에서 Comparable 인터페이스의 CompareTo() 메소드를 구현해야 하는 것은 동일하나, Kotlin에서는 CompareTo()를 직접 호출하지 않고도 두 객체를 비교할 수 있다. 위의 Java 코드를 Kotlin 코드로 나타내면 아래와 같다.

fun main() {
    val person1 = Person(170, 60)
    val person2 = Person(178, 68)
    val person3 = Person(178, 70)
    
    if (person2 > person1) 
        println("2번 사람은 1번 사람보다 큽니다.") 
    else 
        println("2번 사람은 1번 사람보다 작습니다.")
    if (person2 > person3) 
        println("2번 사람은 3번 사람보다 큽니다.") 
    else 
        println("2번 사람은 3번 사람보다 작습니다.")
}

class Person(var height: Int, var weight: Int) : Comparable<Person> {
    override operator fun compareTo(other: Person) = 
    if (height == other.height) weight - other.weight 
    else height - other.height
}

/*
2번 사람은 1번 사람보다 큽니다.
2번 사람은 3번 사람보다 작습니다.
*/

코드에서 볼 수 있듯이 Kotlin에서는 객체의 클래스에서 Comparable 인터페이스를 구현했다면 수를 비교하는 것과 동일하게 부등호만으로도 두 객체를 비교할 수 있다. 이는 Kotlin의 CompareTo() 메소드가 operator fun, 즉 연산자 함수이기 때문이며 부등호만 사용해도 CompareTo()를 호출하게 된다.

부등호에 마우스를 올려보면 compareTo() 메소드를 가리킨다는 것을 알 수 있다.

Kotlin에서는 이렇게 메소드를 직접 호출하지 않고 부등호만 사용해도 두 객체를 비교할 수 있게 되어 Java에 비해 더 직관적으로 두 객체를 비교할 수 있다.

댓글