Vintage appMaker의 Tech Blog

[kotlin] reified 사용하는 이유 본문

Source code or Tip/Android(Java, Kotlin)

[kotlin] reified 사용하는 이유

VintageappMaker 2022. 8. 15. 19:00

reified 를 사용하는 이유는 크게 2가지가 있다.

 

함수의 리턴값과 변수 파라메터를 제너릭으로 사용하면서 

1. 다양한 형의 리턴값을 넘겨주고자 할 때

2. 함수에 넘겨진 제너릭변수의 형을 비교해야 할 때

이다.

import java.time.LocalDate

// 0. 사용법
// inline fun<reified T> 함수명: T

// 1.
// 대입받는 변수의 데이터 형에 따라
// 결과값을 선택가능하다.
inline fun<reified T> getToDay(): T? {
    val nowDay: LocalDate = LocalDate.now()
    return when (T::class) {
        String::class -> "now is : $nowDay" as T
        Int::class -> nowDay.dayOfMonth as T
        else -> null as T
    }
}

// 2. 제너릭을 사용한 변수를 넘길 경우,
// 변수형::class와 같이 비교할 수 없다.
// 이 때 reified 사용함
inline fun <reified T> doAction(value : T, calc : (T) -> T) : T?{
    //when (T::class) { <== 컴파일시 에러임.
    var ptype = T::class
    when (ptype){
       Int::class -> {
           return calc(value)
       }
    }

    return null
}

fun main() {
    var rst  : Int?    = getToDay()
    var rst2 : String? = getToDay()
    var rst3 : Long?   = getToDay()

    println("rst = ${rst}, rst2 = ${rst2}, rst3= ${rst3} ")

    val rst4 = doAction(11,  { n ->
        n * 3
    })

    val rst5 = doAction(11.0,  { n ->
        n * 3
    })

    println("rst4 = ${rst4}, rst5 = ${rst5}")
}

결과

rst = 15, rst2 = now is : 2022-08-15, rst3= null 
rst4 = 33, rst5 = null

 

Comments