뭐라도 끄적이는 BLOG

Kotlin Lambda 본문

Kotlin

Kotlin Lambda

Drawhale 2023. 7. 3. 15:06

Kotlin 함수는 일급 함수로 변수와 데이터 구조에 저장할 수 있으며 다른 함수의 인수로 전달하거나 다른 함수에서 반환할 수 있다. 이를 효율적으로 사용하기 위해 Kotlin에서는 람다와 같은 특수한 언어 구조를 제공한다.

고차함수 (Higher-order functions)

고차함수는 함수를 매개변수로 받거나 함수를 반환하는 함수를 말한다.

Lambda

람다를 사용하여 함수를 훨씬 더 간결한 코드로 작성할 수 있다.

fun uppercaseString(string: String): String {
    return string.uppercase()
}
fun main() {
    println(uppercaseString("hello"))
    println({ string: String -> string.uppercase() }("hello"))
}

람다 표현식은 중괄호 안에서 시작된다. 매개변수 이후 ->를 붙이고 함수 몸체에 본문을 작성한다. 위 예시에서 string은 매개변수이며 string의 타임은 String이다. 매개변수없이 람다를 사용할경우 ->를 사용할 필요가 없다.

{ println("Log message") }

람다는 여러가지 방법으로 사용할 수 있다.

  • 변수에 람다를 할당하여 나중에 호출
  • 람다를 다른 함수에 매개변수로 전달
  • 함수에서 람다 반환
  • 람다를 자체적으로 호출

변수에 할당

fun main() {
    val upperCaseString = { string: String -> string.uppercase() }
    println(upperCaseString("hello"))
    // HELLO
}

람다를 함수의 매개변수로 전달

val numbers = listOf(1, -2, 3, -4, 5, -6)
val positives = numbers.filter { x -> x > 0 }
val negatives = numbers.filter { x -> x < 0 }
println(positives)
// [1, 3, 5]
println(negatives)
// [-2, -4, -6]

filter함수는 람다식을 받는다.

  • { x -> x > 0 }은 목록의 각 요소를 취하여 양수인 요소만 반환한다.
  • { x -> x < 0 }은 목록의 각 요소를 취하여 음수인 요소만 반환한다.
람다에서 함수 매개변수가 한개인 경우 함수 괄호를 사용하지 않아도 된다.

함수 타입

함수에서 람다를 반화하려면 먼저 함수 타입에 대해서 이해해야 한다. Kotlin에서는 함수 자체에도 타입이 있다. 컴파일러에 함수에 허용되는 걸과 허용되지 않는 것을 알리기 위해 함수타입 설정이 필요하다. 함수 타입은 다음과 같은 형식을 다진다.

  • 각 매개변수의 타입은 괄호 안에 작성되고 쉼표로 구분
  • return 타입은 ->이후에 작성
val upperCaseString: (String) -> String = { string -> string.uppercase() }

fun main() {
    println(upperCaseString("hello"))
    // HELLO
}

람다에서 매개변수가 없는 경우 빈 괄호를 넣어둔다.

함수 반환

람다는 함수의 반환으로 사용될 수 있다. 컴파일러가 반환되는 람다의 타입을 이해할 수 있도록 함수 타입을 선언해야 한다. 다음 예제는 toSeconds()함수에 Int타입의 매개변수를 받아 Int 값을 반환하는 람다를 반환한다. `(int)->Int`

fun toSeconds(time: String): (Int) -> Int = when (time) {
    "hour" -> { value -> value * 60 * 60 }
    "minute" -> { value -> value * 60 }
    "second" -> { value -> value }
    else -> { value -> value }
}

fun main() {
    val timesInMinutes = listOf(2, 10, 15, 1)
    val min2sec = toSeconds("minute")
    val totalTimeInSeconds = timesInMinutes.map(min2sec).sum()
    println("Total time is $totalTimeInSeconds secs")
    // Total time is 1680 secs
}

람다 호출

중괄호 뒤에 괄호를 추가하고 괄호 안의 매개변수를 포함하면 람다를 자체적으로 호출할 수 있다.

println({ string: String -> string.uppercase() }("hello"))
// HELLO

Trailing 람다

람다가 유일한 함수 매개변수인 경우 괄호를 삭제할 수 있다. 람다가 함수의 마지막 매개변수로 전달되는 경우 함수 괄호 외부에 작성할 수 있다. 이 두 경우를 모두 trailing 람다라고 한다.

// The initial value is zero. 
// The operation sums the initial value with every item in the list cumulatively.
println(listOf(1, 2, 3).fold(0, { x, item -> x + item })) // 6

// Alternatively, in the form of a trailing lambda
println(listOf(1, 2, 3).fold(0) { x, item -> x + item })  // 6
반응형

'Kotlin' 카테고리의 다른 글

Kotlin 함수  (0) 2023.07.03
Kotlin 제어문(조건문: if/when, 제어문: for/while)  (0) 2023.07.01
Kotlin 변수와 데이터 타입  (0) 2023.07.01
Hello Kotlin  (0) 2023.06.30