일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 코틀린
- Functional Programming
- Singleton
- ㅓ
- 팩토리 메소드
- 추상팩토리패턴
- Design Pattern
- factory method
- 빌터패턴
- builderPattern
- 디자인패턴
- 옵저버 패턴
- F
- PrototypePattern
- El
- Abstract Factory
- designPattern
- r
- Observer Pattern
- Kotlin
- a
- 싱글톤
- ㅋㅁ
- 함수형프로그래밍
- 추상 팩토리
- 프로토타입 패턴
- 디자인패턴 #
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
연산자 오버로딩과 기타 관례(비교 연산자 오버로딩) 본문
코틀린은 산술 연산자와 동일하게 원시 타입뿐 아니라 모든 객체에 대해 비교 연산을 수행할 수 있다.
equals나 compareTo 를 호출해야 하는 자바와 달리 코틀린은 == 비교 연산자를 직접 사용할 수가 있어서 간결하게 코드를 작성할 수 있다.
동등성 연산자: equals
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 x == other.x && y == other.y // 스마트 캐스트이후 내부데이터 비교
}
}
fun main() {
val p1 = Point(10,20)
val p2 = Point(10,20)
val p3 = Point(30,40)
println(p1 == p2)
println(p1 == p3)
println(p1 != p3)
}
* 식별자 비교 === 는 equals의 파라미터가 수신 객체(this)와 주소 값(메모리의)이 같은지 비교한다.
equals를 재정의 할 때 ===를 이용하여 최적화를 하는 경우가 많다. ===는 오버 라이딩할 수 없다.
상위 클래스 Any에는 equals는 앞에 operator 키워드가 붙는다 하지만 Any를 상속받은 클래스에서 equals를 재정의할 때 operator키워드는 불필요하다 상위 클래스에서 붙인 키워드가 이미 적용된다.
eqauls 같은 경우는 확장 함수로 정의하면 안 된다. 그 이유는 이미 상속받은 equals가 확장 함수보다 우선순위가 높다. 그래서 호출될 수가 없다.
!= 는 equals의 반환 값에 반전을 하여 값을 돌려준다. 즉, 개발자 따로 정의할 필요가 없다.
순서 (비교) 연산자: compareTo
자바에서 정렬이나 최댓값, 최솟값 등의 값을 비교해야 하는 알고리즘에 사용할 클래스는 comparable 인터페이스를 구현하면 compareTo 메서드를 재정의 해야 된다.
코틀린 역시 comparable 인터페이스에 있는 compareTo메서드를 호출해야 되고 관례를 제공한다.
비교 연산자 (<=, >=, >, <)는 compareTo호출로 컴파일이 된다.
compareTo가 반환하는 값은 정수이다.
p1 < p2는 p1.compareTo(p2) < 0와 같다.
p1 > p2 는 p1.compareTo(p2) > 0 와 같다.
예제
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 person1 = Person("Alice", "Smith")
val person2 = Person("Bob", "Johnson")
println(person1 < person2)
}
compareValuesBy는 두 개의 객체와 여러 비교 함수를 인자로 받는다.
첫 번째 비교 함수에 두 객체를 넘겨 값을 비교 후 같지 않다면 그 결과를 반환하고
같다면 두 번째 비교 함수를 이용하여 비교한다.
이렇게 지정한 비교함수를 지속적으로 비교한다. 만약 모든 비교 함수가 0을 반환하면 최종으로 0을 반환한다.
필드를 직접 비교하면 코드는 조금 더 복잡해지긴 하지만 비교 속도는 훨씬 빠르다.
코드를 작성할 때 일반적으로 이해하기 쉽게 코드를 작성하고 나중에 그 코드가 얼마나 자주 호출됨에 따라 성능에 문제가 발생한다면 그때 성능을 개선한다.
* 이미 자바 클래스에 compareTo가 구현이 되어있는 클래스를 사용한다면 간결하게 연산자로 사용할 수 있다.
println("abc" > "def")
'Kotlin in Action > 코틀린 답게 사용하기' 카테고리의 다른 글
연산자 오버로딩과 기타 관례(위임 프로퍼티 기타) (0) | 2020.08.25 |
---|---|
연산자 오버로딩과 기타 관례(프로퍼티 접근자 로직 재활용: 위임 프로퍼티) (0) | 2020.08.25 |
연산자 오버로딩과 기타 관례(구조 분해 선언과 component 함수) (0) | 2020.08.24 |
연산자 오버로딩과 기타 관례(컬렉션과 범위에 대해 쓸 수 있는 관례) (0) | 2020.08.24 |
연산자 오버로딩과 기타 관례(산술 연산자 오버로딩) (0) | 2020.08.22 |