우리는 챕터 5에서 람다에 대해 소개하였다. 람다는 추상화를 하기 위한 파워풀한 도구이며, 이러한 파워는 컬렉션이나 라이브러리에만 한정된 것이 아니다. 이번 챕터에서는 고차 함수를 만드는 법을 배우고, 람다를 인수 또는 리턴값으로 사용하는 법을 배우고자 한다. 또한 inline 함수에 대해서 배우고자 한다.

#고차 함수 정의

고차 함수는 다음과 같다:

예를 들어, 아래의 filter 함수는 서술부에 함수를 가지고 있기 때문에 이를 고차 함수라고 할 수 있다.

list.filter{ x > 0 }

#함수 타입

람다 인자의 타입은 아래와 같이 선언한다.

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

예를 들어, sum 함수는 Int 타입인 파라미터 2개(x, y)를 받아서 Int 값을 반환하는 함수이며 action은 함수를 반환하는 함수이다.

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

이를 좀 더 명시적으로 표현하자면, 즉 위에서 말한 선언 방법대로 선언하자면 다음과 같다. 이때 코드의 가독성을 위해 (x: Int, y: Int) ‐> Int식으로 변수의 이름을 명시할 수 있다. Unit 타입은 함수 반환 타입에만 쓰는 특별한 타입이다.

val sum: (Int, Int) -> Int = { x, y -> x + y }
val action: () -> Unit = { println(42) } //함수를 반환한다

다른 함수와 마찬가지로, 리턴 타입으로 nullable을 사용할 수 있다.

var canReturnNull: (Int, Int) -> Int? = { null }
var funOrNull: ((Int, Int) -> Int)? = null //함수의 반환타입이 아닌, var 자체가 nullable 

#인자로 받은 함수 호출

인자로 받은 함수를 호출하는 방식은 일반적인 함수를 호출하는 방식과 같다. 함수 이름 뒤에 () 괄호를 넣어주고, 괄호 안에 파라미터를 넣어주면 된다.

fun twoAndThree(operation: (Int, Int) ‐> Int) { ////function 타입의 파라미터 선언
    val result = operation(2, 3) //function 타입의 파라미터 호출
    println("The result is $result")
}

>>> twoAndThree { a, b -> a + b }
The result is 5
>>> twoAndThree { a, b -> a * b }
The result is 6

다음과 같은 함수를 보면, 문자가 알파벳일 경우에만 골라서 리턴해주는 함수이다.

<aside> 💡 참고: 코틀린에서 함수 선언

**fun [리시버 타입.]함수 이름([매개변수 이름: 자료형, ..]): [반환값의 자료형] {
	표현식...
	[return 반환값]
}**

</aside>