코틀린에서 인라인 함수는 inline 키워드를 사용하여 정의되며, 컴파일러에게 함수 본문을 호출 위치에 직접 "삽입"하도록 지시합니다. 이는 함수 호출 비용을 줄이고, 특히 람다나 짧은 함수가 사용될 때 성능을 향상시키며, 클로저 캡처를 위해 추가 객체 할당을 피할 수 있게 합니다.
예시:
def inline fun synchronized(lock: Any, block: () -> Unit) { kotlin.synchronized(lock) { block() } }
주요 장점:
단점:
권장 사항: 성능을 높여야 하는 코드의 중요한 부분에서 람다를 많이 사용할 때 inline을 사용하세요.
재정의된 인수 유형으로 작업할 때 인라인 함수는 어떤 제한이 있나요?
잘못된 답변: "재정의된 유형은 모든 인라인 함수 내에서 항상 사용할 수 있다."
올바른 답변: 인라인 함수만이 제네릭 선언에서 reified 수정자를 사용할 수 있으며, 이를 통해 런타임에 유형에 접근할 수 있습니다:
inline fun <reified T> getTypeName() = T::class.java.name
일반 제네릭 함수에서는 실행 중에 T 유형에 접근할 수 없습니다.
이야기
잘못 사용된 인라인으로 APK 용량 증가: 안드로이드 프로젝트 팀에서 프로그래머들은 수십 개의 유틸리티 함수를 inline으로 지정했으며, 복잡한 본문을 가진 함수들도 포함되었습니다. 결과적으로 APK 크기가 함수 중복으로 인해 거의 2MB 증가했습니다.
이야기
람다와 비공식 멤버 접근 오류: 람다를 포함한 인라인 함수를 사용하면서 비공식 클래스 멤버에 접근했습니다. 함수를 외부 모듈로 이동한 후 코드는 빌드되지 않았고 (권한 위반 발생), 이는 CI에서만 발견되었습니다.
이야기
인라인 함수 외부에서의 reified 사용: 한 개발자는 reified 제네릭 매개변수를 가진 함수를 인라인 수정자가 없이 선언하려고 시도했습니다. 코드는 컴파일되지 않았으며, 초보자가 "T::class"가 인라인 함수 외부에서 접근할 수 없는 이유에 대한 장기간의 조사를 초래했습니다.