코틀린의 장점 중 하나는 함수가 일급 객체이기 때문에, 함수를 인자로 받거나 반환하는 고차 함수를 만들 수 있다는 것이다. 또한, 이러한 고차 함수 덕분에 코틀린은 함수형 프로그래밍도 가능하다.
고차 함수에 대해 알아보자.
코틀린이 함수를 인자로 받거나, 반환할 수 있다는 것은 함수 타입을 지원한다는 뜻이기도 하다.
결국 함수 타입을 사용하는 함수가 고차 함수이기에, 함수 타입을 통해 고차 함수를 알아보자.
함수 타입의 기본 형은 다음과 같다.
(파라미터 타입) -> 반환 타입
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);
}