람다 함수
함수형 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous
Function
)라고도 한다.
- 다른 함수의 인자로 넘기는 함수
- 함수의 결과값을 반환하는 함수
- 프로퍼티에 저장되는 함수
람다식 형태
// 람다식
val value1 = (Int, Int) -> Int = { x: Int, y: Int ->
x * y
}
// 람다식의 선언 자료형 생략
val value2 = { x: Int, y: Int ->
x * y
}
// 람다식의 파라미터 생략
val value3 = (Int, Int) -> Int = { x, y ->
x * y
}
람다식 호출
이름에 의한 람다식 호출 (Call
By
Name
)
람다식의 이름이 파라미터로 전달되는 경우에 람다식 자체가 복사되어 실제로 호출될 시 실행된다.
fun main() {
val result = callByName(otherLambda) // 람다식 이름으로 호출
println(result)
}
fun callByName(value: () -> Boolean): Boolean { // 람다식 함수 자료형으로 선언된 파라미터
println("Call By Name Function")
return value()
}
val otherLambda: () -> Boolean = {
println("Other Lambda Function")
true
}
// Call By Name Function
// Other Lambda Function
// true
값에 의한 람다식 호출 (Call
By
Value
)
람다식 함수가 파라미터로 전달되는 경우에 람다식 함수는 값으로 처리되어 람다식 함수가 즉시 실행된 후 그 함수의 반환값을 전달한다.
fun main() {
val result = callByValue(lambda()) // 람다식 함수를 호출
println(result)
}
fun callByValue(value: Boolean): Boolean { // 일반 변수 자료형으로 선언된 파라미터
println("Call By Value function")
return value
}
val lambda: () -> Boolean = {
println("Lambda function")
true
}
// Lambda function
// Call By Value function
// true
참조에 의한 람다식 호출
::
로 일반 함수를 람다식처럼 사용할 수 있다.
fun main() {
// 인자와 반환 값이 있는 함수
val total = total(10, 5, ::sum)
println("Total: $total")
// 인자가 없는 함수
hello(::text)
hello( { a, b -> text(a, b) } )
hello { a, b -> text(a, b) }
// 일반 변수에 값처럼 할당
val newSum = ::sum
println("NewTotal: ${total(10, 10, ::sum)}")
}
fun sum(a: Int, b: Int) = a + b
fun total(a: Int, b: Int, c: (Int, Int) -> Int): Int {
return c(a, b)
}
fun hello(msg: (String, String) -> String): Unit {
println(msg("AAA", "BBB"))
}
fun text(a: String, b: String) = "Hi! $a $b"
// Total: 15
// Hi! AAA, BBB
// Hi! AAA, BBB
// Hi! AAA, BBB
// NewTotal: 20