프로그래밍 언어/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