본문 바로가기
개발&프로그래밍

[kotlin] 인라인 함수 (Inline Functions)

by 재아군 2024. 8. 19.

 

인라인 함수 (Inline Functions)

고차 함수를 사용하면 런타임 시 일정한 페널티가 발생합니다. 각 함수는 객체이며, 클로저를 캡처합니다. 이는 메모리 할당과 가상 호출로 인한 런타임 오버헤드를 초래합니다. 하지만 많은 경우에 람다 표현식을 인라인화하여 이러한 오버헤드를 제거할 수 있습니다.

인라인 함수 (Inline Functions)

 

인라인 함수의 기본 (Basics of Inline Functions)

함수를 인라인화하려면 inline 수정자를 사용합니다:

inline fun <T> lock(lock: Lock, body: () -> T): T { ... }

이렇게 하면 컴파일러는 함수 호출 시점에 함수의 본문을 직접 삽입합니다. 이는 함수 자체와 전달된 람다 모두에 영향을 미칩니다.

 

 

noinline 수정자 (noinline Modifier)

일부 람다를 인라인화하지 않으려면 noinline 수정자를 사용합니다:

inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) { ... }

noinline 람다는 일반 함수처럼 다룰 수 있어 필드에 저장하거나 다른 곳으로 전달할 수 있습니다.

 

 

비지역 반환 (Non-local Returns)

인라인 함수 내의 람다에서는 외부 함수를 반환할 수 있습니다:

fun hasZeros(ints: List<Int>): Boolean {
    ints.forEach {
        if (it == 0) return true // hasZeros 함수에서 반환
    }
    return false
}

이를 비지역 반환이라고 합니다. crossinline 수정자를 사용하면 이러한 비지역 반환을 금지할 수 있습니다.

 

 

 

구체화된 타입 매개변수 (Reified Type Parameters)

인라인 함수는 구체화된 타입 매개변수를 지원합니다:

inline fun <reified T> TreeNode.findParentOfType(): T? {
    var p = parent
    while (p != null && p !is T) {
        p = p.parent
    }
    return p as T?
}

이를 통해 런타임에 타입 정보에 접근할 수 있습니다.

 

 

인라인 프로퍼티 (Inline Properties)

프로퍼티 접근자에도 inline 수정자를 사용할 수 있습니다:

val foo: Foo
    inline get() = Foo()

 

 

공개 API 인라인 함수의 제한 (Restrictions for Public API Inline Functions)

공개 또는 보호된 인라인 함수는 모듈의 공개 API로 간주됩니다. 이러한 함수는 비공개 API 선언을 사용할 수 없습니다. @PublishedApi 어노테이션을 사용하면 내부 선언을 공개 API 인라인 함수에서 사용할 수 있습니다.

 

 

인라인 함수는 코틀린에서 성능을 최적화하는 강력한 도구입니다. 그러나 큰 함수를 인라인화하면 코드 크기가 증가할 수 있으므로 적절히 사용해야 합니다. 인라인 함수를 이해하고 효과적으로 사용하면 고성능 코드를 작성할 수 있습니다.

 

 

Kotlin, 인라인함수, 성능최적화, 고차함수, 람다, 비지역반환, 구체화된타입매개변수, 인라인프로퍼티, 코틀린최적화, 함수형프로그래밍

댓글