Kotlin 그밖에 - expect, actual, external, reified

멀티 플랫폼 개발(expect, actual)

expectactual 은 Android 및 iOS 등 멀티 플랫폼 응용 프로그램을 개발하는데 사용한다. 공통 부분에서는 expect를 이용하여 기대하는 클래스 등을 정의한다. 또한 Android나 iOS 각각의 구현 actual를 이용하여 의존하는 플랫폼 의존의 코드를 작성한다.

// 공통 부에서 구현 
expect class Foo {
    fun getPlatformName(): String
}
// Android 의존 부에서 구현 
actual class Foo { 
    fun getPlatformName () : String = "Android" 
}

외부 호출(external)

external 는 C++로 작성된 코드를 JNI를 통해 호출하거나 JavaScript 코드를 호출 할 때 사용한다.

external fun foo (...) {...}

타입의 구현(reified)

JVM의 사양에 따라 제네릭 함수의 형태는 일반적으로 실행시에는 손실되지만 Kotlin에서는 inlinereified을 이용하는 것으로, 실행시에도 제네릭 함수의 형태를 참조하는 것이 가능하다.

fun <T> TreeNode.findParentOfType(clazz: Class<T>): T? {
    var p = parent
    while (p != null && !clazz.isInstance(p)) {
        p = p.parent
    }
    @Suppress("UNCHECKED_CAST")
    return p as T?
}
inline fun <reified T> TreeNode.findParentOfType(): T? {
    var p = parent
    while (p != null && p !is T) {
        p = p.parent
    }
    return p as T?
}