함수를 마치 클래스에서 만들어 낸 '인스턴스'처럼 취급하는 방법.
함수를 파라미터로 전달 할 수 있도 물론 반환 값도 받을 수 있다.
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함수를 람다함수로 만들어 같은 동작을 하는 코드를 만들어보자.
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 람다함수")}
OR- 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("파라미터가 없어요")}
val c:(String) -> Unit = {println("$it 람다함수")}