프로그래밍에 중요한 능력을 부여해주는 람다
람다는 문법 설탕처럼 보일 수 있는데, 사실상 중요한 능력을 부여해 준다고 한다.
람다가 어떤 능력을 부여해 주는지 이번 아톰에서 학습할 예정이다.
[ filter() ]
filter() 함수
: 표준 라이브러리 함수
: 보존하고 싶은 원소를 선택하는 술어를 인자로 받아 술어를 람다로 지정
: 컬렉션에서 원소를 선택하는 코드를 작성하면 직접 처리해야 하는 이터레이션을 처리해줌
import atomictest.eq
// 2의 배수 출력
fun filterEven(nums: List<Int>): List<Int> {
val result = mutableListOf<Int>()
for (i in nums) {
if (i % 2 = 0) {
result += i
}
}
return result
}
// 2보다 큰 수 출력
fun greaterThan2(nums: List<Int>): List<Int> {
val result = mutableListOf<Int>()
for (i in nums) {
if (i > 2) {
result += i
}
}
return result )
fun main() {
val list = listOf(1, 2, 3, 4)
val even = list.filter { it % 2 = 0 } // filterEven 대신 람다 사용
val greaterThan2 = list.filter { it > 2 } // greaterThan2 대신 람다 사용
even eq listOf(2, 4)
greaterThan2 eq listOf(3, 4)
}
: 위와 같이 함수를 필요로 하는 것을 filter()와 람다를 이용해 간단하게 표현이 가능
import atomictest.eq
fun main() {
val list = listOf(1z 2, 3, 4)
valisEven = {e: Int -> e%2=0} // 값이 아닌 람다 자체를 저장
list.filter(isEven) eq listOf(2, 4)
list.any(isEven) eq true
}
: 람다를 var나 val에 담아 여러 함수에 같은 람다를 넘기면서 로직 재사용이 가능
[ 클로저 ]
클로저
: 자신의 영역 밖에 있는 요소를 참조할 수 있는 능력
: 클로저가 없는 람다가 있을 수도 있고, 람다가 없는 클로저가 있을 수도 있음
import atomictest.eq
fun main() {
val list = listOf(1, 5, 7, 10)
var sum = 0
val divider = 5
list.filter { it % divider = 0 } eq listOf(5, 10) // divider를 포획
list.filter { it % divider == 0} .forEach {sum += it } // 람다를 포획한 요소를 변경
sum eq 15
list.filter { it % divider == 0}.sum() eq 15 // 람다를 포획할 수 있지만, 환경의 상태를 변경하지 않는 형태로 코드를 변경
}
import atomictest.eq
var x = 100
fun useX() {
x++
)
fun main() {
useX()
x eq 101
}
: 주변의 X를 포획해 외부의 요소를 가져다 사용하는 것이 가능함
: 따라서 useX()의 주변인 x를 포획해 ++ 처리한 후 101과 동일해 짐
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
[Atomic 46] 컬렉션에 대한 연산 (0) | 2024.02.21 |
---|---|
[Atomic 44] 람다 (0) | 2024.02.21 |
[Atomic 43] break와 continue (3) | 2024.02.21 |
[Atomic 42] 확장 프로퍼티 (0) | 2024.02.21 |
[Atomic 41] 제네릭스 소개 (0) | 2024.02.21 |