Kotlin

[Kotlin] lambda 와 higher-order function

노소래 2021. 8. 3. 16:04

- lambda

 

람다는 함수를 만드는 expression 이다.

함수의 이름을 정의하지 않는다. 이름 없이 함수를 사용할 수 있다. 그래서 anonymous function 이라고도 불린다.

람다는 데이터로 전달될 수 있다.  

 

var dirtyLevel = 20
val waterFilter = { dirty : Int -> dirty / 2}
println(waterFilter(dirtyLevel))

 

위와 같이 람다를 정의할 수 있는데 -> 왼쪽에는 parameter 가 있고 뒤에는 return 이 있다. 함수를 가지는 변수를 만들고 호출할 수도 있다. 

 

val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }

 

위와 같이 type 도 더 명확하게 지정해줄 수 있다.

 

- higher-order function

 

람다를 다른 함수에 전달함으로서 higher-order function 을 만들 수 있다. higher-order function 에는 대표적으로 filter 와 map 이 있다. 

 

fun main () {
    val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }
    println(updateDirty(30, waterFilter))
    println("-------")
    println(updateDirty(30) { dirty ->
        dirty / 2
    })
    println("-------")
    println(updateDirty(30) { 
        it / 2
    })
}

fun updateDirty(dirty: Int, operation: (Int) -> Int): Int {
    return operation(dirty)
}


// 모든 결과가 15로 동일하게 나온다.

 

람다를 함수의 parameter type 으로 지정하고 argument 로 사용하고 있다.

람다가 아닌 인자와 반환이 같은 regular named function 을 전달해도 된다. 다만 :: 연산자를 앞에 뭍여서 regular function 임을 알린다.  아래는 이 내용이 추가된 코드이다. 

 


fun main () {
    val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }
    println(updateDirty(30, waterFilter))
    println("-------")
    println(updateDirty(30) { dirty -> dirty / 2 })
    println("-------")
    println(updateDirty(30) { it / 2 })
    println("-------")
    println(updateDirty(30, ::increaseDirty))
}

fun updateDirty(dirty: Int, operation: (Int) -> Int): Int {
    return operation(dirty)
}

fun increaseDirty( start: Int ) = start + 1

 

추가로 위 코드에서 updateDirty(30) { dirty -> dirty / 2 } 나 updateDirty(30) { it / 2 } 처럼 람다를 괄호 밖으로 빼주는 것을 last parameter call syntax 라고 부른다.

 

 

lambda, higher-order function 의 대표 예시라고 볼 수 있는 scope function 에 대해 더 자세히 알고 싶다면 아래 링크를 확인하면 좋겠다.

https://nosorae.tistory.com/26

 

[Kotlin] lambda 와 scope function

- 람다 만드는 방법 인자 -> 반환 에서 인자를 () 안에 적는 것도 가능하고, 객체.() -> 반환 도 가능하다. 반환이 없으면 Unit 을적어주면 된다. 아래 코드를 보자 with 함수와 유사하게 myWith 를 만들

nosorae.tistory.com

 

-출처 : codelabs