람다 함수 (Lambda Function)

익명 함수 (Anonymous Function)

람다 함수 (Lambda Function)

람다 함수


함수형 프로그래밍 언어에서 사용되는 개념으로 익명 함수(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
essential