🔥 클로저는 참조 타입
클로저는 함수와 마찬가지로 참조 타입(Reference Type)이에요. 이게 무슨 뜻일까요? 예제를 통해 함께 알아보도록 해요.
var runningTotal = 0 let incrementBySeven = { runningTotal += 7 } let incrementByTen = { runningTotal += 10 } incrementBySeven() // runningTotal은 이제 7이 됩니다. incrementByTen() // runningTotal은 이제 17이 됩니다.
swift
위 코드에서 incrementBySeven
과 incrementByTen
은 상수로 선언되었지만, 이 상수들이 참조하는 클로저는 여전히 runningTotal
변수를 증가시킬 수 있어요. 이는 함수와 클로저가 참조 타입이기 때문이에요.
함수나 클로저를 상수나 변수에 할당할 때마다, 사실은 그 상수나 변수가 함수나 클로저를 '참조'하도록 설정하는 거예요. 위 예제에서 incrementByTen
이 '참조하는' 클로저의 선택은 상수이지만, 클로저 자체의 내용은 상수가 아니랍니다.
이는 또한 클로저를 두 개의 서로 다른 상수나 변수에 할당하면, 그 두 상수나 변수 모두 동일한 클로저를 참조한다는 것을 의미해요.
let alsoIncrementByTen = incrementByTen // alsoIncrementByTen도 incrementByTen과 동일한 클로저를 참조합니다. alsoIncrementByTen() // runningTotal은 이제 27이 됩니다. incrementByTen() // runningTotal은 이제 37이 됩니다.
swift
위 예제는 alsoIncrementByTen
을 호출하는 것이 incrementByTen
을 호출하는 것과 같다는 걸 보여주네요. 둘 다 동일한 클로저를 참조하기 때문에, 둘 다 동일한 실행 중인 총계를 증가시키고 반환해요.
이를 그림으로 나타내면 다음과 같아요:
incrementBySeven incrementByTen | | | | v v +---------+------+ +---------+------+ | runningTotal | | runningTotal | | += 7 | | += 10 | +----------------+ +----------------+
text
incrementBySeven
과 incrementByTen
은 서로 다른 클로저를 가리키지만, 둘 다 같은 runningTotal
변수를 캡처하고 있어요.
이렇게 클로저가 참조 타입이라는 특성은 코드를 더 유연하고 표현력 있게 만드는 데 도움이 된답니다. 클로저를 함수의 인자로 전달하거나, 다른 클로저 내에서 클로저를 반환하는 등 다양한 패턴을 구현할 수 있게 해주죠.
클로저의 참조 타입 특성을 잘 이해하고 활용한다면 더 강력하고 표현력 있는 Swift 코드를 작성할 수 있습니다.