본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 45] 람다의 중요성

프로그래밍에 중요한 능력을 부여해주는 람다

 

 

람다는 문법 설탕처럼 보일 수 있는데, 사실상 중요한 능력을 부여해 준다고 한다.

람다가 어떤 능력을 부여해 주는지 이번 아톰에서 학습할 예정이다.

 


 

[ 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