Kotlin

고차함수와 람다식

공부처음하는사람 2023. 12. 23. 02:39

람다식이란?

  • 익명 함수의 하나의 형태로 이름 없이 사용 및 실행이 가능
    val multi: (Int, Int) -> Int = { a: Int, b: Int -> a * b }
    // 생략되지 않은 전체표현
    val multi: (a: Int, b: Int) -> Int = { a, b -> a * b }
    // 람다식 매개변수 자료형의 생략
    val multi = { a: Int, b: Int -> a * b }
    // 선언 자료형 생략

 fun main() {

    val result: Int

//    val multi: (Int, Int) -> Int = { a: Int, b: Int -> a * b }
    val multi: (a: Int, b: Int) -> Int = { a, b ->
        println("$a, $b")
        a * b // 이 부분이 반환된다. 반환값이 없을경우 Unit 사용
    }
//    val multi = { a: Int, b: Int -> a * b }

    result = multi(15,20)
    println(result)
}   

값에 의한 호출

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

람다식 함수를 즉시 실행했기 때문에, val lambda 구문이 먼저 시작된다.
그 이후 결과값이 반환되고, callByvalue 함수가 실행된다.

fun main() {
    val result = callByName(otherLambda) // 람다식 이름으로 호출
    println(result)
}

fun callByName(b: () -> Boolean): Boolean { // 람다식 함수 자료형으로 선언된 매개변수
    println("callByName function")
    return b()
}

val otherLambda: () -> Boolean = {
    println("otehrLambda function")
    true // 리턴
}

출력순서
callByName function
otehrLambda function
true

이 경우엔 위와 다르게 람다식 이름으로 호출했고, fun callByName의 매개변수가
람다식의 형태와 같기때문에 val otehrLambda의 람다식이 그대로 callByName으로 넘어간다.
그 이후 결과값 true가 반환되어 b() -> result로 넘어가는 형태이다.

다른 함수의 참조에 의한 호출

fun sum(x: Int, y: Int) = x + y

funParam(3, 2, sum) // 오류가 발생한다. sum은 람다식이 아니기때문에
...
fun funcParam(a: Int, b: Int, c: (Int, Int) -> Int): Int {
    return c(a, b)
}

funcParam(3, 2, ::sum)

::sum은 sum의 형태가 람다식과 일치하는 경우에 콜론 2개를 사용해서 호출할 수 있다.


스프링 입문 강의를 보고 학습중에 크게 당했다.
이해가 조금 되긴 하지만 여기서 기능을 왜 사용하는지, 이게 뭔지, 왜 이렇게 들어갔는지
전혀 이해가 되지 않아 엄청 헤맸다.
바로 강의를 끄고 미뤘던 기초강의를 다시 틀었다.
기초가 모자라다. 크리스마스까지 확실하게 기초를 짚고 넘어가야겠다.
불면증때문에 하루하루가 지옥이어서 그런지 컨디션 관리가 너무x100 안됬다.
국산 수면보조제를 쿠팡에서 주문해 먹었는데 두알씩 먹어도 효과가 없다.
병원가서 진단을 한번 받아야겠다는 생각이 점점 커진다...

연휴간 계획은 기초강의를 다 듣고 키오스크 lv5 까지 구현하기가 목표다.
사실 되게 촉박한데 개념정리가 우선시 되어야 스프링 진도가 나갈 것 같다.

'Kotlin' 카테고리의 다른 글

예외 처리  (1) 2023.12.23
확장 함수  (1) 2023.12.23
내일배움캠프 12.21 TIL  (0) 2023.12.22
스코프 함수  (0) 2023.12.22
내일배움캠프 12.20 TIL  (0) 2023.12.22