Kotlin 앱 프로그래밍

(코틀린) 람다함수와 고차함수

쿠카이든 2023. 5. 28. 11:07
728x90
Lambda 함수 

 

함수의 이름이 없는 익명함수(anonymous function)이라고 합니다.

{매개변수 → 실행 코드(몸체)}


위 함수의 구조와 같이 람다(익명)함수는 중괄호 내에 실행문을 입력합니다.
다음은 간단한 예로 문자열을 출력하는 함수입니다.
이 함수를 실행하기 위해서는 함수다음에 인수를 전달하기 위한 ()를 같이 나타내야 합니다.
다음은 전달하는 인수가 별도로 존재하지 않는 경우입니다.

{println("Hello")}()

// 결과: Hello


람다함수 역시 개체이므로 변수에 저장할 수 있습니다.
이 경우 변수명은 함수이름과 같은 역할을 합니다.
그러므로 객체를 호출할 경우 함수와 같이 적용해야 합니다. 즉, 변수명()

val swim={println("swim \n")}
swim()
     
//결과 : swim


다음은 매개변수가 존재하는 경우입니다.

var dirty = 20
val waterFilter = {dirty: Int -> dirty/2}
waterFilter(dirty)
      
//결과: 10


위 람다는 함수를 간단하게 표현하는 방법으로 나타낼 수 있습니다.

fun waterFilter(dirty:Int) = dirty+10
waterFilter(dirty)
      
//결과: 30


람다 함수는 실제로 고차함수(함수를 인수로 취하는 모든 함수)를 사용할 때 강력합니다.

fun updateDirty(dirty: Int, operation: (Int)->Int):Int{
    return operation(dirty)
}

updateDirty(dirty){dirty -> dirty+50}
      
결과: 70

 

고차 함수(Higher-Order Functions)

일반적으로 함수는 매개변수와 반환값이 데이터인데 반해 
고차 함수(고계도 함수)는 전달받는 매개변수나 반환물이 함수인 경우입니다. 
즉, 다음 중 하나를 만족하는 함수를 의미합니다.

1) 함수를 매개변수(파라미터)로 전달 받는 함수
2) 함수를 리턴(반환)하는 함수


다음은 함수에 인수로 문자열을 받아 그 문자열의 길이를 반환하는 함수로서
매개변수를 람다함수를 받는 경우입니다.
이 함수는 람다함수를 매개변수로 받기 때문에
그 함수의 적용은 길이를 반환하는데에 고정되지 않습니다.

fun stringMapper(str:String, result:(String)->Int):Int{
    return result(str)
}

println(stringMapper("Android", {input-> input.length}))
      
//결과: 7

println(stringMapper("Android", {input-> input.length*input.length}))
      
//결과: 49


다음은 정수와 람다함수를 매개변수로 받아 인수인 정수에 다른 함수를 적용하는 것입니다.

fun numFun(x1: Int, argFun: (Int) -> Int){
    val result = argFun(x1)
    println("x1 : x1,someFun1:result")
    }

numFun(7,{x -> x*x*x})
     
//결과: x1 : 7, someFun1 : 343

numFun(7, {x -> (x*x)/10})
      
//결과: x1 : 7, someFun1 : 4​

 
함수내에 함수를 매개변수로 받은 것입니다.
즉, 함수내에 내포된 함수를 하나더 생성한 것입니다.
이 경우 내포한 함수 역시 매개변수가 필요합니다.
위의 두 경우 내포된 함수에 전달한 다른 매개변수를  사용합니다.
매개변수로 사용된 람다함수의 결과를 다르게 할 수 있으므로
하나의 함수에서 다양한 결과를 생성하게 할 수 있습니다.

 

출처: https://datastory1.blogspot.com/2020/03/blog-post_21.html

728x90