반응형
이번 포스팅에선 noinline 소개와 사용해야 하는 경우에 대해 알아보겠다.
noinline이란?
noinline은 inline function의 람다 파라미터를 inline하고 싶지 않을 때 사용한다.
위 정의를 듣자마자 엥? inline을 그냥 때면 되는 거 아닌가? 왜 굳이 noinline를 붙이는 거지? 라는 생각이 들었다.
사용해야 하는 경우를 알아보자.
noinline을 사용해야 하는 경우
1. inline function의 람다를 다른 function에서 사용해야 하는 경우
inline fun twoOperations(
noinline op1: (List<Int>) -> Unit,
op2: (List<Int>) -> Unit
) {
val numbers = listOf(1, 2, 3)
// noinline 람다는 다른 함수로 전달될 수 있으며, 인라인되지 않습니다.
otherFunction(op1)
// 인라인 람다는 즉시 실행되며 인라인됩니다.
op2(numbers)
}
fun otherFunction(op: (List<Int>) -> Unit) {
val numbers = listOf(4, 5, 6)
op(numbers) // 다른 함수에서 람다 실행
println(numbers)
}
만약 위 op1에 noinline을 붙이지 않는다면?
아래와 같이 에러가 발생한다.
Illegal usage of inline-parameter 'op1' in 'public inline fun twoOperations(op1: (List<Int>) -> Unit, op2: (List<Int>) -> Unit): Unit defined in com.example.kotlin in file InlineTest.kt'. Add 'noinline' modifier to the parameter declaration
2. reified 때문에 어쩔 수 없이 inline을 쓴 고차 함수인 경우
reified가 뭔지 모른다면 이전 포스팅을 보고오자.
inline fun <reified T> operateOnMatchingType(items: List<Any>, noinline action: (T) -> Unit) {
items.forEach { item ->
if (item is T) {
action(item)
}
}
}
2번 예제는 좀 어거지로 만들긴 했다.
대부분 1번 문제를 해결하려고 noinline을 사용한다.
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin] Kotlin 공식 문서 번역 - 클래스 (Classes) (0) | 2023.08.26 |
---|---|
[Kotlin] inline 사용법 (4) - crossinline 사용법 (1) | 2023.08.16 |
[Kotlin] inline 사용법 (2) - reified 사용법 (0) | 2023.08.15 |
[Kotlin] inline 사용법 (1) - 왜 inline function, class, property를 사용하는 걸까? (0) | 2023.08.13 |
[Kotlin] Kotlin 공식 문서 번역 - 인라인 value 클래스 (Inline value classes) (0) | 2023.08.12 |
댓글