본문 바로가기
Java & Kotlin/Kotlin

[Kotlin] 람다

by heekng 2022. 7. 7.
반응형

람다

Java에서의 람다

  • 자바에서는 메서드 자체를 직접 넘겨주는 것처럼 사용할 수 있다.(Predicate 사용)
  • 즉, 2급 시민. Java에서는 함수는 변수에 할당되거나 파라미터로 전달할 수 없다.

Kotlin에서의 람다

Kotlin

fun main() {
    val fruits = listOf(
            Fruit("사과", 1_000),
            Fruit("사과", 2_000),
            Fruit("사과", 1_200),
            Fruit("사과", 1_500),
            Fruit("바나나", 3_000),
            Fruit("바나나", 3_200),
            Fruit("바나나", 2_500),
            Fruit("사과", 10_000)
    )

    // 람다를 만드는 방법 1
    /*
    val isApple = fun(fruit: Fruit): Boolean {
        return fruit.name == "사과"
    }
     */
    val isApple: (Fruit) -> Boolean = fun(fruit: Fruit): Boolean {
        return fruit.name == "사과"
    }

    // 람다를 만드는 방법 2
    val isApple2 = {fruit: Fruit -> fruit.name == "사과"}

    // 람다를 직접 호출하는 방법 1
    isApple(fruits[0])

    // 람다를 직접 호출하는 방법 2
    isApple.invoke(fruits[0])


    filterFruits(fruits, isApple)
    // 가장 마지막 파라미터에 함수 있다면 중괄호에 입력할 수 있다.
    // 어떤 타입의 객체가 들어올 지 알기 때문에 클래스를 제외할 수 있다.
    filterFruits(fruits) {fruit -> fruit.name == "사과"}
    // 파라미터가 하나일 경우 it을 사용하면 해당 값을 바로 사용하게 된다.
    filterFruits(fruits) {it.name == "사과"}

}

private fun filterFruits(fruits: List<Fruit>, filter: (Fruit) -> Boolean): List<Fruit> {
    val result = mutableListOf<Fruit>()
    for (fruit in fruits) {
        if (filter(fruit)) {
            result.add(fruit)
        }
    }
    return result
}
  • 코틀린에서는 함수가 1급 시민이다.
    • 때문에 코틀린에서는 함수가 그 자체로 값이 될 수 있다.
    • 함수 자체를 변수에 넣을 수도 있고, 파라미터로 전달할 수도 있다.
  • 코틀린에서 함수 타입은 (파라미터 타입, ...) -> 반환타입이다.
  • 마지막 파라미터가 함수일 경우 소괄호 밖에 람다를 사용할 수 있다.
    • 람다를 작성할 때, 람다의 파라미터를 it으로 직접 참조할 수 있다.
      (비추천, 사용하는 쪽에서 어떤 데이터인지 모른다.)
  • 람다를 여러 줄 작성할 수 있고, 마지막 expression 결과가 람다의 결과값이 된다.

Closure

  • 자바에서는 람다를 사용할 때 사용할 수 있는 변수에 제약이 있다.
    • 외부에 있는 변수는 final 혹은 final 처럼 작동하는 변수만 사용할 수 있다.
  • 하지만 코틀린에서는 어떤 변수더라도 사용할 수 있다.
  • 코틀린은 람다가 시작하는 지점에 참조하고 있는 변수들을 모두 포획해서 그 정보를 가지고 있다.
  • 이런 데이터 구조를 Closure이라 한다.
반응형

'Java & Kotlin > Kotlin' 카테고리의 다른 글

[Kotlin] 여러가지 기능  (0) 2022.07.07
[Kotlin] 컬렉션을 함수형으로 사용하기  (0) 2022.07.07
[Kotlin] 함수  (0) 2022.07.07
[Kotlin] 배열과 컬렉션  (0) 2022.07.07
[Kotlin] Data, Enum, Sealed 클래스  (0) 2022.07.06
[Kotlin] 중첩 클래스를 다루는 방법  (0) 2022.07.06