본문 바로가기
Kotlin

[Kotlin] inline 사용법 (3) - noinline 사용법

by 노력남자 2023. 8. 15.
반응형

이번 포스팅에선 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을 사용한다.

반응형

댓글