🔥 클로저는 참조 타입

260자
4분

클로저는 함수와 마찬가지로 참조 타입(Reference Type)이에요. 이게 무슨 뜻일까요? 예제를 통해 함께 알아보도록 해요.

var runningTotal = 0
 
let incrementBySeven = {
    runningTotal += 7
}
 
let incrementByTen = {
    runningTotal += 10
}
 
incrementBySeven() // runningTotal은 이제 7이 됩니다.
incrementByTen() // runningTotal은 이제 17이 됩니다.
swift

위 코드에서 incrementBySevenincrementByTen은 상수로 선언되었지만, 이 상수들이 참조하는 클로저는 여전히 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

incrementBySevenincrementByTen은 서로 다른 클로저를 가리키지만, 둘 다 같은 runningTotal 변수를 캡처하고 있어요.

이렇게 클로저가 참조 타입이라는 특성은 코드를 더 유연하고 표현력 있게 만드는 데 도움이 된답니다. 클로저를 함수의 인자로 전달하거나, 다른 클로저 내에서 클로저를 반환하는 등 다양한 패턴을 구현할 수 있게 해주죠.

클로저의 참조 타입 특성을 잘 이해하고 활용한다면 더 강력하고 표현력 있는 Swift 코드를 작성할 수 있습니다.