[swift] 주변 변수를 캡처하는 클로저
클로저는 Swift에서 강력한 기능 중 하나입니다. 클로저는 코드 블록을 나타내며, 변수와 함수를 캡처하여 사용할 수 있습니다. 이번 글에서는 주변 변수를 캡처하는 클로저에 대해 알아보겠습니다.
클로저 기본
먼저 클로저의 기본적인 사용법을 알아보겠습니다. 클로저는 {}
로 감싸집니다. 클로저 내부에서 주변 변수를 캡처하려면 in
키워드를 사용해주어야 합니다. 예시 코드를 살펴보겠습니다.
func makeIncrementer(incrementAmount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = {
total += incrementAmount
return total
}
return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 4
위의 코드에서 makeIncrementer
함수는 incrementAmount
값을 받아 total
변수와 클로저를 생성한 뒤 클로저를 반환합니다. 클로저는 total
변수를 캡처하고 있으며, 호출 될 때마다 total
값을 증가시키고 반환합니다.
값 캡처와 참조 캡처
클로저는 주변 변수를 캡처할 때, 값 타입인지 참조 타입인지에 따라 다르게 동작합니다.
- 값 캡처: 변수를 복사하여 클로저 내부에서 사용합니다. 따라서 클로저 내부에서 변수의 값을 변경해도 원본 변수에는 영향을 주지 않습니다. 값 캡처는
let
키워드를 사용하여 선언합니다.
func makeIncrementer(incrementAmount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = { [total] in
total += incrementAmount
return total
}
return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 2 (total 값은 변경되지 않음)
- 참조 캡처: 변수에 대한 참조를 캡처하여 클로저 내부에서 사용합니다. 따라서 클로저 내부에서 변수의 값을 변경하면 원본에도 영향을 줍니다. 참조 캡처는
inout
키워드를 사용하여 선언합니다.
func makeIncrementer(incrementAmount: inout Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = { [total] in
total += incrementAmount
return total
}
return incrementer
}
var amount = 2
let incrementByTwo = makeIncrementer(incrementAmount: &amount)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 4 (amount 값이 변경되어 total 증가)
정리
클로저는 Swift에서 매우 유용한 기능이며, 주변 변수를 캡처하여 사용할 수 있습니다. 값 캡처와 참조 캡처를 이용하여 클로저의 동작을 제어할 수 있습니다. 클로저를 사용하여 코드를 단순화하고 효율적으로 구현할 수 있으니, 적절한 상황에서 활용해보세요.
참고: