람다식

OneTwoThree·2022년 7월 25일
0

부스트코스 코틀린

목록 보기
4/26

[부스트코스]람다

람다식 정의, 선언

fun main() {
    val lam1 = {a:Int,b:Int->a*b}
    val lam2 : (a:Int, b:Int)->Int = {a,b->a*b}
}

람다식은 기본적으로 {사용할 매개변수 -> 반환식}의 형태로 정의한다.
앞에서 함수의 인자로 람다식을 전달할 때는 {a,b->a+b}와 같은 형태로 전달했다.
이것은 함수의 선언에서 이미 sum : (a:Int, b:Int)->Int와 같이 자료형읠 정의했기 때문이다.

람다식을 이렇게 바로 사용하는 경우에는 람다식 1처럼 {}내에 자료형을 명시해줘야 한다.
{}에서 자료형을 생략하고 싶다면 람다식 2처럼 먼저 람다식 선언을 하고 정의해줘야 한다.
(매개변수:자료형, 매개변수:자료형 .. ) -> 반환형 = {람다식} 과 같이 사용한다.

또한 표현식의 형태를 통해 자료형을 추론할 수 있다면 명시하지 않아도 된다.

fun main() {    
    val greet = {println("greetings")}
}

greet는 표현식에 출력문만 존재하므로 매개변수가 없고 반환형도 없다는 것을 추론할 수 있다. 따라서 선언부나 표현식에 자료형을 생략했다.

또한 Kotlin에서 함수는 일급객체이므로 변수에 함수를 넣을 수 있다.
lam1과 lam2는 람다식을 값으로 넣은 변수이다. 따라서 변수를 함수처럼 사용할 수 있다.

fun main() {
    val lam1 = { a: Int, b: Int -> a * b }
    val lam2: (a: Int, b: Int) -> Int = { a, b -> a * b }

    println(lam1(5,2))
    println(lam2(3,6))

}

10
18

선언부나 매개변수 부분에 적어도 한 부분은 자료형을 명시해 줘야 한다.
두 부분에서 모두 생략하면 자료형을 추론할 수 없다.

fun main() {
    val lam2: (a: Int, b: Int) -> Int = { a, b -> 
        println("${a} * ${b} = ${a*b}") 
        a * b //반환식 
    }

    println(lam2(10,20))

}

10 * 20 = 200
200

표현식이 2줄 이상인 경우 -> 이후 부분을 다음 줄로 개행해서 작성할 수 있다. 이 경우 마지막 문장이 반환식이 된다.

반환 자료형이 없거나 매개변수가 0 또는 1개일 때

fun main() {
    val greet : ()->(Unit) = {println("nice to meet you")}
    val square : (Int)->(Int) = {x->x*x}
}

greet은 매개변수가 0개이고 반환값이 없다.
따라서 반환값을 매개변수는 빈 괄호 (), 매개변수는 (Unit)으로 명시해준다.
표현식에서도 매개변수가 없기 때문에 -> 포함 앞부분을 생략하고 출력문만 작성한다.

square은 매개변수가 1개이므로 매개변수를 1개만 작성하면 된다.

람다식 내에 람다식이 있는 경우

fun main() {
    val nested : ()->()->(Unit) = {{println("nested lambda")}}
    nested()
}

->를 2회 사용해서 선언부를 나타내고 표현식도 {{}}로 괄호를 중첩해서 나타낸다.

0개의 댓글