Kotlin inline

greenTea·2023년 12월 27일
0

Kotlin에서 inline

inline 함수란 무엇일까요? 🤔

inline 함수는 컴파일 시에 함수 호출이 함수의 본문으로 대체되는 함수입니다(직접 코드가 들어가게 됩니다).

inline👻

1. inline O

fun main() {
    println(test1(1) {n -> n*2})
}

inline fun test1(num: Int, operation: (Int) -> Int) : Int {
    return operation(num)
}

이 함수는 inline 키워드를 사용합니다. operation이라는 람다를 인자로 받고 있습니다. 이 함수가 호출되면, operation 람다의 내용이 실제 호출 지점에 삽입됩니다. 실제로 바이트코드를 디컴파일 해보면 아래와 같이 나오는 것을 알 수 있습니다.

사진을 보면 main함수에서 함수 호출 부분을 보면 작성했던 코드가 그대로 박혀 있는 것을 볼 수 있습니다.

또한 파라미터 안에 들어간 함수까지 전부 인라인화 시킨 것을 확인 할 수 있습니다.

장점:

  • 런타임 성능 향상: 함수 호출에 따른 오버헤드가 감소합니다.
  • 스택 메모리 절약: 새로운 스택 프레임 생성이 필요 없습니다.

2. inline X

fun test1(num: Int, operation: (Int) -> Int) : Int {
    return operation(num)
}

이 버전의 test1inline이 적용되지 않은 일반 함수입니다. 람다를 인자로 받지만, inline 함수와 달리 람다의 코드가 호출 지점에 삽입되지 않습니다.

위에서 본 것과는 다르게 (Function1)이라는 객체가 있는 것을 볼 수 있습니다.

만약 파라미터에 들어온 메소드를 인라인화 시키고 싶지 않다면 noline을 붙여주시면 됩니다.

inline fun test1(num: Int, noinline operation: (Int) -> Int) : Int {
    return operation(num)
}

main을 보면 invoke()를 통해 호출 하는 코드가 있는 것을 볼 수 있습니다.(인라인을 했다면 코드가 그대로 박혀있어야 합니다.)

단점:

  • 성능 오버헤드: 각 함수 호출마다 새로운 스택 프레임이 생성됩니다.
  • 메모리 사용: 람다 인스턴스가 메모리를 차지합니다.(Function) 인스턴스를 생성하고 관리해야하므로...

결론

inline 함수는 적절히 사용하면 Kotlin에서 성능을 향상시키는 좋은 방법입니다. 하지만 모든 함수에 inline을 사용하는 것은 아닙니다. 함수의 크기와 호출 빈도를 고려하여 적절한 상황에서 사용해야 합니다. 🎯

참고자료 📚

인프런 - 코틀린 고급편

profile
greenTea입니다.

0개의 댓글