Kotlin에서 함수는 1급 객체, First-class citizen
이다
1급 객체는 아래의 조건을 충족한다.
익명 클래스와 같은 역할로 fun
키워드 뒤에 이름을 설정하지 않아서,
일회성으로 처리하기 위해 사용
val addResult = fun (a: Int, b: Int) = a + b
printf(addResult(100, 200)) // 300
val addResult = fun (a: Int, b: Int): Int { return a + b }(100, 200)
println(addResult) // 300
익명 함수를 더 간편하게 작성하는 방법으로, fun
키워드 없이 사용
->
로 구분{ println("아무 인자 없는 람다") } //아무 인자 없는 람다
// 인자가 하나인 경우
println({ x: Int -> x + x}(10)) // print: 20
// 변수에 할당
val result = { x: Int, y: Int -> x + y }
println(result(1, 2)) // print: 3
// 람다를 인자로 받는 함수
fun highOrderFunction(x: Int, y: Int, f: (Int, Int) -> Int): Int {
return f(x, y)
}
println(highOrderFunction(1, 2) { x, y -> x * y }) // print: 2
fun returnHighOrderFunction(): () -> Int = { 100 } // 람다를 반환하는 함수
,
를 제외할 수 있음.::
을 사용하여 함수를 참조.fun isOdd(x: Int) = x % 2 != 0
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // [1, 3]
filter 함수의 원형
inline fun IntArray.filter( predicate:(Int) -> Boolean )
fun main() {
val a: () -> Unit = { println("함수") } // 매개변수와 반환 값이 없는 함수
val b: (Int) -> Int = { x -> x * 3} // 하나의 매개변수로 처리하고 반환 값은 Int
val c: (Int, Int) -> Int = { x, y -> x + y} // 두 개의 매개변수로 처리하고 반환 값은 Int
a() // 함수
println(b(10)) // 30
println(c(10, 20)) // 30
}
invoke
라는 호출메서드를 오버라이딩 해서 사용할 수 있음.class A : Function<Unit> { // 함수 자료형 인터페이스 상속
operator fun invoke() {
println("연산1")
}
}
class MyFunction : () -> Unit { // 함수 자료형 상속
override fun invoke() {
println("연산2")
}
}
fun nullFunc(action: MyFunction?): Unit {
action?.invoke() // action()
}
익명객체
로 사용val a = object : (Int, Int) -> Int {
override fun invoke(x: Int, y: Int): Int {
return x+y
}
}
println(a(1,2)) // 3