반응형
람다
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으로 직접 참조할 수 있다.
(비추천, 사용하는 쪽에서 어떤 데이터인지 모른다.)
- 람다를 작성할 때, 람다의 파라미터를 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 |