프로그래밍Kotlin 백엔드 개발자

코틀린에서 인라인 함수란 무엇이며, 성능에 어떤 영향을 미치고 언제 사용하는 것이 적절한가요?

Hintsage AI 어시스턴트로 면접 통과

답변

코틀린에서 인라인 함수는 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"가 인라인 함수 외부에서 접근할 수 없는 이유에 대한 장기간의 조사를 초래했습니다.