본문 바로가기

Android + Kotlin

[Android Kotlin] crossinline, reified 를 알아보자.

반응형

지난 inline, noinline 게시글에 이어 crossinline, reified 에 대해 알아보겠습니다.

 

inline, noinline 에 대해서는 아래 링크를 확인해 주세요.

 

[Android Kotlin] inline 함수 어떤 경우에 사용하나요?

inline 함수는 어떨때 사용해야 할까요? 알고나면 쉽지만, 막상 사용하려면 어디에 사용해야할지 잘 모르는게 inline 함수 있것 같습니다. (사실, 저도 막~ 잘 알아서 여기저기 사용을 하지는.. 못합

heeeju4lov.tistory.com

 


 

 

crossinline

어떤 경우에 사용이 되는지 샘플 코드를 보면서 설명 드리겠습니다.

 

// crossinline
inlineHello("김영희") {
    println(it)
}



private inline fun <T> inlineHello(name: T, crossinline func: (String) -> Unit) {
    /**
     * 다른 고차함수에서 func를 호출시엔 crossinline 을 표시해주어야 함.
     */
    invokeFunc() {
        func("$name 반가워~^^")
    }
}

private fun invokeFunc(func: () -> Unit) {
    func.invoke()
}

 

inlineHello() 함수에서 다른 고차함수를 호출하고, 그 안에서 함수형 파라미터인 func를 실행합니다.

 

(위의 코드상에 crossinline이 있지만, 없다고 가정하고 말씀드립니다.)

이런 경우, 아래 그림과 같이 컴파일 에러가 발생합니다.

 

 

Can't inline 'func' here: it may contain non-local returns, Add 'cross inline' modifier to parameter declaration 'func'

대략 해석해보면, "inline 함수는 함수형 파라미터를 non-local이 아닌 곳에서 호출 할수 없다. func 에 'crossinline' 을 추가해라." 이정도 일것 같습니다.

 

그래서, func 파라미터 앞에 crossinline을 추가하면 컴파일 오류도 안나고, 예상했던 결과도 나왔습니다.

 


 

 

reified

reified는 제네릭 타입 T를 runtime시에 어떤 타입인지, 또는 type casting을 하는 경우 필요하게 됩니다.

runtime시에는 T가 어떤 타입인지 알수 없기때문에 컴파일 오류가 발생합니다.

 

 

위와 같이 T::class.java 로 T의 타입을 알고자할때 발생을 합니다.

(물론, 다른 방법으로 타입을 알수도 있지만, 어디까지나 샘플로 이해를 해주세요.)

 

그래서, 아래 코드와 같이 fun <reified T> 로 선언을 해놓으면 value: T 의 타입을 확인하여 처리가 가능해집니다.

 

private inline fun <reified T> whoAreYou(value: T, func: (String) -> Unit) {
    func(when(T::class.java) {
        String::class.java -> { "${value}는 글자 입니다." }
        Integer::class.java -> { "${value}는 숫자 입니다." }
        else -> { "${value}는 모르겠습니다." }
    })
}

 

reified는 필수적으로 inline과 함께 사용됩니다.

 


 

실행시 전체 결과입니다.

 

 

 

 

전체 샘플 코드는 아래 Github 링크를 확인해주세요.

 

 

GitHub - rcbuilders/RemindSampleApp: https://heeeju4lov.tistory.com/ 블로그에서 Android + Kotlin 강좌에서 사용함.

https://heeeju4lov.tistory.com/ 블로그에서 Android + Kotlin 강좌에서 사용함. - GitHub - rcbuilders/RemindSampleApp: https://heeeju4lov.tistory.com/ 블로그에서 Android + Kotlin 강좌에서 사용함.

github.com

 

 

이제 inline, crossinline, reified 를 실전에서 어떻게 사용했는지 아래 게시물 링크를 통해서 확인해보세요.

 

[Android Kotlin] 화면간 intent 사용을 쾌적하게(Extension) 해보자.

안드로이드는 intent를 이용하여 화면간 데이터를 전달합니다. 이렇게 자주 사용하는 intent인데, 오랜만에 특정 화면을 호출할때면 어떤 데이터를 어떤 키로 보내면 되는지.. intent를 받는 화면은

heeeju4lov.tistory.com

 

반응형