0Pricing
Swift Academy · 강의

이스케이핑 클로저

함수보다 오래 유지되는 클로저를 저장합니다.

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

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

기본적으로 클로저 매개변수는 비탈출입니다. 함수가 반환되기 전에 호출되어야 합니다. 나중에 저장하고 호출할 수 있다면 @escaping으로 표시하세요.

비탈출 클로저

이 클로저는 동기적으로 실행되고 함수가 반환되면 사라집니다:

func run(_ work: () -> Void) {
    work()
}
run { print("done now") }  // "done now"

@escaping이 필요한 이유

나중에 사용하기 위해 클로저를 저장하려면 @escaping이 필요합니다:

var handlers: [() -> Void] = []
func register(_ handler: @escaping () -> Void) {
    handlers.append(handler)  // escapes the function
}
register { print("later") }
handlers[0]()  // "later"

비동기 작업과 함께 탈출하기

완료 핸들러는 함수가 반환된 후에 실행되므로 탈출합니다:

func load(then completion: @escaping (String) -> Void) {
    // imagine async work
    completion("data")
}
load { result in print(result) }  // "data"

self는 명시적으로 작성해야 합니다

탈출 클로저 안에서 인스턴스 멤버에 접근할 때는 self.를 명시적으로 작성해야 합니다 — 클로저가 self를 유지할 수 있음을 알려 주는 표시입니다.

탈출 클로저에서 self를 명시하기

컴파일러는 명시적인 참조를 요구합니다:

class Loader {
    var name = "L"
    func start(_ done: @escaping () -> Void) {
        let cb = { print(self.name); done() }
        cb()
    }
}
Loader().start { print("finished") }  // "L" then "finished"

여러 콜백 저장하기

탈출 클로저를 사용하면 관찰자 목록을 만들 수 있습니다:

class Emitter {
    private var listeners: [(Int) -> Void] = []
    func on(_ l: @escaping (Int) -> Void) { listeners.append(l) }
    func fire(_ v: Int) { listeners.forEach { $0(v) } }
}
let e = Emitter()
e.on { print("got \($0)") }
e.fire(7)  // "got 7"

저장된 클로저 반환하기

속성에 보관된 클로저는 탈출 클로저입니다:

class Button {
    var action: (() -> Void)?
    func setAction(_ a: @escaping () -> Void) { action = a }
}
let b = Button()
b.setAction { print("tapped") }
b.action?()  // "tapped"

선택적 클로저는 탈출합니다

선택적 클로저 매개변수는 암시적으로 탈출합니다(Optional로 감싸지기 때문입니다). 따라서 저장할 수 있습니다:

func maybe(_ f: (() -> Void)?) {
    f?()
}
maybe { print("ran") }  // "ran"

작업 배열로 탈출하기

나중에 실행할 작업을 저장하는 큐는 전형적인 탈출 사용 사례입니다 — 각 클로저를 저장한 다음 나중에 실행합니다:

var tasks: [() -> Int] = []
func schedule(_ task: @escaping () -> Int) {
    tasks.append(task)
}
schedule { 1 + 1 }
schedule { 10 * 2 }
print(tasks.map { $0() })  // [2, 20]

성능 참고

비탈출 클로저는 더 적극적으로 최적화할 수 있습니다(힙 할당이 필요하지 않음). 가능하면 클로저를 비탈출로 유지하고, 실제로 저장하거나 실행을 미뤄야 할 때만 탈출시키세요.

func sum(_ xs: [Int], _ f: (Int) -> Int) -> Int {
    xs.reduce(0) { $0 + f($1) }   // non-escaping, fast
}
print(sum([1, 2, 3]) { $0 * $0 })  // 14

빠른 확인

클로저 매개변수에 @escaping을 표시해야 하는 경우는 언제인가요?

복습

탈출 클로저에 대해 배웠습니다:

  • 비탈출이 기본값이며, 클로저는 함수가 반환되기 전에 실행됩니다
  • 클로저를 저장하거나 실행을 미루려면 @escaping이 필요합니다
  • 탈출 클로저에서는 self.에 명시적으로 접근해야 합니다
  • 선택적 클로저 매개변수는 암시적으로 탈출하므로, 속도를 위해 비탈출 방식을 우선하세요

다음: 캡처 목록과 weak self

자주 묻는 질문

“이스케이핑 클로저” 강의는 무료인가요?

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

“이스케이핑 클로저”에서 뭘 배우나요?

함수보다 오래 유지되는 클로저를 저장합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“이스케이핑 클로저” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 참조로 값 캡처하기
  2. 이스케이핑 클로저
  3. 캡처 목록과 약한 self
  4. 자동 클로저
← Swift Academy(으)로 돌아가기