0Pricing
Swift Academy · 강의

클로저 캡처 목록과 [weak self]

캡처 목록을 사용해 클로저가 객체를 강하게 캡처하지 않도록 합니다.

클로저 캡처 목록과 [weak self]은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

환영합니다

클로저는 자신을 둘러싼 범위의 변수를 캡처합니다. 캡처 목록(`[weak self]`, `[unowned self]`, `[value]`)을 사용하면 이러한 캡처가 정확히 어떤 방식으로 이루어질지 제어할 수 있습니다.

기본 강한 캡처

```swift var name = "Alice" let greet = { print("Hello, \(name)") } name = "Bob" greet() // "Hello, Bob" — closure sees current value ``` 기본적으로 클로저는 변수에 대한 *참조*를 캡처합니다.

캡처 목록 기초

```swift var count = 10 let snapshot = { [count] in print(count) } // captures value count = 99 snapshot() // 10 — snapshot of count at capture time ``` `[]` 안에 값 유형을 나열하면 클로저가 생성되는 순간 해당 값이 복사됩니다.

[weak self] 패턴

```swift class API { func fetch(completion: @escaping () -> Void) { ... } } class VC { func load() { api.fetch { [weak self] in guard let self else { return } // self might be nil by now self.updateUI() } } } ```

수명이 연장된 guard let self

Swift 5.3 이상에서는 shadowing 없이 guard 내부에서 `self`를 다시 바인딩할 수 있습니다: ```swift { [weak self] in guard let self else { return } // 'self' is now strong within this block doA() doB() doC() } ```

비소유 self를 사용해도 안전한 경우

```swift button.addTarget(self, action: #selector(tap), for: .touchUpInside) // If the button's closure is guaranteed not to outlive self: let action: () -> Void = { [unowned self] in self.handleTap() } ```

여러 값 캡처하기

```swift let base = 100 let multiplier = 2 let compute = { [base, multiplier] in base * multiplier } print(compute()) // 200 ``` 같은 목록에서 여러 값을 캡처할 때는 쉼표로 구분하십시오.

이름이 지정된 바인딩과 함께 사용하는 캡처 목록

```swift let myService = service // rename in capture list: let handler = { [service = myService] in service.process() } ``` 특정 시점의 값을 새 이름으로 캡처할 때 유용합니다.

탈출 클로저와 비탈출 클로저 비교

• `@escaping` 클로저는 저장해 두었다가 함수가 반환된 후에도 호출할 수 있음 → 순환이 발생할 위험이 있음 • 비탈출 클로저는 함수가 반환되기 전에 호출됨 → 순환이 발생할 위험이 없음 ```swift func apply(_ f: () -> Void) { f() } // non-escaping, no [weak] needed func later(_ f: @escaping () -> Void) { queue.async { f() } } // escaping ```

캡처 문제 디버깅

순환이 의심된다면: 1. 클래스에 `deinit { print("deallocated") }` 추가 2. 다른 화면으로 이동하거나 인스턴스를 nil로 설정 3. deinit이 출력되지 않으면 → 순환이 존재함 그런 다음 해당 클래스의 클로저에 `[weak self]`를 추가하십시오.

빠른 확인

캡처 목록의 `[weak self]`는 어떤 동작을 합니까?

복습

핵심 내용: • 클로저는 기본적으로 참조를 캡처함 • 캡처 목록 `[value]`는 생성 시점에 값 유형을 복사함 • `[weak self]` — 참조를 유지하지 않고 자동으로 nil이 되며 `guard let self` 사용 • `[unowned self]` — 참조를 유지하지 않으며 nil에 안전하지 않음 • `@escaping` 클로저에는 캡처 목록이 필요하지만, 비탈출 클로저에는 일반적으로 필요하지 않음 과정을 모두 마쳤습니다! 다음 주제: Swift의 함수형 프로그래밍

자주 묻는 질문

“클로저 캡처 목록과 [weak self]” 강의는 무료인가요?

네 — “클로저 캡처 목록과 [weak self]” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“클로저 캡처 목록과 [weak self]”에서 뭘 배우나요?

캡처 목록을 사용해 클로저가 객체를 강하게 캡처하지 않도록 합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“클로저 캡처 목록과 [weak self]” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ARC의 참조 수 계산 방식
  2. 참조 순환: 원인과 탐지
  3. weak 및 unowned 참조
  4. 클로저 캡처 목록과 [weak self]
← Swift Academy(으)로 돌아가기