-
46장 - 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라Kotlin/Effective Kotlin 요약 2023. 4. 10. 00:01728x90
개요
코틀린의 고차 함수(함수를 파라미터로 받는 함수 또는 함수를 리턴하는 함수)는 대부분 inline 한정자가 붙어있습니다.
inline 한정자는 무엇일까요?
inline 한정자
inline 한정자의 역할은 컴파일 시점에 '함수를 호출하는 부분'을 '함수의 본문'으로 대체합니다.
예를 들어 repeat 함수를 다음과 같이 구현되어 있습니다.
inline fun repeat(times: Int, action: (Int) -> Unit){ for(index in 0 until times){ action(index) } }
repeat을 호출하는 부분은 컴파일 시점 다음과 같이 대체됩니다.
repeat(10){ println(it) } //컴파일 시점 for(index in 0 until 10){ println(index) }
이런 특성 덕분에 함수 호출 시 함수 본문으로 이동 -> 함수를 호출했던 위치로 다시 점프하는 과정을 생략할 수 있습니다.
inline 한정자의 장점
- 타입 아규먼트에 reified 한정자를 붙여 사용할 수 있다 (제네릭의 타입정보를 runtime 시점에 알 수 있음)
- 함수 타입 파라미터를 가진 함수가 훨씬 빠르게 동작합니다.(점프하는 과정이 없음)
- 비지역 리턴을 사용할 수 있습니다. (non-inline이라면 return이 불가능하지만 inline은 return을 할 수 있다)
inline 한정자의 비용
- 재귀적으로 동작할 수 없다. (무한으로 대체돼서 굉장히 위험)
- private internal 가시성을 사용할 수 없다.
- inline함수가 inline 함수를 호출하는것이 반복되면 코드의 크기가 쉽게 커집니다.
crossinline과 noinline
함수를 inline으로 만들고 싶지만 일부 함수 타입 파라미터는 inline으로 받고 싶지 않은 경우에는 crossinline과 noinline을 사용할 수 있습니다.
- crossinline
- 아규먼트로 inline 함수를 받지만, 비지역적 리턴을 하는 함수는 받을 수 없게 만듭니다.
- noinline
- 아규먼트로 inline 함수를 받을 수 없게 합니다.
inline 함수가 사용되는 주요 사례
- print 함수처럼 매우 많이 사용되는 경우
- filterIsInstance 함수처럼 타입아규먼트로 reified 타입을 전달받은 경우
- 함수 타입 파라미터를 갖는 톱레벨 함수를 정의해야 하는 경우
'Kotlin > Effective Kotlin 요약' 카테고리의 다른 글
48장 - 더 이상 사용하지 않는 객체의 레퍼런스를 제거하라 (0) 2023.04.12 47장 - 인라인 클래스의 사용을 고려하라 (0) 2023.04.11 45장 - 불필요한 객체 생성을 피하라 (0) 2023.04.08 44장 - 멤버 확장 함수의 사용을 피하라 (0) 2023.04.07 43장 - API의 필수적이지 않은 부분을 확장 함수로 추출하라 (0) 2023.04.06