✍️ 인자에 함수를 사용.kt
fun main()
{
val res1 = sum(3, 2) //일반 인자
val res2 = mu1(sum(3,3),3) //인자에 함수를 사용
println("res1 : ${res1}, res2 : ${res2}" )
}
fun sum(a: Int, b: Int) = a + b
fun mu1(a: Int, b: Int) = a * b
//결과
res1 : 5, res2 : 18
✍️ 함수의 변환값으로 함수 사용.kt
fun main()
{
println("funcFunc : ${funcFunc()}") //
}
fun sum(a: Int, b: Int) = a + b
fun funcFunc(): Int //함수의 변환값으로 함수 사용
{
return sum(2, 2)
}
//결과
funcFunc : 4
✍️ 다식이 할당된 변수.kt
fun main()
{
var result: Int
//일반 변수에 람다식 할당
var multi = {x:Int, y:Int -> x*y}
//람다식이 할당된 변수는 함수처럼 사용가능
result = multi(10, 20)
println(result)
}
✍️ 람다식을 매개변수와 인자로 사용한 함수.kt
fun main()
{
var result : Int
//람다식을 매개변수와 인자로 사용한 함수
result = highOrder({x,y -> x + y},10 ,20)
println(result)
}
fun highOrder(sum: (Int, Int) ->Int, a: Int, b: Int) :Int
{
return sum(a, b)
}
람다식의 선언 자료형과 람다식의 매개변수 안에의 자료형 둘 중 하나는 남겨야한다.
✍️ 자료형의 생략.kt
//생략되지 않은 전체 표현
val multi: (Int, Int)->Int= {x: Int, y: Int-> x * y}
//선언 자료형 생략
val multi = {x: Int, y: Int-> x * y}
//람다식 매개변수 자료형의 생략
val multi: (Int, Int)->Int= {x, y-> x * y}
//에러❗❗ 추론이 가능하지 않다.
val multi = {x, y -> x * y}
✍️ 반환 자료형이 없거나 매개변수가 하나있을 때.kt
//반환 자료형 없을 때
//()안에 전달할 인자가 없기 때문에 화살표가 사라지고 해당 처리할 내용만 입력
val greet : ()->Unit = {println("Hello World")}
//매개변수가 하나있을 때
val square : (Int)->Int = {x -> x * x}
✍️ 람다식의 처리 내용.kt
val multi2 = {x: Int, y: Int ->
println("x * y")
x * y //마지막 표현식이 반환됨
}
✍️ 람다식 안에 람다식이 있는 경우.kt
val nestedLambda: ()->()->Unit = { { println("nested") } }
✍️ 선언부의 자료형 생략.kt
val greet = {println("Hello World!")} //추론 가능
val square = {x: Int -> x * x} //선언 부분을 생략하려면 x의 자료형을 명시
val nestedLambda = { { println("nested") } } //추론 가능
람다식과 고차함수를 호출하는 방식은 값에 의한 호출과 이름에 의한 호출이 있다.
함수가 인자로 전달될 경우
-> 람다식 함수는 값으로 처리되어 즉시 함수가 수행된 후 값을 전달
✍️ 값에 의한 호출.kt
fun main()
{
val result = callByValue(lambda()) //람다식 함수를 호출
println(result)
}
fun callByValue(b: Boolean): Boolean //일반 변수 자료형으로 선언된 매개변수
{
println("callByValue function")
return b
}
val lambda: () -> Boolean ={ //람다 표현식이 두 줄이다
println("lambda function")
true //마지막 표현식 문장의 결과가 반환
}
//결과
lambda function
callByValue function
true
✍️ 이름에 의한 호출.kt
fun main()
{
val result = callByName(otherLambda) //람다식 이름으로 호출
println(result)
}
fun callByName(b: () -> Boolean): Boolean
{
println("callByName function")
return b()
}
val otherLambda: () -> Boolean = {
println("otherLambda function")
true
}
//결과
callByName function
otherLambda function
true
이것을 잘 이용하면 상황에 맞춰 즉시 실행할 필요가 없는 코드를 작성하는 경우, 이름에 의한 호출 방법을 통해 필요할 때만 람다식 함수가 작동하도록 만들 수 있다.
✍️ 다른 함수의 참조에 의한 호출.kt
//sum은 람다식이 아니다.
fun sum(x: Int, y: Int) = x + y
//sum 앞에 :: 붙이면 람다식 형태로 호출된다.
funcParam(3, 2, ::sum) //funcParam(3, 2, sum) > 오류 코드
...
//c는 람다식 사용
fun funcParam(a: Int, b: Int, c: (Int, Int)->Int):Int
{
return c(a, b)
}
✍️참조에 의한 호출 방식.kt
fun main()
{
//1. 인자와 변환값이 있는 함수
val res1 = funcParam(3, 2, ::sum)
println(res1)
//2. 인자가 없는 함수
hello(::text) //반환값이 없음
//3. 일반 변수에 값처럼 할당
val likeLambda = :: sum
println(likeLambda(6, 6))
}
fun sum(a: Int, b: Int) = a+b
fun text(a: String, b: String) = "Hi! $a $b"
fun funcParam(a: Int, b: Int, c: (Int, Int) -> Int): Int
{
return c(a, b)
}
fun hello(boby:(String,String)-> String) :Unit{
println(boby("Hello", "World"))
}
✍️매개 변수 없는 람다식 함수.kt
fun main()
{
//매개 변수 없는 람다식 함수
noParam({"Hello World!"})
noParam{"Hello World!"} //위와 동일 결과, 소괄호 생략 가능
}
//매개변수가 없는 람다식 함수가 noParam 함수의 매개변수 out으로 지정됨
fun noParam(out : () -> String) = println(out())
✍️매개변수가 한 개인 경우.kt
fun main()
{
OneParam({a -> "Hello World! $a"})
OneParam{a -> "Hello World! $a"} //위와 동일 결과, 소괄호 생략 가능
OneParam{"Hello World! $it"} //위와 동일 결과, it으로 대체 가능
}
//매개변수가 하나 있는 람다식 함수가 OneParam함수의 매개변수 out으로 지정됨
fun OneParam(out:(String)->String)
{
println(out("OneParam"))
}
✍️매개변수를 생략하는 경우.kt
//첫 번째 문자열은 사용하지 않고 생략
moreParam{_,b -> "Hello World!" $b"}