본문 바로가기

Android

Object Expressions 코틀린 기초 문법 (3) - Koans 풀이

반응형

오늘도 Koans 풀이입니다. 오늘은 Object Expressions에 대한 내용인데요, Object Expressionscallback에 이름 없는 함수를 사용하는 것처럼, 한 번 쓰이고 말 객체를 이름 없는 객체로 선언해 사용하는 문법을 말합니다.

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

문제: 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 문서를 볼까요?

 

Comparator (Java Platform SE 8 )

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. In the foregoing description, the notation sgn(expression) designates the mathematical s

docs.oracle.com

 

 

Collections (Java Platform SE 8 )

Rotates the elements in the specified list by the specified distance. After calling this method, the element at index i will be the element previously at index (i - distance) mod list.size(), for all values of i between 0 and list.size()-1, inclusive. (Thi

docs.oracle.com

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

자바 문서까지 뒤적여야 해서 더 어려웠던 것 같네요

반응형