매개변수로 함수를 전달받거나 함수를 반환하는 함수이다.
//함수를 전달받는 예시
fun main(args: Array<String>) {
println(example(10,{ x -> x * x }))
}
fun example(args: Int, argFun: (Int) -> Int): Int {
return argFun(args)
}
example 함수의 두번째 인자는 함수를 받고자 함수 타입으로 선언한 모습이다. 코틀린은 [변수명 : 타입] 으로 작성하기에 example의 함수의 두번째 인자는 [argFun(변수명)] : [(Int) -> Int (타입)] 로 생각하면 이해하기가 쉽다.
이어서 컬렉션 타입에서 자주 사용하는 filter와 forEach를 보자.
//filter와 forEach의 예제 코드
fun main(args: Array<String>) {
arrayOf(1,2,3,4,5).filter({
it < 3
}).forEach({
println(it)
})
}
filter 함수 원형
forEach 함수 원형
filter와 forEach 함수에 람다 함수 {it<3} 와 {println(it)} 를 매개변수로 사용했다.
고차함수의 매개변수로 함수 타입일 경우 ()를 생략할 수 있다. 즉, 위의 코드를 아래와 같이 수정할 수 있다.
//고차함수의 인자인 함수를 넣었을 경우, ()가 생략 가능하다.
fun main(args: Array<String>) {
arrayOf(1,2,3,4,5).filter{
it < 3
}.forEach{
println(it)
}
}
뿐만 아니라, 고차함수의 마지막 인자가 함수 타입일 경우에도 () 밖으로 빼서 작성할 수 있다. 단, 여러 개의 함수 인자일 경우, 마지막의 하나만 가능하다.
//()를 빼서도 작성이 가능하다.
fun main(args: Array<String>) {
example1(3,{x : Int -> x * x}, {x : Int -> x < 10})
example1(3,{x : Int -> x * x}) {x : Int -> x < 10}
}
fun example1(args : Int, argFun1 : (Int) -> Int, argFun2 : (Int) -> Boolean){
println(argFun1(args))
println(argFun2(args))
}
코틀린에서 함수의 인자에 기본값을 설정할 수 있듯이, 고차함수의 함수 인자에도 기본값을 설정할 수 있다.
//기본값이 설정된 고차 함수
fun main(args: Array<String>) {
example2(10,{x : Int -> x+ x})
example2(10, {x: Int -> x + x}, {x : Int -> x/ x})
}
fun example2(args : Int, argFun1 : (Int) -> Int , argFun2 : (Int) -> Int = {x : Int -> x * x}){
println(argFun1(args))
println(argFun2(args))
}
//함수를 반환하는 예
fun main(args: Array<String>) {
val function = calculate("+")(3,4)
println(function)
}
fun calculate(str: String): (Int, Int) -> Int {
return when (str) {
"+" -> { x, y -> x + y }
"-" -> { x, y -> x - y }
"*" -> { x, y -> x * y }
else -> { x, y -> x / y }
}
}
위의 예시의 calculate함수는 반환값이 함수이다. 따라서, main에서 calculate함수에 "+"를 매개변수로 넣으면 {x,y -> x+y} 람다함수를 반환되고 반환된 함수에 (3,4) 인자를 넣어 계산한 값이 function변수에 할당되게 된다.