0Pricing
Kotlin Academy · 강의

inline 함수: 람다 오버헤드 제거하기

함수를 inline으로 표시해 람다 매개변수에 대한 객체 생성을 피할 수 있습니다.

inline 함수: 람다 오버헤드 제거하기은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

inline 함수란 무엇인가

일반적으로 함수에 전달된 람다는 익명 클래스로 컴파일됩니다. 호출할 때마다 새 객체가 할당되므로 메모리와 시간이 소모됩니다. inline 키워드는 컴파일러에 함수 본문과 람다 인수를 호출 위치에 직접 복사하도록 지시합니다.

inline 선언

fun 앞에 inline 변경자를 추가합니다.

inline fun measureTime(block: () -> Unit): Long {
    val start = System.nanoTime()
    block()
    return System.nanoTime() - start
}

컴파일러가 호출을 다시 작성하는 방식

measureTime { doWork() }과 같은 호출은 바이트코드 수준에서 measureTime의 본문이 호출 위치에 인라인된 형태가 되므로 람다 객체가 전혀 할당되지 않습니다.

inline을 사용하는 경우

다음과 같은 경우 inline을 사용하십시오.

  • 함수가 하나 이상의 람다 매개변수를 받는 경우
  • 자주 호출되는 핵심 경로(긴밀한 반복문, 컴포저블)에서 호출되는 경우
  • reified 타입 매개변수가 필요한 경우(다음에 다룸)

성능 벤치마크 예시

inline이 없으면 고차 함수가 호출될 때마다 람다 객체가 할당됩니다. 사용하면 JVM이 일련의 직선형 코드로 인식하므로 할당과 가상 디스패치가 발생하지 않습니다.

inline fun repeat(n: Int, block: () -> Unit) {
    for (i in 0 until n) block()
}

비지역 반환

인라인 함수의 주요 이점은 람다에서 return을 사용해 람다뿐 아니라 바깥쪽 함수도 종료할 수 있다는 점입니다. 이를 비지역 반환이라고 합니다.

inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
    for (item in list) block(item)
}

fun findFirst(list: List<Int>): Int {
    forEach(list) { if (it > 5) return it }  // returns from findFirst
    return -1
}

inline의 제한 사항

인라인 함수는 런타임에 일급 엔터티로 존재하지 않으므로 변수에 저장하거나 객체로 전달할 수 없습니다. f가 해당 시그니처의 함수 참조를 예상하는 경우 f(::measureTime)을 호출할 수 없습니다.

컬렉션 파이프라인 인라이닝

표준 라이브러리의 map, filter, forEach 등의 함수는 모두 inline입니다. 따라서 이들을 연결해도 요소마다 추가 클로저 객체가 생성되지 않습니다.

val result = (1..1_000_000)
    .filter { it % 2 == 0 }   // inline
    .map { it * it }           // inline
    .take(10)

코드 크기의 상충 관계

각 호출 위치에는 인라인된 코드의 복사본이 들어갑니다. 함수 본문이 크고 여러 곳에서 호출되면 바이트코드 크기가 증가합니다. 작고 자주 호출되는 람다에는 inline을 우선 사용하십시오.

companion 및 최상위 요소와의 상호 작용

inline은 최상위 함수와 멤버 함수에 사용할 수 있습니다. 속성이나 생성자에는 사용할 수 없습니다. 함수는 호출 위치에서 보여야 하며, 일반적으로 public 또는 internal이어야 합니다.

표준 라이브러리 예시

이미 알고 있는 inline 함수로는 let, run, apply, also, with, use, synchronized, lazy(블록 변형)가 있습니다. 이 함수들의 람다에 추가 비용이 들지 않는 이유는 inline 변경자 때문입니다.

빠른 확인

고차 함수에 inline을 표시했을 때 얻는 주요 이점은 무엇인가요?

요약: inline 함수

핵심 내용:

  • inline은 람다 객체 할당을 없앱니다.
  • 람다에서 비지역 반환을 사용할 수 있습니다.
  • reified 타입 매개변수에 필요합니다.
  • 작고 자주 호출되는 고차 함수에 적합합니다.
  • 표준 라이브러리의 스코프 함수는 모두 inline입니다.

자주 묻는 질문

“inline 함수: 람다 오버헤드 제거하기” 강의는 무료인가요?

네 — “inline 함수: 람다 오버헤드 제거하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“inline 함수: 람다 오버헤드 제거하기”에서 뭘 배우나요?

함수를 inline으로 표시해 람다 매개변수에 대한 객체 생성을 피할 수 있습니다. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“inline 함수: 람다 오버헤드 제거하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. inline 함수: 람다 오버헤드 제거하기
  2. noinline과 crossinline 수정자
  3. reified 타입 매개변수: 실행 중 T에 접근하기
  4. 실전 reified 패턴: 파싱, DI 및 직렬화
← Kotlin Academy(으)로 돌아가기