코틀린은 제네릭을 구현할 때 자바 가상 머신(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 |