-
Kotlin의 고차 함수Kotlin 2021. 5. 23. 02:08
코틀린의 함수는 일급 객체라는 특성이 있습니다. 이 일급 객체란 다음과 같은 특징을 지닙니다.
1. 함수가 변수나 자료 구조로 저장될 수 있다
2. 다른 함수의 인자로 사용될 수 있다
3. 다른 함수의 리턴 타입으로 사용될 수 있다
val valueFunction : () -> Unit = { println("test")} fun testFunction() { println("test") } val a = testFunction() val b = valueFunction
이러한 일급 객체라는 특징을 바탕으로, 코틀린에서는 고차 함수(High Order Function)이라는 개념이 있는데요. 이 고차 함수는 다른 함수를 파라미터로 가지거나, 특정 함수를 리턴하는 함수를 말합니다.
코틀린 공식 문서에서는 다음과 같이 나와있네요.
A higher-order function is a function that takes functions as parameters, or returns a function.
공식 문서에 있는 예제를 통해 살펴보겠습니다.
fun <T, R> Collection<T>.fold( initial: R, combine: (acc: R, nextElement: T) -> R ): R { var accumulator: R = initial for (element: T in this) { accumulator = combine(accumulator, element) } return accumulator }
fold 함수는 Collection 클래스를 확장한 확장 함수임과 동시에, combine이라는 이름을 가진 함수를 파라미터로 받는 고차 함수입니다. 즉 이 함수를 호출할 때는 combine에 해당하는 함수를 인자로 넣어줘야 합니다.
내부적으로는 Collection의 원소를 for문을 통해 순회하면서, combine 함수를 실행시키고, 그 결과를 accumulator에 담아서 return 하고 있네요.
val items = listOf(1, 2, 3, 4, 5) // Lambdas are code blocks enclosed in curly braces. items.fold(0, { // When a lambda has parameters, they go first, followed by '->' acc: Int, i: Int -> print("acc = $acc, i = $i, ") val result = acc + i println("result = $result") // The last expression in a lambda is considered the return value: result }) // Parameter types in a lambda are optional if they can be inferred: val joinedToString = items.fold("Elements:", { acc, i -> acc + " " + i }) // Function references can also be used for higher-order function calls: val product = items.fold(1, Int::times)
호출할 때는 람다를 통해 함수를 호출할 때 직접 함수를 정의할 수 있고, 메서드 참조를 통해 함수를 가져올 수도 있습니다.
참고 문서
'Kotlin' 카테고리의 다른 글
Kotlin Collection - 1. 컬렉션 생성 (0) 2021.10.11 Const val과 val의 차이 (0) 2021.09.03 Kotlin의 Null 처리 (0) 2021.05.17 코틀린 수신 객체 지정 람다 : with와 apply (0) 2020.08.07 [코틀린을 다루는 기술] Kotlin에서의 재귀 함수 사용 (0) 2020.08.07