[코틀린기초] 8-1. 람다
람다식의 구성
val multi: (Int, Int) -> Int = {x:Int, y:Int -> x*y}
- 변수를 함수처럼 사용 가능하다.
- 람다식의 선언 자료형은 람다식 매개변수에 자료형이 명시된 경우 생략 가능
- 반대로 선언 자료형이 명시된 경우 매개변수 자료형을 생략 가능
- 함수의 내용과 결과를 반환한다. 표현식이 여러줄이라면 마지막 표현식을 반환한다.
예제 코드
- 표현식이 2줄 이상일 때
val multi2: (Int, Int) -> Int = {
x:Int, y:Int -> println("x: $x, y: $y")
x*y
// 마지막 표현식이 반환됨 (반환 값이 없는 경우 Unit을 반환값으로 쓰자)
}
- 반환 자료형이 없거나 매개변수가 하나 있을 때
val greet: () -> Unit = {println("Hello World!!")}
val squre: (Int) -> Int = {x -> x*x}
- 람다식 안에 람다식이 있는 경우
val nestedLambda: () -> () -> Unit =
val nestedLambda = // 추론이 가능함
fun main(){
val result: Int
//일반 변수에 람다식 할당
val multi = {a: Int, b: Int -> a + b}
//람다식에 자료형을 생략하고 싶으면 명시를 따로 해줘야함
val multi:(a:Int , b:Int) -> Int = {a, b -> a + b}
// 에러, 추론 불가능
// val multi = {a, b -> a + b}
result = multi(10,20)
println(result)
val nestedLambda: () -> () -> Unit =
nestedLambda()() // nested가 프린트됨
}
- 매개변수에 람다식을 이용한 고차함수
fun main(){
var result : Int
//람다식을 매개변수로 넣는다
result = highOrder({x,y -> x+y}, 10,20)
}
//람다식을 매개변수로 받는 함수 선언
fun highOrder(sum:(Int,Int) -> Int, a:Int, b:Int):Int{
return sum(a,b)
}
- 값에 의한 호출로 람다식 사용하기
fun main(){
var result = callByValue(lambda())
println(result)
}
fun callByValue(b: Boolean) : Boolean {
println("callByValue funtion")
return b
}
val lambda:()->Boolean = {
println("lambda function")
true //마지막 식이 반환
}
- 람다식 이름을 사용한 호출
fun main(){
var result = callByValue(lambda) //이름으로 호출
println(result)
}
//람다식 자체가 매개변수에 복사된다.
fun callByValue(b: () -> Boolean) : Boolean {
println("callByValue funtion")
return b() //람다식 함수 실행
}
val lambda:()->Boolean = {
println("lambda function")
true //마지막 식이 반환
}
- 값에의한 호출과 이름을 이용한 호출은 각 함수가 수행되는 순서가 달라짐!!!!
- 참조에 의한 호출
fun sum(x:Int,y:Int) = x+y
fun funParam(a:Int,b:Int, c:(Int,Int) -> Int) : Int {
return c(a,b)
}
//funParam(3,2,sum) -> 오류 ! sum은 람다식이 아님
funParam(3,2,::sum) //참조에 의한 호출