비교 연산자 오버로딩

유우선·2026년 2월 16일

Kotlin Study📚

목록 보기
22/32
  • 코틀린은 기본 타입 뿐만 아니라 객체에 대해 비교 연산을 수행할 수 있음
    • 자바에서는 equals나 compareTo를 호출해야 함
    • 코틀린에선 산술 연산자를 사용하여 코드를 간소화 할 수 있음

동등성 연산자 equals

  • == 연산자 → equals 메서드로 컴파일
    • 관례를 적용한 것
  • != 연산자도 equals 호출로 컴파일 됨
  • ==와 !=는 인자가 null인지 검사
    • null이 될 수 있는 값에도 적용할 수 있음

메서드 구현

class Point(val x: Int, val y: Int) {
    override fun equals(other: Any?): Boolean {
        if(other === this) return true // 파라미터가 this와 같은 객체인지 검사
        if(other !is Point) return false // 파라미터 타입 검사
        return other.x == x && other.y == y 
    }
}

fun main( ) {
    println(Point(10, 20) == Point(10, 20))
    // ture
    println(Point(10, 20) != Point(5, 5))
    // true
    println(null == Point(1, 2))
    // false
}
  • 동등성 연산자 (===)를 사용해 두 피연산자가 서로 같은 객체를 가리키는지 비교
    • 동등성 연산자는 오버로딩 할 수 없음
  • equals 함수 → Any 클래스에 정의된 메서드
    • 상위 클래스에 정의된 메서드를 오버라이드 함
    • Any 클래스에서 operator 키워드를 사용하여 정의한 메서드이기 때문에 오버라이드 메서드는 자동으로 상위 클래스의 operator 지정이 적용됨
    • 상속받은 equals가 확장 함수보다 우선순위가 높음 → equals를 확장 함수로 정의할 수 없음
  • != 호출은 equals 메서드를 호출한 결과를 반전시켜 반환함
    • 추가적인 구현은 필요 없음

순서 연산자 compareTo ( <, >, ≤, ≥ )

  • 자바에서 정렬, 최댓값/최솟값 비교 등을 수행하는 클래스
    • Comparable 인터페이스를 구현해야 함
    • 하지만 인터페이스를 구현한 메서드를 간결하게 호출할 수 없음
    • <, > 의 연산자는 기본 타입의 값만 비교할 수 있음
    • element1.compareTo(element2)
  • 코틀린의 Comparable 인터페이스
    • compareTo 메서드를 호출하는 관례를 제공
    • 비교 연산자를 compareTo 호출로 컴파일

class Person(
    val firstName: String,
    val lastName: String
): Comparable<Person> {
    override fun compareTo(other: Person): Int {
        return compareValuesBy(this, other, Person::lastName, Person::firstName)
    }
}

fun main() {
    val p1 = Person("Alice", "Smith")
    val p2 = Person("Bob", "Johnson")
    println(p1 < p2)
    // false
}
  • Comparable 인터페이스를 구현함
    • Person 객체를 코틀린 뿐만 아니라 자바 에서도 사용할 수 있음
    • compareTo도 equals와 마찬가지로 상위 클래스의 operator 지정을 물려받음
  • compareValuesBy
    • 두 객체와 여러 비교 함수를 인자로 받음
      • 첫 번째 비교 함수 → 두 객체를 비교함
        • 두 객체가 같지 않으면 그 결과를 바로 반환함
        • 두 객체가 같으면 두 번째 비교 함수를 통해 객체를 비교함
    • 인자로 받은 값을 차례대로 호출해 두 값을 비교하면서 같다는 결과가 나올 때까지 반복함
  • 필드를 직접 비교하면 코드는 복잡해지지만 비교 속도는 더 빨라짐
    • 처음에는 간결하게 구현하고 성능 문제가 발생하면 개선하기

0개의 댓글