PHpullh
학습 라이브러리/Kotlin/인라인 함수 & reified

KOTLIN · 함수

인라인 함수 & reified

inline으로 람다 오버헤드를 제거하고, reified로 제네릭 타입 정보를 런타임에 사용합니다.

함수중급inlinereifiednoinline제네릭타입소거

핵심 설명

inline으로 람다 오버헤드를 제거하고, reified로 제네릭 타입 정보를 런타임에 사용합니다.

Kotlin code

import kotlin.reflect.KClass

// inline — 고차함수 성능 최적화
inline fun measure(block: () -> Unit): Long {
    val start = System.currentTimeMillis()
    block()
    return System.currentTimeMillis() - start
}

// reified — 런타임 타입 정보 유지
inline fun <reified T> List<*>.filterIsInstance(): List<T> =
    filter { it is T }.map { it as T }

// reified로 JSON 파싱 패턴
inline fun <reified T> parseJson(json: String): T {
    // 실제로는 Gson/Moshi 사용
    // T::class.java 접근 가능!
    println("파싱 타입: ${T::class.simpleName}")
    TODO("실제 파싱 구현")
}

// noinline — 일부 람다만 인라인 제외
inline fun doWork(
    inlined: () -> Unit,
    noinline notInlined: () -> Unit
) {
    inlined()
    val saved = notInlined  // 객체로 저장 가능
    saved()
}

fun main() {
    val time = measure { Thread.sleep(10) }
    println("${time}ms 소요")

    val mixed = listOf(1, "hello", 2, "world", 3)
    val strings: List<String> = mixed.filterIsInstance()
    println(strings)  // [hello, world]
}

학습 팁

inline은 컴파일러가 함수 본문을 호출 지점에 복사합니다. 람다를 많이 호출하는 루프에서 효과적입니다.

주의할 점

inline 함수는 public API에서 internal/private 멤버에 접근하면 컴파일 경고가 납니다. @PublishedApi internal로 해결합니다.

자주 묻는 질문

인라인 함수 & reified란 무엇인가요?

inline 으로 람다 오버헤드를 제거하고, reified 로 제네릭 타입 정보를 런타임에 사용합니다.

인라인 함수 & reified 학습 시 주의할 점은 무엇인가요?

inline 함수는 public API에서 internal/private 멤버에 접근하면 컴파일 경고가 납니다. @PublishedApi internal 로 해결합니다.