람다식 호출
* 값에 의한 호출
코틀린에서 값에 의한 호출은 함수가 또 다른 함수의 인자로 전달될 경우
람다식 함수는 값으로 처리되어 그 즉시 함수가 수행된 후 값을 전달
이렇게 함수나 람다식의 함수 형태를 인자로 사용하면
즉시 호출되어 실행된 후 그 값이 사용됨
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)