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)
}