본문 바로가기

Kotlin

공식 문서로 배우는 코틀린 - 29. Type aliases

스물아홉 번째, 타입 별칭입니다.

 

타입 별칭(type aliases)은 기존 타입에 대안이 되는 이름을 제공합니다. 타입 이름이 너무 긴 경우, 새롭게 짧은 이름을 추가하고 이를 대신 사용할 수 있습니다.

 

타입 별칭은 특히 긴 제네릭 타입을 줄일때 유용합니다. 예를 들어, 때때로 컬렉션 타입을 줄이고 싶은 유혹이 들 때가 있습니다.

typealias NodeSet = Set<Network.Node>

typealias FileTable<K> = MutableMap<K, MutableList<File>>

 

함수 타입을 위해서 사용할 수도 있습니다.

typealias MyHandler = (Int, String, Any) -> Unit

typealias Predicate<T> = (T) -> Boolean

 

내부나 중첩 클래스에 새 이름을 부여할 수도 있습니다.

class A {
    inner class Inner
}
class B {
    inner class Inner
}

typealias AInner = A.Inner
typealias BInner = B.Inner

 

타입 별칭은 새로운 타입을 도입하지 않습니다. 타입 별칭은 대상이 되는 타입과 동등합니다. 위에 있는 코드 처럼 typealias Predicate<T>라고 추가하고 Prodicate<Int>라고 사용했을 때, Kotlin 컴파일러는 항상 이를 (Int) -> Boolean으로 확장합니다. 따라서, 일반 함수 타입이 필요한 곳에 타입 별칭의 변수를 전달할 수도 있고, 그 반대도 가능합니다.

typealias Predicate<T> = (T) -> Boolean

fun foo(p: Predicate<Int>) = p(42)

fun main() {
    val f: (Int) -> Boolean = { it > 0 }
    println(foo(f)) // prints "true"

    val p: Predicate<Int> = { it > 0 }
    println(listOf(1, -2).filter(p)) // prints "[1]"
}