오늘도 Koans 풀이입니다. 오늘은 Object Expressions에 대한 내용인데요, Object Expressions는 callback에 이름 없는 함수를 사용하는 것처럼, 한 번 쓰이고 말 객체를 이름 없는 객체로 선언해 사용하는 문법을 말합니다.
문제: Object Expressions
Read about object expressions that play the same role in Kotlin as anonymous classes in Java.
Add an object expression that provides a comparator to sort a list in a descending order using java.util.Collections class. In Kotlin you use Kotlin library extensions instead of java.util.Collections, but this example is still a good demonstration of mixing Kotlin and Java code.
import java.util.*
fun getList(): List<Int> {
val arrayList = arrayListOf(1, 5, 2)
Collections.sort(arrayList, object {})
return arrayList
}
위 코드가 테스트 케이스에 대해 작동하게 만들기만 하면 됩니다. 먼저 이 상태 그대로 코드를 실행해볼까요?
Type inference failed: fun <T : Any!> sort(p0: (Mutable)List<T!>!, p1: Comparator<in T!>!): Unit cannot be applied to (kotlin.collections.ArrayList<Int> /* = java.util.ArrayList<Int> */,<no name provided>)
Type mismatch: inferred type is <no name provided> but Comparator<in Int!>! was expected
두 에러 모두 공통적으로 Comparator를 찾고 있습니다. arrayList가 p0: List<T!>!가 되겠고, object {}가 p1: Comparator<in T!>!가 되겠네요. 두 번째 에러를 통해 Comparator는 Comparator<Int> 형태라는 것을 알 수 있습니다.
import java.util.*
fun getList(): List<Int> {
val arrayList = arrayListOf(1, 5, 2)
Collections.sort(arrayList, object: Comparator<Int> {})
return arrayList
}
이를 토대로 코드를 재작성해보았습니다.
Object is not abstract and does not implement abstract member public abstract fun compare(p0: Int!, p1: Int!): Int defined in java.util.Comparator
compare(p0: Int!, p1: Int!): Int
가 없다며 에러가 발생합니다. compare 함수를 override 해야겠죠? Comparator 객체는 java.util.Comparator입니다. Comparator 문서와 Collections.sort 문서를 볼까요?
compare는 첫 번째 요소 o1이 두 번째 요소 o2보다 작으면 음수를, 같으면 0을, 크면 양수를 반환한다고 하는데요. Collections.sort는 두 값을 Comparator.compare에 넣어서 반환값이 음수나 0이면 그대로 두고, 양수이면 swap 하는데요. 우리는 큰 수부터 나열해야 하므로 아래와 같은 코드가 완성됩니다.
import java.util.*
fun getList(): List<Int> {
val arrayList = arrayListOf(1, 5, 2)
Collections.sort(arrayList, object: Comparator<Int> {
override fun compare(o1: Int, o2: Int) = o2 - o1
})
return arrayList
}
Passed: testSort
자바 문서까지 뒤적여야 해서 더 어려웠던 것 같네요
'Android' 카테고리의 다른 글
Kotlin 이슈 5 include 대신 정적 fragment, Unresolved reference. (0) | 2020.02.01 |
---|---|
Kotlin 이슈 4 기능 별로 레이아웃 나누기, include (0) | 2020.02.01 |
Extension fun, 코틀린 기초 문법 (2) - Koans 풀이 (0) | 2020.01.27 |
null? 코틀린 기초 문법 (1) - ? ?: !! (0) | 2020.01.24 |
단 5분, 단숨에 AsyncTask 완벽 정복! (0) | 2020.01.23 |