지난 inline, noinline 게시글에 이어 crossinline, reified 에 대해 알아보겠습니다.
inline, noinline 에 대해서는 아래 링크를 확인해 주세요.
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 링크를 확인해주세요.
이제 inline, crossinline, reified 를 실전에서 어떻게 사용했는지 아래 게시물 링크를 통해서 확인해보세요.
'Android + Kotlin' 카테고리의 다른 글
[Android Kotlin] Fragment arguments 를 쾌적하게(Extension) 해보자. (0) | 2022.01.21 |
---|---|
[Android Kotlin] 화면간 intent 사용을 쾌적하게(Extension) 해보자. (0) | 2022.01.21 |
[Android Kotlin] inline 함수 어떤 경우에 사용하나요? (0) | 2022.01.20 |
[Android Kotlin] <T>, <K, V> , <*> 너희 정체가 뭐니? (0) | 2022.01.13 |
[Android Kotlin] stetho를 이용하여 REST API 데이터 디버깅하기 (0) | 2022.01.11 |