fun main() {
println(mul(sum(2,3),10))
}
fun sum(a:Int, b:Int):Int = a+b
fun mul(a:Int, b:Int):Int = a*b
sum과 mul함수는 표현식이 한 줄이므로 {}를 생략하고 간단하게 표현했다.
또한 mul함수는 인자로 또다른 함수인 sum함수를 받고 있다.
fun retSum(a:Int, b:Int):Int = sum(a,b)
마찬가지로 함수의 반환형에 다른 함수를 사용할 수 있다.
예시로 든 함수들 뿐만 아니라 람다식도 함수의 일종이므로 매개변수, 인자, 반환값에 사용할 수 있다.
fun main() {
println(showOp(10,20,{x,y->x+y}))
}
fun showOp(a:Int,b:Int,op:(x:Int,b:Int)->Int):Int{
return op(a,b)
}
매개변수로 람다식 형태 op를 받도록 하고 반환 또한 람다식인 op를 반환한다. main에서는 람다식을 인자로 전달한다.
Lambda는 val 변수이고 값으로 람다식이 들어가 있다. 따라서 Lambda()와 같이 함수처럼 사용한다.
callByName 함수에서는 매개변수 형을 람다식으로 정의했다.
따라서 main에서 otherLambda 람다식 자체를 인자로 전달한다.
람다식 자체가
반면에 값에 의한 호출 사진에서는 callByValue 함수가 매개변수로 Boolean 자료형을 정의했기 때문에 Labmda()를 통해 람다식을 실행해서 반환값인 Boolean값을 인자로 전달하고 있다.
funcParam 함수는 세번째 인자로 람다식을 필요로 한다.
sum은 람다식의 형태인 (Int,Int)->Int의 형태지만 일반함수이다.
이런 경우 sum 앞에 ::를 붙여서 참조의 방식으로 sum을 람다식에 매치해서 사용할 수 있다.
fun main() {
noParam{"hello"}
}
fun noParam(out:()-> String) = println(out())
noParam은 매개변수로 람다식 out을 갖는다.
out은 매개변수가 없고 String을 반환하는 람다식이다.
main에서는 noParam{"hello"}와 같이 noParam을 호출한다.
원래 형태는 noParam({"hello"})로 매개변수가 없는 람다식을 인자로 전달한 것이지만, noParam의 마지막 매개변수가 람다식이므로 {}를 뒷부분으로 뺄 수 있는데, ()의 내용이 없기 때문에 ()를 생략하고 {}만 이용해서 작성한 것이다.
fun main() {
oneParam({a->"Hello $a"})
oneParam{a->"Hello $a"} // ()생략
oneParam{"Hello $it"} //매개변수가 1개일 경우 생략하고 it으로 표현가능
}
fun oneParam(out:(String)->String):String{
return out("tom")
}
oneParam은 매개변수로 람다식 out을 갖고 out은 매개변수가 한개인 람다식이다.
main에서 oneParam을 호출할 때 람다식을 인자로 전달한다.
두번째 줄에서는 ()를 생략하고 있다.
세번째 줄에서는 매개변수가 1개인 경우 매개변수-> 부분을 생략하고 it으로 사용하는 방식이다.
fun main() {
twoParam{a,b->"hello $a , $b"}
}
fun twoParam(out:(String,String)->String):String{
return out("Bob","Alice")
}
나머지 부분은 동일하지만 매개변수가 2개 이상인 경우 호출할 때 it을 사용해서 매개변수를 생략할 수 없다.
fun main() {
twoParam{_,b->"hello $b"}
}
fun twoParam(out:(String,String)->String):String{
return out("Bob","Alice")
}
twoParam의 매개변수는 2개이지만 내가 호출할 때 인자로 전달한 람다식에서는 한개를 생략하고 나머지 1개만 사용하고 싶다면 생략하고 싶은 인자는 _로 전달해 준다.
fun main() {
withLambda("Bob","Alice",{a,b->"hello $a , $b"})
withLambda("Bob","Alice"){a,b->"hello $a , $b"}
}
fun withLambda(a:String,b:String,hello:(String,String)->String):String{
return hello(a,b)
}
일반 매개변수인 a,b와 람다식 매개변수인 hello를 같이 사용하는 경우이다.
호출할 때 두번째 줄에서는 ()를 닫고 람다식 {}를 이어서 작성했다.
이러한 방식은 람다식이 매개변수의 맨 마지막에 있을 경우에만 가능하다.
항상 맨 마지막 매개변수인 람다식만 {}로 빼서 전달할 수 있다.
익숙해지도록 연습을 많이 해보자.