[코틀린기초] 8-1. 람다

람다식의 구성

val multi: (Int, Int) -> Int = {x:Int, y:Int -> x*y}

예제 코드

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) //참조에 의한 호출