2020. 10. 13. 12:47

* 변수에 할당하는 람다식 작성


val multi = {x: Int, y: Int -> x * y} // 일반 변수에 람다식 할당


var result = multi(10, 20) // 람다식이 할당된 변수는 함수처럼 사용 가능



변수 multi는 x와 y를 인자로 받아 곱하여 변환하는 람다식이 할당


multi 변수는 자료형이 생략되어 있지만 (Int, Int) -> Int에 의해 Int 형으로 자료 추론


람다식이 변수에 할당되어 변수 이름이 multi( )와 같이 함수 형태로 사용


multi(10, 20)에 전달된 10과 20은 람다식 x, y에 전달


그런 다음 화살표( -> ) 기호 오른쪽의 연산 x * y에 의해 두 값을 곱하여 반환



         람다식의 자료형 선언           람다식의 매개 변수  람다식의 처리 내용


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


변수를 함수처럼 람다식의 선언 자료형은   선언 자료형이     함수의 내용과 결과
 사용 가능       매개변수에 자료형이      명시되어 있으면  반환, 표현식이 여러
                   명시된 경우 생략 가능    생략 가능         줄인 경우 마지막
                                                                    표현식이 반환



화살표( -> )를 기준으로 왼쪽에는 람다식의 매개변수 x: Int, y: Int를 작성


오른쪽에는 함수의 내용과 반환 값 x * y를 적음


함수 내용에 표현식이 2줄 이상이라면 마지막 표현식이 반환



val multi2: (Int, Int) -> Int = {x: Int, y: Int ->

    println("x * y")

    x * y // 마지막 표현식이 반환

}



람다식의 매개변수에 자료형이 지정되어 있다면 변수의 자료형은 생략



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 greet: ( ) -> Unit = { println("Hello World!") }


val square: (Int) -> Int = { x -> x * x }



첫 번째 람다식에는 매개 변수와 반환값이 없음


그래서 greet의 자료형은 ( ) -> Unit 


람다식 본문을 보면 매개변수를 표현할 필요가 없으므로


화살표 앞쪽과 화살표 자체가 생략



변수 square는 (Int) -> Int로 람다식의 자료형을 지정


람다식을 보고 매개변수와 반환값을 추론할 수 있다면 람다식의 매개변수 자료형은 생략



* 람다식 안의 람다식


val nestedLamda: ( ) -> ( ) -> Unit = {{println("nested")}}


아무것도 없는 람다식 { }에 람다식 {println("nested")}를 넣음



// 람다식의 자료형 생략


val greet = {println("Hello World!")} // 추론 가능


val square = {x: Int -> x * x} // square의 자료형을 생략하려면 x의 자료형을 명시


val nestedLamda = {{println("nested")}}