Intro

코틀린의 장점 중 하나는 함수가 일급 객체이기 때문에, 함수를 인자로 받거나 반환하는 고차 함수를 만들 수 있다는 것이다. 또한, 이러한 고차 함수 덕분에 코틀린은 함수형 프로그래밍도 가능하다.

고차 함수에 대해 알아보자.

고차 함수: 함수 타입을 사용하는 함수

코틀린이 함수를 인자로 받거나, 반환할 수 있다는 것은 함수 타입을 지원한다는 뜻이기도 하다.

결국 함수 타입을 사용하는 함수가 고차 함수이기에, 함수 타입을 통해 고차 함수를 알아보자.

함수 타입

함수 타입의 기본 형은 다음과 같다.

(파라미터 타입) -> 반환 타입

val sum: (Int, Int) -> Int = { x, y -> x + y }
val action: () -> Unit = { println(42) }

이때, 반환 값이 없을 경우, Unit을 반환 타입으로 명시한다.

⇒ 함수 타입을 선언할 때는 반환 타입을 반드시 명시해야 하므로 Unit 생략 불가

함수를 인자로 받는 함수

함수 타입을 통해 함수를 인자로 받는 함수를 만들 수 있다.

이때, 함수 타입 파라미터도 디폴트 값을 가질 수 있다. (람다)

fun test(num: Int, a: (Int) -> String = { it.toString() }) {
    println(a(num))
}

⇒ 우회적으로 null을 디폴트 값으로 주고, 함수 본문에서 null에 대한 처리(?:)도 방법

컴파일된 코드 안에서 함수 타입은 FunctionN 인터페이스로 바뀐다. (N은 파라미터 개수)

⇒ 함수 타입의 변수는 FunctionN 인터페이스를 구현하는 객체를 저장

fun test(num: Int, a: (Int) -> String) {
    println(a(num))
}
// Kotlin -> Java
public static final void test(int num, @NotNull Function1 a) {
    Intrinsics.checkNotNullParameter(a, "a");
    Object var2 = a.invoke(num);
    System.out.println(var2);
}