728x90
반응형
✅ 비교 연산자 오버로딩
- 코틀린에서는 산술 연산자와 마찬가지로 원시 타입 값뿐 아니라 모든 객체에 대해 비교 연산을 수행할 수 있다.
- equals나 compareTo를 호출해야 하는 자바와 달리 코틀린에서는 == 비교 연산자를 직접 사용할 수 있다.
- 이로 인해 코드를 더 간결하고 이해하기 쉽게 작성할 수 있다.
- 이번 절에서는 이런 비교 연산자를 지원하는 관례에 대해 알아보자.
📌 동등성 연산자 : equals
- 코틀린에서는 ==와 !=를 사용해 equals를 호출하여 내부의 인자가 널인지 아닌지 검사하게 된다.
- a==b 라는 비교 처리를 할 때 a가 널이 아닌 경우에만 a.equals(b)를 호출한다.
- 이때, a가 널이면 b도 널인 경우에만 결과가 true이다.
/* equals 메소드 구현하기 */
class Point(val x: Int, val y: Int) {
override fun equals(obj: Any?): Boolean { // Any에 정의된 메소드를 오버라이딩한다.
if (obj === this) return true // 최저고하: 파라미터가 "this"와 같은 객체인지 살펴본다.
if (obj !is Point) return false // 파라미터 타입을 검사한다.
return obj.x == x && obj.y == y // Point로 스마트 캐스트해서 x와 y 프로퍼티에 접근한다.
}
}
println(Point(10, 20) == Point(10, 20))
// true
println(Point(10, 20) != Point(5, 5))
// true
println(null == Point(1, 2))
// false
- 위의 예제를 보면 식별자 비교 연산자(===) 를 사용해 equals의 파라미터가 수신 객체와 같은지 살펴본다.
- 식별자 비교 연산자는 자바 == 연산자와 같다.
- 따라서 ===는 자신의 두 피연산자가 서로 같은 개체를 가리키는지를 비교한다.
- ===는 오버로딩할 수 없다는 것도 기억해야 한다.
- 또한 위의 예제를 살펴보면 equals 함수에 override가 붙어있는 것을 볼 수 있다.
- 다른 연산자 오버로딩 관례와 달리 equals는 Any에 정의된 메소드이기 때문에 override가 필요하다.
- Any의 equlas에는 operator가 붙어 있는데 그 메소드를 오버라이드하는 메소드 앞에는 operator 변경자를 붙이지 않아도 상위 클래스의 operator 지정이 적용된다.
- 또한 Any에서 상속받은 equals가 확장 함수보다 우선순위가 높기 때문에 equals를 확장 함수로 정의할 수 없다는 사실에 유의해야 한다.
📌 순서 연산자 : compareTo
- 자바에서 정렬이나 최댓값, 최솟값 등 값을 비교해야 하는 알고리즘에 사용할 클래스는 Comparable 인터페이스를 구현해야 한다.
- Comparable에 들어있는 compareTo 메소드는 한 객체와 다른 객체의 크기를 비교해 정수로 나타내준다.
- 하지만 자바에는 이 메소드를 짧게 호출할 수 있는 방법이 없고 element1.compareTo(element2)와 같이 명시적으로 사용해야 한다.
- 하지만 코틀린의 경우 똑같은 Comparable 인터페이스를 지원하지만 compareTo 메소드를 호출하는 관례를 제공한다.
- 아래 그림과 같이 비교 연산자(<, >, <=, >=)는 호출되면 compareTo 호출로 컴파일된다.
- 이때, compareTo가 반환하는 값은 Int이다.
/* 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) // 인자로 받은 함수를 차례로 호출하면서 값을 비교
}
}
val p1 = Person("Alice", "Smith")
val p2 = Person("Bob", "Johnson")
println(p1 < p2)
// false
728x90
반응형
'Studying > Kotlin' 카테고리의 다른 글
[Kotlin In Action] 7장. 연산자 오버로딩과 기타 관례(4) - 구조 분해 선언과 component 함수 (0) | 2023.06.05 |
---|---|
[Kotlin In Action] 7장. 연산자 오버로딩과 기타 관례(3) - 컬렉션과 범위에 대해 쓸 수 있는 관례 (0) | 2023.06.02 |
[Kotlin In Action] 7장. 연산자 오버로딩과 기타 관례(1) - 산술 연산자 오버로딩 (0) | 2023.06.02 |
[Kotlin In Action] 6장. 코틀린 타입 시스템(4) - 컬렉션과 배열 (0) | 2023.06.01 |
[Kotlin In Action] 6장. 코틀린 타입 시스템(3) - 코틀린의 원시 타입 (0) | 2023.05.31 |