본문 바로가기

Swift/Swift Language

Swift 언어 가이드 - 클로져는 참조 타입이다

클로져는 참조 타입이다

클로져 값 캡쳐링에서 봤던 예제를 다시 살펴 보겠습니다.

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
  var runningTotal = 0
    func incrementer() -> Int {
    total += amount
    return total
  }
  return incrementer
}

let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven() // 7을 반환
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen() // 40을 반환

위 예제에서, incrementBySevenincrementByTen 은 상수입니다. 하지만 이 상수들이 참조하는 클로져는runningTotal 변수를 증가합니다. 왜냐하면 함수와 클로져는 참조 타입(reference types) 이기 때문입니다.

함수나 클로져를 변수나 상수에 할당하면, 이것은 함수나 클로져에 참조를 만드는 것과 같습니다. 위 예제에서는, incrementByTen이 가리키는 클로져는 상수입니다. 이것은 클로져 자체가 아닙니다.

여러분이 두 개의 다른 상수나 변수에 어떤 하나의 클로져를 할당하면, 이 둘의 상수 혹은 변수는 같은 클로져를 가리킨다는 것입니다.

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen() // 50을 반환
IncrementByTen() // 60을 반환

이 예제는 alsoIncrementByTen을 호출하는 것이 결국 incrementByTen 을 호출하는 것과 같음을 보여줍니다. 왜냐하면 두 상수 모두 같은 클로져를 가리키고 있기 때문이므로 이 두 상수는 같은 runningTotal 을 증가하여 반환합니다.

 


원문 : https://docs.swift.org/swift-book/LanguageGuide/Closures.html