Kotlin 고차 함수(Higher-Order Functions)


개요

고차 함수(Higher-Order functions)는 함수형 프로그래밍에서 많이 나오는 개념이다.

아래 중 하나 이상을 만족하면 고차 함수이라고 한다.

  • 하나 이상의 함수를 인자로 받는다.
  • 함수를 결과로 반환한다.

이는 일급 객체(First-class Function)이 성립되는 3조건 중 2개를 만족하는 것이고, 이를 만족하지 못하는 다른 모든 함수들은 일차 함수(first-order function)라고 한다.

즉, 함수를 만드는 함수라고 할 수 있다.

대표적인 고차 함수로는 map, filter, reduce, lambda 등이 있다.

고차 함수

아래 예제는 함수를 인자로 받고 함수를 결과로 반환해 준다.

fun returnParamFunc(func: () -> String): () -> String {
    return func
}

fun main() {
    val hello: () -> String = { "Hello world!" }
    
    val returned = returnParamFunc(hello)
    print("${returned()}")
}

Output:

Hello world!

위에 예제의 returnParamFunc 함수는 인자로 hello를 받고 다시 함수 반환하고 있다. 이 반환된 함수는 "Hello world!"를 출력하였다.

인자 및 반환 타입

fun returnParamFunc(func: () -> String): () -> String {
    return func
}

함수를 인자로 넘길 때 함수의 변수 이름 뒤에 : () -> String와 같이 함수의 타입을 명시해야 한다.

Int를 인자로 받고 String을 반환하는 함수는 (Int) -> String와 같이 작성한다. ->의 왼쪽에 괄호 안에 있는 타입((Int))은 인자이고, -> 의 오른쪽의 타입(String)은 반환 타입을 의미한다.

만약 인자로 Int를 두개 넘긴다면 (Int, Int) -> String와 같이 작성한다. 더 많은 인자를 넘겨야 한다면 인자를 더 추가하면 된다. 인자가 없다면 () -> String와 같이 빈 괄호만 작성하면 된다.

반환값이 없다면(Int, Int) -> Unit와 같이 Unit을 넣으면 된다.

참고