프로그래밍 언어/Kotlin
[Kotlin] Runtime 에 타입정보를 알아내는 방법
DevPing9_
2023. 5. 15. 20:37
Runtime 에 타입정보를 알아내는 법 (순수 Generic)
fun <T> printGenerics(value: T, classType: Class<T>) {
when (classType) {
String::class.java -> {
println("String : $value")
}
Int::class.java -> {
println("Int : $value")
}
}
}
printGenerics("print generics function", String::class.java)
printGenerics(1000, Int::class.java)
Runtime 에 타입정보를 알아내는 법 (inline function)
inline fun <reified T> printGenerics(value: T) {
when (T::class) {
String::class -> {
println("String : $value")
}
Int::class -> {
println("Int : $value")
}
}
}
printGenerics1("print generics function")
printGenerics1(1000)
inline function
inline function은 함수 내의 코드를 inline으로 호출하는 위치에 붙여넣어주는 기능이다.
함수를 호출하지 않기 때문에 성능이 좋지만 컴파일 할 바이트코드의 양이 많아질 수 있다.
복사 붙여넣기 되어지기 때문에 런타임에 타입을 알 수 있다.
대충 아래와 같이 된다고 생각하자. (필자의 뇌피셜이니 무분별한 흡수는 주의 요망)
Kotlin(Compile 전)
fun caller() {
val iAmInt : Int = reifiedFun()
val iAmString : String = reifiedFun()
val iAmLong : Long = reifiedFun()
}
inline fun<reified T> reifiedFun(): T {
return when (T::class) {
String::class -> "I am String! " as T
Int::class -> 10 as T
else -> {
println("이상한 타입이군요...")
return "I'm not sure what to return" as T
}
}
}
Kotlin(Compile 후)
fun caller() {
val iAmInt : Int = 10 as Int
val iAmString : String = "I am String!" as String
val temp = {
println("이상한 타입이군요...")
"I'm not sure what to return" as T
}
val iAmLong : Long = temp() // compile 은 성공하나, runtime 에 해당 라인에서 에러 발생
}
inline fun<reified T> reifiedFun(): T {
return when (T::class) {
String::class -> "I am String! " as T
Int::class -> 10 as T
else -> {
println("이상한 타입이군요...")
return "I'm not sure what to return" as T
}
}
}
Reference
Kotlin - Reified를 사용하는 이유?
Reified 키워드는 Generics로 inline function에서 사용되며, Runtime에 타입 정보를 알고 싶을 때 사용합니다. Reified가 없다면 타입 정보를 담고 있는 객체를 인자로 넘겨야해서 파라미터 개수가 늘어납니
codechacha.com
728x90