코틀린을 공부하다보면 간혹가다가 괄호가 없고 바로 중괄호부터 시작하는 함수들이 있다.
가령 예를들면 코루틴의 initializer 같은 함수가 대표적인 예시이다.
이런 함수는 어떻게 만드는 것일까?
결론부터 말하면, 함수가 하나의 람다함수만 인풋으로 받을 경우 괄호()를 생략할 수 있다.
코틀린 공식문서에는 다음과 같이 적혀있다.
If a call takes a single lambda, it should be passed outside of parentheses whenever possible.
https://kotlinlang.org/docs/coding-conventions.html#lambdas
인풋으로 람다함수 하나만 받는다면 가능하면 괄호 밖으로 람다함수를 꺼내는게 좋다 라는 얘기
아래는 대표적인 예시이다
fun myfunc(body : () -> Int){
var abc = body()
println(abc)
}
fun main() {
myfunc{
var a = 10
a
}
}
10
람다함수는 리턴타입이 Unit이 아니면 마지막 statement가 return 값임을 기억하자
If the inferred return type of the lambda is not Unit, the last (or possibly single) expression inside the lambda body is treated as the return value.
https://kotlinlang.org/docs/lambdas.html#passing-trailing-lambdas
사실 위 개념은 trailing 이라는 개념으로 다른 언어에서도 볼수 있다.
코틀린에서는 정확한 명칭으로는 trailing-lamdas라고 한다.
According to Kotlin convention, if the last parameter of a function is a function, then a lambda expression passed as the corresponding argument can be placed outside the parentheses:
val product = items.fold(1) { acc, e -> acc * e }
즉, 함수의 마지막 파라미터가 함수일경우, 파라미터를 람다함수 형식으로 괄호 밖으로 빼내서 전달 할 수 있는것이다
'Kotlin' 카테고리의 다른 글
3차원 회전행렬 구하기 및 캘리브레이션 (0) | 2024.01.26 |
---|---|
[코틀린] 람다표현식과 익명함수 차이 (0) | 2021.12.30 |
[코틀린 용어] 클로저 의미, closure (0) | 2021.12.30 |
[코틀린 용어] higher order function, function literal, 고차함수, 함수 리터럴 (0) | 2021.12.29 |
[코틀린] 리시버가있는 함수 리터럴, Function literals with receiver (1) | 2021.12.29 |
댓글