인라인 함수 (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, 인라인함수, 성능최적화, 고차함수, 람다, 비지역반환, 구체화된타입매개변수, 인라인프로퍼티, 코틀린최적화, 함수형프로그래밍
'개발&프로그래밍' 카테고리의 다른 글
[인텔리제이] 단축키 마스터의 필수 플러그인 - Key Promoter X (0) | 2024.09.15 |
---|---|
[인텔리제이] 코드 가독성을 높여주는 Rainbow Brackets 플러그인 (0) | 2024.08.23 |
[kotlin] 고차 함수와 람다 (Higher-order Functions and Lambdas) (0) | 2024.08.18 |
[Kotlin] 함수 (0) | 2024.08.18 |
[Kotlin] 타입 별칭(Type Aliases) (0) | 2024.08.18 |
댓글