Kotlin 일급 함수(First-class functions)

개요

최근에 만들어진, 함수형 프로그래밍을 지원하는 언어들은 대부분 일급 함수(First-class functions)를 지원하고 있다. Java8도 최근 일급함수를 지원하기 시작하였다.

일급 함수란? 프로그램 언어에서 함수를 값으로 다룰 수 있는 것을 말한다. 즉, 일급 함수는 객체로 취급되는 함수를 의미한다.

일급 함수는 다음과 같은 특징을 갖는다.

  • 변수에 할당(assignment)할 수 있다.
  • 다른 함수(혹은 메소드)를 인자(parameter)로 전달할 수 있다.
  • 다른 함수(혹은 메소드)의 반환값(return value)로 전달할 수 있다.

Kotlin에서도 함수를 다른 값과 마찬가지로 변수에 할당하거나 인수로 함수에 전달하거나 반환 값으로 받을 수 있다. 이와 같이 다른 값과 같은 형태가 된 함수를 편의상 함수 객체(function object)라고 부른다.

변수에 할당(assignment)할 수 있다.

아래 예제에서 함수를 변수로 할당하고 있다.

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

    println(hello())
}

Output:

hello world

위 예제에서는 변수hello"Hello world!" 문자열을 반환하는 함수를 할당하고 있다.

다른 함수(혹은 메소드)를 인자(parameter)로 전달할 수 있다.

아래 예제에서 함수를 인자로 전달하고 있다.

fun printlnFunc(func: () -> String) {
    println("${func()}")
}

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

    printlnFunc(hello)
}

Output:

Hello world!

위 예제에서 printlnFunc() 함수에서는 인자로 문자열을 리턴하는 함수를 받고 있다. main()을 보면 printlnFunc() 함수에 hello 함수 변수를 넘기고 있다.

다른 함수(혹은 메소드)의 반환값(return value)로 전달할 수 있다.

아래 예제에서 함수를 반환하고 있다.

fun getFunc(): () -> String {
    return { "Hello world!" }
}

fun main() {
    val returned: () -> String = getFunc()

    println("${returned()}")
}

Output:

Hello world!

위 예제에서 getFunc() 함수는 반환값으로 문자열을 반환하는 함수를 반환한다. main() 함수에서는 이 함수를 받아 호출하여 hello world라는 문자열을 출력하였다.