코틀린의 중요한 개념 중 하나는 모든 것을 값을 가진다는 것이다. 아래와 같은 if문도 표현식으로 작성되어 값으로 표현된다. 함수도 마찬가지이다.
val a = if(temp<40) true else false
함수는 여러 인자들을 받을 수 있다.
fun <T> varargExample(vararg ts: T) { ... }
fun main(args: Array<String>) {
val a = arrayOf(1,2,3)
varargExample(*a) // spread operator
}
만약 함수의 리턴 값이 하나의 표현식을 리턴할 때는 중괄호가 아니라 =를 사용할 수 있다.
fun function() {
return expression
}
fun function() = expression
앞서 함수도 값으로 표현될 수 있다고 하였다. 즉, 변수처럼 인자로 전달될 수도 있고 변수에 저장될 수도 있다. 이렇게 값으로 사용되는 함수를 함수 리터럴이라고 한다. 함수 리터럴은 다음과 같은 두가지 방식으로 표현가능하다.
예시는 각각 아래와 같다.
람다표현식
val a : {Int, Int) -> Int = {x, y -> x+y}
val a = {a: Int, b:Int -> a+b} // simplified
익명함수
val a = fun(a:Int, b:Int) : Int = a+b
a(2,3) or a.invoke(2,3)
{a -> a > 0} == {it > 0}
toUpperCase("abc", {it.uppercase()})
-> toUpperCase("abc") {it.uppercase()}
람다표현식에서 return은 non-local return이고 익명함수에서의 return은 local return이다. -> [lambda vs anonymous function]
named function을 인자로 전달할 때 명확하게 이 것이 함수라는 것을 알리는 역할을 하며 이 함수를 호출하지 않게 함.
수신 객체 지정 함수 -> 특정한 객체를 대상으로 사용할 수 있는 함수
type like this
Int.(Int) -> String
익명함수
val sum = fun Int.(it: Int):Int = this + it
람다표현식
val sum : Int.(Int) -> Int = {plus(it)}
val sum : Int.(Int) -> Int = {this.plus(it)}
val sum : Int.(Int) -> Int = {this + it}
함수를 파라미터로 받는 함수
example..
fun higherOrderFunction(func: (Int) -> Int) {...}
fun higherOrderFunction(arg: Int, func: (String) -> Int) {...}
fun higherOrderFunction(func: (Int, Int) -> Int) {...}
most kotlin built-in function are defined using last parameter call syntax. somthing like..
inline fun repeat(times: Int, action: () -> Unit)
repeat(3) {
println("hello")
}