Kotlin

함수형 프로그래밍 #2 ★

J_Bin 2022. 6. 13. 15:29

- 값에 의한 람다식 호출

- 이름에 의한 람다식 호출

 

package chap02.section1

// 호출 순서가 다름

fun main(){
    val result = callByValue(lambda())      // 람다식 함수를 호출
    println(result)

    val result2 = callByName(otherLambda)       // 람다식 이름으로 호출
    println(result2)


}

fun callByValue(b: Boolean): Boolean{
    println("callByValue function")
    return b
}

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

val lambda: () -> Boolean = {       // 람다 표현식이 2줄
    println("lambda function")
    true                            // 마지막 표현식 문장의 결과가 반환
}

val otherLambda: () -> Boolean = {
    println("otherLambda function")
    true
}

 

 

# 참조에 의한 호출 방식으로 일반 함수 호출하기

package chap02.section1

// 참조에 의한 호출 방식으로 일반 함수 호출하기

fun main(){

    // 인자와 반환값이 있는 함수
    val res1 = funcParam(3,2,::sum)
    println(res1)

    // 인자가 없는 함수
    hello(::text)                                           // hello({a,b -> text(a,b)}) 으로 표현 가능

    // 일반 변수에 값처럼 할당
    val likeLambda = ::sum
    println(likeLambda(6,6))





}

fun sum(a: Int , b: Int) = a + b

fun text(a: String, b: String) = "Hi! $a $b"

fun funcParam(a: Int, b: Int, c: (Int,Int) -> Int): Int{
    return c(a,b)
}

fun hello(body: (String,String) -> String): Unit {
    println(body("Hello","Kotlin"))
}

 

# 일반 매개변수와 람다식 매개변수를 같이 사용하기

package chap02.section1

// 일반 매개변수와 람다식 매개변수를 같이 사용하기

fun main(){
    withArgs("Arg1","Arg2") { a, b -> "Hello world! $a $b" }

    twoLambda({a,b -> "First $a $b"}, {"Second $it"})
    


}

// 람다식 매개변수가 마지막에 위치 되어야 함.
fun withArgs(a: String, b: String, out:(String,String) -> String){
    println(out(a,b))
}

// 일반 함수에 람다식 매개변수를 2개 이상 사용하기
fun twoLambda(first:(String,String) -> String, second:(String) -> String){
    println(first("OneParam","TwoParam"))
    println(second("OneParam"))
}

 

# 꼬리 재귀함수

package chap02.section1



fun main(){

    val number = 4
    val result : Long

    result = factorial(number)
    println("Factorial : $number -> $result")

    val number2 = 5
    println("Factorial2 : $number2 -> ${factorial2(number2)}")
}

// 일반적인 재귀함수
fun factorial(n: Int):Long{
    return if (n == 1) n.toLong() else n * factorial(n-1)
}

// 꼬리 재귀를 사용한 함수
tailrec fun factorial2(n: Int, run:Int = 1):Long{
    return if (n == 1) run.toLong() else factorial2(n-1,run*n)
}