기타/What I Learned

[TIL] Kotlin - 람다식의 이해(1)

가죽방패 2022. 1. 28. 13:45

※ 람다식의 이해

함수의 내용을 할당하거나 인자 혹은 반환값을 자유롭게 넘기려면 호출 방법을 이해해야 하는데 기본현 변수로 할당된 값은 스택에 있고 다른 함수에 인자로 전달되는 경우는 값이 복사가 되어 전달이 된다. 참조형 변수로 할당된 객체는 참조 주소가 스택에 있고 객체는 힙에 있다. 참조형 객체는 함수에 전달할 때 참조된 주소가 복사되어 전달된다.

 

람다식과 고차함수 호출하기 : 함수가 인자로 전달되는 경우는 람다식 함수는 값으로 처리가 되며

그 즉시 함수가 수행된 후 값을 전달한다

 

○ 값에 의한 호출

- 값에 의한 호출은 함수가 인자로 전달될 경우 람다식 함수는 값으로 처리되어 함수가 수행된 후 값을 전달하는 형식

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

fun callByValue(b: Boolean): Boolean { // 일반 변수 자료형으로 선언된 매개변수
    println("callByValue function")
    return b
}

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

○ 이름에 의한 호출

- 람다식 함수의 이름을 인자로 넣어 사용하면 람다식 자체가 매개변수에 복사되고 해당 함수가 호출되어 사용되기 전까진 람다식 함수가 실해되지 않는다.

fun main() {
    val result = callByName(otherLambda) // 람다식 이름으로 호출
    println(result)
}

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

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

○ 다른 함수의 참조에 의한 호출

- 람다식이 아닌 일반 함수를 또 다른 함수의 인자에서 호출하는 고차 함수의 경우를 생각해 보면 두 개의 콜론기호(::)를 함수 이름 앞에 사용해 소괄호와 인자를 생략하고 사용하면 일반 함수를 참조에 의한 호출로 사용할 수 있다

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

    // 2. 인자가 없는 함수
    hello(::text) // 반환값이 없음

    // 3. 일반 변수에 값처럼 할당
    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", "World"))
}

 

 

출처: 코틀린 프로그래밍 기본(강사: 황영덕)