본문 바로가기

Android + Kotlin

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

반응형
inline 함수는 어떨때 사용해야 할까요?

 

 

 

알고나면 쉽지만, 막상 사용하려면 어디에 사용해야할지 잘 모르는게 inline 함수 있것 같습니다.

(사실, 저도 막~ 잘 알아서 여기저기 사용을 하지는.. 못합니다.....😭😭😭)

 

그래도, 모르시는 분들을 위해 예제코드와 함께 inline이 뭐며, 어떤 경우에 사용하는지 알아보겠습니다.

 


 

 

"inline" 을 in + line 으로 생각해보면, 라인에 들어간다.

말 그대로, 함수이지만 컴파일시에 inline 함수로 선언된 함수를 호출하는 곳에 코드가 직접 들어간다는 의미입니다.

예를 들어 10줄짜리 inline 함수 안의 코드가, 그대로 호출한 부분에 복사되어 들어갑니다.

 

길게 설명할 필요없이 일단 코드 구현부터 해보겠습니다.

 

private inline fun <T> getHello(name: T) {
    println("$name 반가워~^^")
}

 

위의 코드의 T 는 제네릭 타입으로 아래 링크 게시물에서 확인하실 수 있습니다.

 

 

[Android Kotlin] <T>, <K, V> , <*> 너희 정체가 뭐니?

구글링을 하거나, 라이브러리의 소스 등을 보면 , , <*> 이런 코드들이 보입니다. 도대체 뭘까요? 이번 게시물에서는 이 코드들에 대해서 알아보고, 예제를 통해 사용법을 익히고, 친해져보도록

heeeju4lov.tistory.com

 

 

다시 코드로 돌아와서...😸😸😸

이름을 받아서 텍스트를 표시하는 함수에 inline 을 추가했습니다.

 

 

안드로이드 스튜디어에서 뭐라고 하네요.

자세히 보겠습니다.

 

Expected performance impact from inlining is insignificant. 

Inlining works best for functions with parameters of functional types

인라인으로 인한 예상 성능 영향은 미미합니다. 인라인은 함수 유형의 매개변수가 있는 함수에 가장 적합합니다.

 

inline은 일반적인 함수보다는 함수 유형의 매개변수가 있는 함수가 적합하다고 하네요.

조언(?)에 따라 함수 유형의 매개변수가 있는 함수에 inline을 선언해 보겠습니다.

 

private inline fun <T> inlineHello(name: T, func: (String) -> Unit) {
    func("$name 반가워~^^")
}

 

함수에 func 매개변수는 함수 타입으로 inline을 추가했을때 아무런 문제가 없습니다.

 

위와 같이 함수 타입이 있는 함수를 고차함수(Higher order functions) 라고 하는데, 이 함수를 호출시에 내부적으로 객체를 생성하여 함수 호출을 하도록 구현되어있어 성능이 떨어질수 있습니다.

 

이럴때, inline 함수로 선언을 하게되면, 객체를 생성하여 호출하는 대신, 호출하는 부분에 함수 내부 코드를 직접 복사하여 삽입되므로 성능적으로 퍼포먼스가 나오게 됩니다.

(그렇다고, 함수 내부 코드가 긴~~ 함수를 inline으로 선언하게되면 추가되는 코드량이 늘어나게 되니, 주의해서 사용해야 합니다.)

 


 

 

inline 함수 내에서 함수 타입 파라미터를 다른 함수의 파라미터로 넘길경우 아래와 컴파일 에러가 발생합니다.

 

 

대략적으로 내용을 살펴보면 함수 타입 파라미터 앞에 noinline을 추가하라고 합니다.

 

private inline fun <T> inlineHello2(name: T, noinline func: (String) -> Unit) {
    getHello2(name, func)
}

private fun <T> getHello2(name: T, func: (String) -> Unit) {
    func("$name 반가워~^^")
}

 

위와 같이 noinline을 추가하면 이상없이 사용이 가능합니다.

 

여기까지 읽으셨으면 inline이 대충 어떤것인지 감이 오셨을거라 생각이듭니다.

 


 

 

그렇다면 이건 어디에 쓰나요?

 

 

 

맞습니다. 저도 이 부분이 제일 어려웠습니다. 그리고, 아직도 명확하게 여기다!! 라고 하는 경우는 별로 없었습니다.;;

 

일단은 몇가지 샘플 코드로 설명을 드리겠습니다.

 

어떤값이 더 큰지를 비교하여 텍스트를 표시하는 코드입니다.

val value = 30
20.isOver(value) { isOver ->
    if(isOver)
        println("20은 ${value}보다 크다")
    else
        println("20은 ${value}보다 작다")
}



private inline fun Int.isOver(value: Int, func: (Boolean) -> Unit) {
    func(this > value)
}

 

String의 null 체크를 하여 텍스트를 표시하는 코드입니다.

 

var name: String? = "바둑이"
name.notNull {
    println("나의 이름은 $this 입니다.")
}



private inline fun String?.notNull(body: String.() -> Unit) {
    this?.body()
}

 

위와 같이 사용이 되는데,........ 저도 잘 모르니 설명은 여기까지...쿨럭~😱😱😱😱

 


 

소스 코드는 아래 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

 

반응형