2020. 10. 16. 00:30

* 값에 의한 호출



코틀린에서 값에 의한 호출은 함수가 또 다른 함수의 인자로 전달될 경우


람다식 함수는 값으로 처리되어 그 즉시 함수가 수행된 후 값을 전달


이렇게 함수나 람다식의 함수 형태를 인자로 사용하면 

즉시 호출되어 실행된 후 그 값이 사용됨


val result = callByValue(lamda()) // 람다식 함수를 호출


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


val lamda: ( ) -> Boolean = { }




* 이름에 의한 람다식 호출



람다식의 이름이 인자로 전달될 때 실행되지 않고 실제로 호출할 때 실행되도록 하면 어떨까?


val result = callByName(otherLamda) // 람다식 이름으로 호출


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


otherLamda: ( ) -> Boolean = { }



위의 코드와 거의 동일해 보이지만 람다식의 이름을 callByName( ) 함수에서 호출하는 점이 다름



이것을 잘 활용하면 상황에 맞춰 즉시 실행할 필요가 없는 코드를 작성하는 경우 


이름에 의한 호출 방법을 통해 필요할 때만 람다식이 작동하도록 만들 수 있음




* 다른 함수의 참조에 의한 일반 함수 호출



람다식이 아닌 일반 함수를 또 다른 함수의 인자에서 호출하는 고차 함수의 경우를 생각


fun sum(x: Int, y: Int) = x + y



덧셈을 하는 평범한 함수


이것을 고차함수인 funcParam( ) 에서 호출


funcParam(3, 2, sum) // 오류! sum은 람다식이 아님


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

    return c(a, b)

}



sum 함수는 람다식이 아니므로 위와 같이 이름으로 호출할 수 없음


하지만 sum( )과 funcParam( )의 매개변수 c의 선언부 구조를 보면 인자 수와 자료형의 개수가 동일


이 때는 다음과 같이 콜론 기호를 함수 앞에 사용해 소괄호와 인자를 생략하고 사용


funcParam(3, 2, ::sum)