App노자
[Kotlin] 고차함수와 람다식 본문
1. 고차 함수란?
고차함수란 다른함수를 인자로 사용하거나 결괏값으로 반환하는 함수를 말한다
일급객체 혹은 일급 함수를 주고 받을 수 있는 함수가 고차 함수다
https://kotlinlang.org/docs/lambdas.html#higher-order-functions
High-order functions and lambdas | Kotlin
kotlinlang.org
2. 고차 함수의 형태
fun main() {
val res1 = sum(3, 2) // 일반 인자
val res2 = mul(sum(3, 3), 3) // 인자에 함수를 사용
println("res1: $res1, res2: $res2")
}
fun sum(a: Int, b: Int) = a + b
fun mul(a: Int, b: Int) = a * b
fun main() {
println("funcFunc: ${funcFunc()}")
}
fun sum(a: Int, b: Int) = a + b
fun funcFunc(): Int { // 함수의 반환값으로 함수 사용
return sum(2, 2)
}
3. 람다식이란?
fun Multiplication (Multi: (Int, Int) -> Int, a: Int, b: Int): Int {
return Multi(a, b)
}
//fun Multiplication (Multi: (Int, Int) -> Int, a: Int, b: Int): Int = Multi(a, b)
// Multi 람다식 매개변수
// (Int, Int) -> Int 람다식
fun main() {
print(Multiplication({x, y -> x * y},10,20))
}
람다식 함수란 이름 없이 함수의 역할을 하는 익명 함수이며 주로 고차함수의 인자로 활용된다
또한 일급 객체의 특징을 갖고 있다
람다식은 다른 함수의 인자로 넘기거나, 결괏값으로 반환, 변수에 저장하는 특징을 갖고 있기 때문에 이름이 없는
일급함수라고 생각하면 쉬울 거 같다
- 일급 객체의 특징 -
1. 함수의 인자로 전달할 수 있다
2. 함수의 반환값에 사용할 수 있다
3. 변수에 담을 수 있다
- 고차함수란 -
다른 함수를 인자로 사용하거나 함수를 결괏값으로 반환하는 함수
3. 변수에 할당하는 람다식 함수
fun main() {
val sum: (Int, Int) -> Int = {x: Int, y: Int -> x + y}
// val sum: (Int, Int) -> Int = {x, y -> x + y}
// val sum = {x : Int, y : Int -> x + y}
// (타입, 타입) -> 반환형 타입
}
일반 함수를 인자나 반환값으로 사용하는 고차 함수이다
람다식이 변수에 할당되어 함수 형태로 사용이 가능하다
선언 자료형을 생략하거나 람다식 매개변수 자료형을 생략하는 것도 가능하나 전부 생략하면 추론을 할 수 없기 때문에 에러가 발생한다
4. 람다식과 고차 함수
fun main() {
val result = callByValue(lambda()) // 람다식 함수로 호출
println(result)
}
fun callByValue(b: Boolean): Boolean { // 일반 변수 자료형으로 선언된 매개변수
println("callByValue function")
return b
}
val lambda: () -> Boolean = { // 람다 표현식이 두 줄이다
println("lambda function")
true // 마지막 표현식 문장의 결과가 반환
}
기본형 변수로 할당된 값은 스택에 있고 다른 함수에 인자로 전달하는 경우에는 해당값이 복사되어 전달된다
참조형 변수로 할당된 객체는 참조주소가 스택에 있고 객체는 힙에 있으며 함수에 전달할때는 참조된 주소가 복사되어 전달된다
코틀린에서는 값의 의한 호출이 일반적이다
함수의 첫번째 인자로 람다식 x* y, 두번째 인자로는 3을 사용했고 마지막은 매개변수를 미리 설정 했다
sum은 람다식 함수를 가리키고 인자를 받아 연산을 수행한 후 결과를 반환한다
fun main() {
val result = callByName(otherLambda) // 람다식 이름으로 호출
println(result)
}
fun callByName(b: () -> Boolean): Boolean { // 람다식 함수 자료형으로 선언된 매개변수
println("callByName function")
return b()
}
val otherLambda: () -> Boolean = {
println("otherLambda function")
true
}
fun main() {
// 1. 인자와 반환 값이 있는 함수
val res1 = funcParam(3, 2, ::sum)
println(res1)
// 2. 인자가 없는 함수
hello(::text) // 반환값이 없음
hello({ a, b -> text(a, b) }) // 위의 식과 동일한 표현
hello { a, b -> text(a, b) } // 위의 식과 동일한 표현
// 3. 일반 변수에 값처럼 할당
val likeLambda = ::sum
// 혹은 val likeLambda:(Int, Int) -> Int = ::sum
println(likeLambda(6,6))
}
fun sum(a: Int, b: Int) = a + b
fun text(a: String, b: String) = "Hi! $a $b"
fun funcParam(a: Int, b: Int, c: (Int, Int) -> Int): Int {
return c(a, b)
}
fun hello(body: (String, String) -> String): Unit {
println(body("Hello", "World"))
}
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] 흐름 제어문과 예외 처리문 (0) | 2023.04.08 |
---|---|
[Kotlin] 조건문과 반복문 (0) | 2023.04.02 |
[Kotlin] 함수 (0) | 2023.01.27 |
[Kotlin] Null safety (0) | 2023.01.25 |
[Kotlin] 변수와 자료형 (0) | 2023.01.24 |