Kotlin
Kotlin의 고차함수와 람다함수
예발이
2021. 9. 22. 21:20
고차 함수
함수를 마치 클래스에서 만들어 낸 '인스턴스'처럼 취급하는 방법이다.
함수를 파라미터로 전달할 수 있도 물론 반환 값도 받을 수 있다.
fun a (str:String) {
println("$str 함수 a")
}
// 'Unit'의 의미는 반환하는 값이 없다는 의미
fun b (function: (String) -> Unit) {
function("b가 호출한") //"b가 호출한"의 값이 함수 a에 전달되는 꼴
}
fun main() {
b(::a)
}
함수를 파라미터로 전달할 때에는 ':: + 함수명'의 형태로 전달한다.
b함수에 파라미터로 전달된 '::a'는 함수 a가 파라미터로 전달되었다는 의미이다.
람다 함수
위 고차 함수의 예제에서 파라미터로 전달할 함수에 이름까지 붙여주는 정성이 필요할까?
위의 a함수를 람다 함수로 만들어 같은 동작을 하는 코드를 만들어보자.
// 기존 a 함수
fun a (str:String) {
println("$str 함수 a")
}
fun b (function: (String) -> Unit) {
function("b가 호출한") //"b가 호출한"의 값이 함수 a에 전달되는 꼴
}
fun main() {
// (String)->Unit는 c가 람다 함수 타입임을 나타냄
var c:(String)->Unit = {str:String -> println("$str 람다함수")}
b(::a)
b(c)
}
참고로 타입 추론기능을 통해 아래의 코드를 좀 더 간단하게 구현할 수 있다.
//아래 세 함수는 모두 같은 함수이다.
var c:(String)->Unit = {str:String -> println("$str 람다함수")}
var c:(String)->Unit = {str -> println("$str 람다함수")}
var c = {str:String -> println("$str 람다함수")}
람다 함수의 몇가지 특징을 더 알아보면
- 람다 함수의 구문이 여러 줄이고 반환 값이 있는 경우에는 마지막 구문의 값이 반환된다.
val calculate: (Int, Int) -> Int = {a, b -> println(a) println(b) a+b // a + b 값이 반환된다. }
- 파라미터가 없는 람다함수는 실행할 구문들만 나열하면 된다.
val a:() -> Unit = {println("파라미터가 없어요")}
- 파라미터가 하나밖에 없다면 'it'키워드로 사용이 가능하다.
val c:(String) -> Unit = {println("$it 람다함수")}