아이템 2: 변수의 스코프를 최소화하라에서 나온 내용
람다 또는 익명 함수와 같은 클로저가 외부 스코프에 있는 변수를 포착하고 이를 내부에서 사용할 수 있는 기능을 말한다.
이로 인해 특정 스코프 내에서 정의된 변수를 람다나 익명 함수가 접근하고 수정할 수 있게 된다. 이를 "변수 캡처링"이라고도 한다.
람다가 외부 변수를 캡처
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
}
코틀린의 캡처링은 람다와 익명 함수가 외부 스코프의 변수를 포착하고 이를 내부에서 사용할 수 있게 해주는 기능이다.
이는 함수형 프로그래밍에서 매우 유용하며, 고차 함수와 결합될 때 강력한 도구가 된다.
하지만 성능 문제와 예기치 않은 부작용에 주의해야 한다.