fun main() {
b(::a)
val c: (String)->Unit = {str -> println("$str 람다함수")}
//이미 파라미터 타입이 String으로 명시되어 있기 때문에 {}안에 데이터 타입을 적을 필요가 없다.
// val c = {str:String -> println("$str 람다함수")}
// 타입추론이 가능하기 때문에 굳이 변수의 타입을 명시하지 않아도 된다.
b(c)
}
fun a (str: String){
println("$str 함수 a")
}
fun b (function: (String)->Unit){
function("b가 호출한")
}
[result]
/// b가 호출한 함수 a
/// b가 호출한 람다함수
b 함수는 함수 a를 고차함수 형식의 파라미터로 받을 수 있도록 한다. 함수를 받을 파라미터를 function으로 하고 자료형은 a함수의 형식을 넘겨받는다.
이런식으로 한다면 기술한 형태와 같은 함수는 모두 파라미터로 받을 수 있다. a함수는 String형태로 받고, 반환형은 없으므로 Unit을 써주면 된다. 그리고 { } 안에는 받아온 함수인 function을 실행하되 문자열로 b가 호출한
이라는 값을 넘겨준다.
main 함수에서는 함수b를 호출하되 함수a를 파라미터로 넘겨준다. 고차함수 형태로 넘기려면 함수 이름 앞에 콜론을 2개 붙이면 된다.
main 함수가 a함수를 b함수에 파라미터로 넘겼고 b함수는 받아온 a함수에 "b가 호출한"이라는 값을 넘겨서 호출했다. 최종적으로 a함수가 실행되면서 "b가 호출한 함수 a"라는 문자열이 출력되는 것을 확인할 수 있다.