코드를 가장 간결하게 짜는 방식이 lambda 식을 이용한게 아닐까 싶다..
내가 그렇게 어려워하면서도 제대로 공부 안 했던 그녀석(?)..드디어 나타난 람다식..!!!
이번에 kotlin 다시 공부하면서 제대로 공부해보자!
Lambda expression의 문법
Lambda expression은 다음과 같이 쓸 수 있다.
fun main() {
println({ text: String -> text.uppercase() }("hello")) // HELLO 출력
}
이 Lambda expression은 hello라는 String을 대문자로 바꿔주는 역할을 한다.
하나하나 분석해보면
우선, 람다 식은 {}안에 쓰인다.
->를 기준으로 왼쪽에는 parameter와 그 type이, 오른쪽에는 함수 body가 쓰인다.
{ parameter -> parameter를 가지고 작업한 내용}(parameter에 넣어줄 값)의 형태가 되는 것이다.
만약 람다식을 parameter 없이 선언할 경우, ->를 사용할 필요가 없다.
{ println("message") }와 같이 단순히 body 선언만 해줘도 된다.
람다 식은 parameter를 받는 순간 invoke되어 실행된다.
Lambda expression을 변수에 할당하기
람다식을 변수에 할당하고 함수처럼 호출해서 사용할 수 있다.
단순히 =을 사용해 변수에 할당해주면 된다.
fun main() {
val lambdaExp = { text: String -> text.uppercase() }
println(lambdaExp("hello")) // HELLO 출력
}
다른 함수에 적용하기
lambda expression을 다른 함수에 바로 넘겨 사용할 수도 있다.
filter()나 map() 함수가 그렇다.
1. filter
val numbers = listOf(1, -2, 3, -4, 5, -6)
val positives = numbers.filter { x -> x > 0 }
이런 방식으로 filter 함수에 바로 람다식을 넘겨 조건을 걸어줄 수 있다.
numbers 리스트의 각 원소에 대해 0보다 큰 경우만 필터링한다.
2. map
val n = listOf(1, -2, 3, -4, 5, -6)
val doubled = n.map{ x -> x * 2 }
map도 마찬가지로 람다식을 바로 적용할 수 있다.
n 리스트의 각 원소를 2배해서 doubled 리스트로 반환하게 된다.
함수 type 지정하기
함수의 return type을 명시적으로 지정해줄 수도 있다.
val n = { ... } 방식으로 적혀진 람다 식이 있다면,
val n : (String) -> String = { ... } 과 같이 형식을 지정할 수 있다.
'()'안에는 parameter의 type이고, '->' 다음은 return type이다.
val lambdaExp: (String) -> String = { text -> text.uppercase() }
여기서 주의할 점은, 함수 type을 위처럼 명시적으로 지정하든, lambda expression 내에서 parameter의 타입을 지정(val lambdaExp = { text:String -> text.uppercase() }와 같이)해주든 해야 한다는 것이다.
반드시 type을 정의해줘야 컴파일 에러가 발생하지 않는다.
함수에서 lambda expression 리턴하기
함수에서 리턴하는 것이 람다 식이 될 수 있다. 어떤 람다 식이 리턴될지 컴파일러가 알 수 있도록 함수 type을 지정해줘야만 한다.
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")
}
toSeconds()라는 함수는 time이라는 String을 인자로 받고, when(time){ ... }에 따라 람다 식을 리턴한다.
이때, 람다식은 (Int) -> Int이기 때문에 매개변수 타입 Int와 리턴 타입 Int를 갖는다.
Trailing lambda
lambda expression이 함수의 유일한 매개변수이면 함수 괄호()를 쓰지 않아도 된다.
또한, lambda expression이 함수 매개변수의 마지막이라면, 함수 괄호() 밖에 써도 된다.
예를 들어, fold()함수를 보면 다음과 같다.
println(listOf(1, 2, 3).fold(0, { x, item -> x + item })) // 6
// trailing lambda 적용
println(listOf(1, 2, 3).fold(0) { x, item -> x + item }) // 6
'CS > Kotlin' 카테고리의 다른 글
[Kotlin 문법] 9. Null Safety (0) | 2024.06.13 |
---|---|
[Kotlin 문법] 8. Class (1) | 2024.06.12 |
[Kotlin 문법] 6. 함수 - Unit, default parameter value, single-expression, named argument (1) | 2024.06.07 |
[Kotlin 문법] 5. loop - range, for, while (0) | 2024.06.07 |
[Kotlin 문법] 4. 조건문 - if, when (0) | 2024.06.07 |