November 05, 2021
fun setOnClickListener(onClick: () -> Unit) {
onClick()
}
fun main() {
setOnClickListener(print("clicked"))
}
해당 코드를 자바코드로 디컴파일하면 아래처럼 동작합니다.
(가독성을 위해 코틀린 코드로 동작원리만 비슷하게 작성했습니다.)
fun main() {
setOnclickListner(
fun invoke() {
print("clicked")
}
)
}
같은 코드를 inline으로 작성하면 아래와 같습니다.
inline fun setOnClickListner(onClick: () -> Unit) {
onClick()
}
fun main() {
setOnclickListner { print("clicked") }
}
해당 코드는 아래처럼 동작합니다.
fun main() {
print("clicked")
}
단지 키워드를 붙이는 것만으로 성능의 이점을 가져온다면, 모든 함수는 inline이 붙어야 합니다.
inline 키워드는 코드를 그대로 붙여넣는 키워드이기 때문에 바이트코드가 늘어난다는 단점이 있습니다.
앞서 언급했듯이 inline에게도 단점이 있습니다.
noinline 키워드를 매개변수에 붙여 선택적으로 inline 키워드를 활용할 수도 있습니다.
inline fun setOnClickListner(onClick: () -> Unit, noinline onDoubleClick: () -> Unit) {
}
처럼 사용한다면 noinline 키워드가 붙은 매개변수는 일반 매개변수처럼 동작합니다.
inline 키워드가 속한 함수가 아닌 다른 곳에서 매개변수를 소비하고 싶을 때 사용한다.
전달받은 매개변수를 다른 dispatcher에서 사용하고자 할 때를 예로 들 수 있다.
inline fun setOnClickListener(crossline onClick: () -> Unit) {
coroutineScope.launch {
onClick()
}
}