- 코틀린은 기본 타입 뿐만 아니라 객체에 대해 비교 연산을 수행할 수 있음
- 자바에서는 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
if(other !is Point) return false
return other.x == x && other.y == y
}
}
fun main( ) {
println(Point(10, 20) == Point(10, 20))
println(Point(10, 20) != Point(5, 5))
println(null == Point(1, 2))
}
- 동등성 연산자 (===)를 사용해 두 피연산자가 서로 같은 객체를 가리키는지 비교
- 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)
}
- Comparable 인터페이스를 구현함
- Person 객체를 코틀린 뿐만 아니라 자바 에서도 사용할 수 있음
- compareTo도 equals와 마찬가지로 상위 클래스의 operator 지정을 물려받음
- compareValuesBy
- 두 객체와 여러 비교 함수를 인자로 받음
- 첫 번째 비교 함수 → 두 객체를 비교함
- 두 객체가 같지 않으면 그 결과를 바로 반환함
- 두 객체가 같으면 두 번째 비교 함수를 통해 객체를 비교함
- 인자로 받은 값을 차례대로 호출해 두 값을 비교하면서 같다는 결과가 나올 때까지 반복함
- 필드를 직접 비교하면 코드는 복잡해지지만 비교 속도는 더 빨라짐
- 처음에는 간결하게 구현하고 성능 문제가 발생하면 개선하기