Effective Kotlin - 캡쳐링(capturing)이란?

JINHO LEE·2024년 6월 24일
0

아이템 2: 변수의 스코프를 최소화하라에서 나온 내용

캡쳐링(Capturing) 이란?

람다 또는 익명 함수와 같은 클로저가 외부 스코프에 있는 변수를 포착하고 이를 내부에서 사용할 수 있는 기능을 말한다.
이로 인해 특정 스코프 내에서 정의된 변수를 람다나 익명 함수가 접근하고 수정할 수 있게 된다. 이를 "변수 캡처링"이라고도 한다.

캡처링의 예시

람다가 외부 변수를 캡처

fun main() {
    var counter = 0 // 외부 변수

    val incrementCounter = {
        counter++ // 외부 변수를 캡처하고 수정
    }

    incrementCounter()
    incrementCounter()

    println(counter) // 출력: 2
}

이 예시에서 람다 incrementCounter는 외부 변수 counter를 캡처하여 람다 내부에서 이 변수를 증가시킬 수 있다.

읽기 전용 변수 캡처

fun main() {
    val greeting = "Hello" // 읽기 전용 변수

    val printGreeting = {
        println(greeting) // 외부 변수를 캡처하고 사용
    }

    printGreeting() // 출력: Hello
}

캡처링의 주의점

변경 가능한 변수 (var) 캡처

  • 변경 가능한 변수를 캡처할 때 주의해야 한다. 람다나 익명 함수 내에서 변수를 수정하는 것은 예상치 못한 부작용을 일으킬 수 있다.

성능 문제

  • 람다와 익명 함수는 외부 변수를 캡처할 때 추가 메모리 할당과 같은 성능 비용이 발생할 수 있다. 따라서 성능이 중요한 경우 이러한 점을 고려해야 한다.

고차 함수와 캡처링

함수가 다른 함수를 인자로 받거나 함수를 반환할 수 있게 해준다. 람다와 캡처링은 고차 함수와 결합될 때 매우 강력해진다.

fun main() {
    fun makeIncrementer(): () -> Int {
        var counter = 0 // 외부 변수

        return {
            counter++ // 외부 변수를 캡처하고 수정
        }
    }

    val incrementer = makeIncrementer()

    println(incrementer()) // 출력: 0
    println(incrementer()) // 출력: 1
}

요약

코틀린의 캡처링은 람다와 익명 함수가 외부 스코프의 변수를 포착하고 이를 내부에서 사용할 수 있게 해주는 기능이다.
이는 함수형 프로그래밍에서 매우 유용하며, 고차 함수와 결합될 때 강력한 도구가 된다.
하지만 성능 문제와 예기치 않은 부작용에 주의해야 한다.

0개의 댓글