변수에 함수 저장
trickFunction 변수에 trick을 저장하려고 했습니다. 그러나 함수를 값으로 참조하려면 함수 참조 연산자(::)를 사용해야 합니다.
fun main() {
val trickFunction = ::trick
}
fun trick() {
println("No treats!")
}
람다 표현식을 사용한 함수 재정의
람다 표현식은 fun 키워드 없이 함수를 정의할 수 있는 간결한 문법입니다. 람다 표현식은 다른 함수에 관한 함수 참조 없이 변수에 직접 저장할 수 있습니다.
할당 연산자(=) 앞에 val 또는 var 키워드를 추가하고 그 뒤에 함수를 호출할 때 사용하는 변수 이름을 추가합니다. 할당 연산자(=) 다음에 람다 표현식이 옵니다. 이때 람다 표현식은 함수 본문을 구성하는 한 쌍의 중괄호로 구성됩니다.

fun main() {
trick()
}
val trick = {
println("No treats!")
}
// 결과
No treats!
fun main() {
val trickFunction = trick
trick()
trickFunction()
}
val trick = {
println("No treats!")
}
// 결과
No treats!
No treats!
함수를 데이터 유형으로 사용
함수 매개변수의 유형이나 반환 유형을 지정하려면 함수 유형을 표현하기 위한 문법을 알아야 합니다. 함수 유형은 선택적 매개변수 목록, -> 기호, 반환 유형이 포함된 괄호 쌍으로 구성됩니다.

val treat: () -> Unit = {
println("Have a treat!")
}
fun main() {
treat()
}
// 결과
Have a treat!
함수를 반환 유형으로 사용

fun trickOrTreat(isTrick: Boolean): () -> Unit {
if (isTrick) {
return trick
} else {
return treat
}
}
fun main() {
val treatFunction = trickOrTreat(false)
val trickFunction = trickOrTreat(true)
treatFunction()
trickFunction()
}
// 결과
Have a treat!
No treats!
함수를 다른 함수에 인수로 전달
fun trickOrTreat(isTrick: Boolean, extraTreat: (Int) -> String): () -> Unit {
if (isTrick) {
return trick
} else {
println(extraTreat(5))
return treat
}
}
fun main() {
val coins: (Int) -> String = { quantity ->
"$quantity quarters"
}
val cupcake: (Int) -> String = {
"Have a cupcake!"
}
val treatFunction = trickOrTreat(false, coins)
val trickFunction = trickOrTreat(true, cupcake)
treatFunction()
trickFunction()
}
// 결과
5 quarters
Have a treat!
No treats!