Kotlin/포스팅

코틀린 타입 소거와 구체화

짜집퍼박사(짜박) 2024. 1. 2. 21:27

코틀린은 제네릭을 구현할 때 자바 가상 머신(JVM)의 제한적인 제네릭 지원 때문에 타입 소거(Type Erasure)와 구체화(Reification)라는 두 가지 다른 접근 방식을 사용합니다.

 

1. 타입 소거 (Type Erasure)

타입 소거는 JVM이 제네릭을 지원하지 않는 부분에 대응하기 위한 방법 중 하나입니다. 즉, 컴파일러가 소스 코드를 바이트 코드로 변환할 때, 제네릭 정보를 유지하지 않고 실제 타입을 알 수 없도록 하는 것을 말합니다. 이는 컴파일 시점에는 제네릭 타입에 대한 정보가 있지만 런타임에서는 소거되어 실제로 Object 타입으로 변환됩니다.

class Box<T>(val value: T)

fun main() {
    val intBox = Box(42)
    val stringBox = Box("Hello")

    println(intBox.javaClass)    // class Box
    println(stringBox.javaClass) // class Box
}

위의 예제에서 intBox와 stringBox는 둘 다 Box 타입으로 컴파일되며, 런타임에서는 제네릭 타입 정보가 소거되어 Box로만 알 수 있습니다.

 

2. 구체화 (Reification)

코틀린은 일부 제네릭 타입의 정보를 런타임에서 유지하기 위해 reified 키워드를 제공합니다. reified를 사용하면 제네릭 함수나 인라인 함수에서 타입 파라미터의 실제 타입을 런타임에서 얻을 수 있습니다.

inline fun <reified T> checkType(value: Any) {
    if (value is T) {
        println("Type is ${T::class.simpleName}")
    } else {
        println("Type is not ${T::class.simpleName}")
    }
}

fun main() {
    checkType<String>("Hello") // Type is String
    checkType<Int>(42)          // Type is Int
}

위의 예제에서 reified T를 사용하여 checkType 함수는 런타임에서 타입 T의 정보를 유지하게 됩니다. 이로 인해 T::class와 같은 식을 사용하여 런타임에서의 타입을 확인할 수 있게 됩니다.

두 가지 방식을 적절히 조합하여 코틀린에서는 제네릭을 사용하면서도 JVM의 제한을 극복하려고 합니다. 일반적으로는 타입 소거를 사용하며, 특정 상황에서는 reified를 활용하여 런타임에서 타입 정보를 유지할 수 있습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 변성의 생산자와 소비자 구분  (0) 2024.01.02
코틀린 변성  (0) 2024.01.02
코틀린 바운드와 제약  (0) 2024.01.02
코틀린 제네릭 선언  (0) 2024.01.02
코틀린 타입 파라미터  (0) 2024.01.02