Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 안드로이드 레트로핏 사용법
- 안드로이드 라이선스
- jvm 작동 원리
- 안드로이드 레트로핏 crud
- ANR이란
- 자바 다형성
- 안드로이드 유닛 테스트 예시
- 스택 큐 차이
- android ar 개발
- 서비스 쓰레드 차이
- jvm이란
- rxjava hot observable
- 안드로이드 라이선스 종류
- 안드로이드 유닛 테스트
- android retrofit login
- 클래스
- 플러터 설치 2022
- 스택 자바 코드
- 큐 자바 코드
- 안드로이드 유닛테스트란
- 멤버변수
- 서비스 vs 쓰레드
- rxjava cold observable
- Rxjava Observable
- ar vr 차이
- rxjava disposable
- 2022 플러터 설치
- 객체
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 os 구조
Archives
- Today
- Total
나만을 위한 블로그
[이펙티브 코틀린] 아이템 42. compareTo의 규약을 지켜라 본문
728x90
반응형
compareTo()는 Any 클래스의 메서드가 아니다. 수학적인 부등식으로 변환되는 연산자다.
fun main() {
obj1 > obj2 // obj1.compareTo(obj2) > 0
obj1 < obj2 // obj1.compareTo(obj2) < 0
obj1 >= obj2 // obj1.compareTo(obj2) >= 0
obj1 <= obj2 // obj1.compareTo(obj2) <= 0
}
compareTo()는 Comparable<T> 인터페이스에도 있다. 어떤 객체가 이 인터페이스를 구현하고 있거나 compareTo라는 연산자 메서드를 갖고 있다는 의미는 해당 객체가 어떤 순서를 갖고 있으므로 비교할 수 있다는 것이다. compareTo는 아래처럼 동작해야 한다.
- 비대칭적 동작 : a >= b고 b >= a면 a == b여야 한다. 비교와 동등성 비교에 어떤 관계가 있어야 하고 일관성이 있어야 한다
- 연속적 동작 : a >= b, b >= c면 a >= c여야 한다. 이런 동작을 하지 못하면 요소 정렬이 무한 반복에 빠질 수 있다
- 코넥스적 동작 : 두 요소는 어떤 확실한 관계를 갖고 있어야 한다. a >= b 또는 b >= a 중에 적어도 하나는 항상 true여야 한다. 두 요소 사이에 관계가 없으면 퀵 정렬, 삽입 정렬 등의 고전적인 정렬 알고리즘을 쓸 수 없다. 대신 위상 정렬 같은 정렬 알고리즘만 쓸 수 있다
compareTo를 따로 정의해야 하는가?
코틀린에서 compareTo를 따로 정의해야 하는 상황은 거의 없다. 일반적으로 어떤 프로퍼티 하나를 기반으로 순서를 지정하는 것으로 충분하기 때문이다. sortedBy를 쓰면 원하는 키로 컬렉션을 정렬할 수 있다.
fun main() {
val names = listOf<User>(/*...*/)
val sorted = names.sortedBy { it.surname }
}
class User(val name: String, val surname: String)
여러 프로퍼티를 기반으로 정렬해야 한다면 sortedWith 함수를 쓰면 된다. 이 함수는 compareBy를 활용해서 comparator를 만들어 사용한다.
val sorted = names.sortedWith(compareBy({ it.surname }, {it.name}))
문자열은 알파벳, 숫자 등의 순서가 있다. 따라서 내부적으로 Comparable<String>을 구현하고 있다. 텍스트는 일반적으로 정렬해야 하는 경우가 많아서 유용하다. 하지만 단점도 있다. 두 문자열이 부등식으로 비교된 코드를 보면 이해하는 데 약간의 시간이 걸린다.
자연스런 순서를 갖는 객체들이 있다. 측정 단위, 날짜, 시간 모두 자연스런 순서를 갖는다. 객체가 자연스런 순서인지 불확실하면 comparator를 쓰는 게 좋다. 이걸 자주 쓴다면 클래스에 companion 객체로 만들어 두는 것도 좋다.
fun main() {
val names = listOf<User>(/*...*/)
val sorted = names.sortedWith(User.DISPLAY_ORDER)
}
class User(val name: String, val surname: String) {
companion object {
val DISPLAY_ORDER = compareBy(User::surname, User::name)
}
}
반응형
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템 44. 멤버 확장 함수의 사용을 피하라 (0) | 2023.04.21 |
---|---|
[이펙티브 코틀린] 아이템 43. API의 필수적이지 않은 부분을 확장 함수로 추출하라 (0) | 2023.03.29 |
[이펙티브 코틀린] 아이템 41. hashCode의 규약을 지켜라 (0) | 2023.03.20 |
[이펙티브 코틀린] 아이템 40. equals의 규약을 지켜라 (0) | 2023.03.19 |
[이펙티브 코틀린] 아이템 39. 태그 클래스보다는 클래스 계층을 사용하라 (0) | 2023.03.13 |
Comments