App노자

[Kotlin] Closure (클로저) 본문

Android/Kotlin

[Kotlin] Closure (클로저)

앱의노예 2023. 8. 10. 20:15

1. Closure란?


클로저란 람다식으로 표현된 내부 함수에서 외부 범위에 선언된 변수에 접근할 수 있는 개념을 말한다.

람다식 또는 익명 함수는 외부 범위에서 선언된 변수를 클로저에 액세스 할 수 있으며 람다식 안의 클로저에 포획(캡처)된 변수는

람다에서 수정할 수 있다. 기본적으로 함수 안에 정의된 변수는 지역 변수로 스택에 저장되어 있다가 함수가 끝나면 같이 사라지는데

클로저 개념에서는 포획한 변수는 참조가 유지되어 함수가 종료되어도 사라지지 않고

함수의 변수에 접근하거나 수정할 수 있게 해 준다.

아래는 클로저의 조건이다

- final변수를 포획한 경우 변수 값을 람다식과 함께 저장한다

- final이 아닌 변수를 포획한 경우 변수를 특정 래퍼로 감싸서 나중에 변경하거나 읽을 수 있게 한다

이때 래퍼에 대한 참조를 람다식과 함께 저장한다

 

https://kotlinlang.org/docs/lambdas.html#closures

 

High-order functions and lambdas | Kotlin

 

kotlinlang.org

2. Closure 사용 방법


fun main() {

    val calc = Calc()
    var result = 0 // 외부의 변수
    calc.addNum(2,3) { x, y -> result = x + y }  // 클로저
    println(result) // 값을 유지하여 5가 출력

    filteredNames(4)

}

class Calc {
    fun addNum(a: Int, b: Int, add: (Int, Int) -> Unit) { // 람다식 add에는 반환값이 없음
        add(a, b)
    }
}

// 길이가 일치하는 이름만 반환
fun filteredNames(length: Int) {
    val names = arrayListOf("Kim", "Hong", "Go", "Hwang", "Jeon")
    val filterResult = names.filter {
        it.length == length // 바깥의 length에 접근
    }
    println(filterResult)
}

result는 var로 선언되어 있다

Calc 클래스의 메서드인 addNum()이 호출되면 result는 자신의 유효 범위를 벗어나 삭제되어야 하지만 

클로저의 개념에 의해 독립된 복사본을 갖는다

람다식에서 반환값은 Unit으로 선언되어 반환되는 값은 없지만 

result  = x + y를 result에 저장함으로써 포획된 result에 값을 저장하게 되었다

'Android > Kotlin' 카테고리의 다른 글

[Kotlin] 프로세스와 스레드  (0) 2023.08.20
[Kotlin] object 키워드  (0) 2023.08.15
[Kotlin] 코틀린 표준 라이브러리  (0) 2023.08.09
[Kotlin] by 키워드  (0) 2023.08.06
[Kotlin] 지연 초기화  (0) 2023.08.05