[swift] 클로저의 탈출(escape) 기능

클로저는 스위프트에서 강력한 기능 중 하나로, 코드 블록을 변수에 할당하거나 함수의 인자로 전달할 수 있습니다. 대부분의 경우, 클로저는 함수 내에서 정의되고 사용된 후에 종료됩니다. 하지만, 클로저가 함수를 “탈출”하는 경우도 있습니다. 이번 글에서는 클로저의 탈출 기능에 대해 자세히 알아보겠습니다.

탈출 클로저란?

탈출 클로저는 이름 그대로, 함수가 종료된 후에도 변수나 인자로 전달된 클로저가 계속해서 실행될 수 있는 클로저입니다. 이는 클로저가 함수 외부에서도 사용될 수 있다는 의미입니다. 주로 비동기 작업 처리나 함수를 비동기적으로 호출할 때 사용됩니다.

아래는 탈출 클로저를 사용한 예제 코드입니다.

typealias Callback = () -> Void

func doSomethingAsync(completion: @escaping Callback) {
    DispatchQueue.global().async {
        // 비동기 작업 처리
        // 작업이 완료되면 completion 클로저 호출
        completion()
    }
}

func main() {
    doSomethingAsync {
        print("비동기 작업 완료")
    }
    print("main 함수 종료")
}

main()

위 코드에서 doSomethingAsync 함수는 비동기 작업을 처리하고, 작업이 완료된 후 completion 클로저를 호출하는 함수입니다. completion 클로저는 main 함수 내에서 전달되어 실행됩니다. main 함수는 클로저 실행이 끝나면 종료되기 때문에, 클로저는 main 함수가 종료된 후에 실행되는 것을 확인할 수 있습니다.

@escaping 키워드

탈출 클로저를 사용하기 위해서는 @escaping 키워드를 클로저 매개변수 타입 앞에 명시해야 합니다. 이 키워드는 해당 클로저 매개변수가 함수 외부에서도 계속해서 사용될 수 있음을 나타냅니다.

아래는 @escaping 키워드가 사용된 예제 코드입니다.

typealias Callback = () -> Void

func doSomethingAsync(completion: @escaping Callback) {
    DispatchQueue.global().async {
        // 비동기 작업 처리
        // 작업이 완료되면 completion 클로저 호출
        completion()
    }
}

func main() {
    let callback: Callback = {
        print("비동기 작업 완료")
    }
    doSomethingAsync(completion: callback)
    print("main 함수 종료")
}

main()

위 코드에서는 main 함수 내에서 callback이라는 클로저가 먼저 생성되고, 이후에 doSomethingAsync 함수에 전달되고 있습니다. @escaping 키워드를 사용함으로써, doSomethingAsync 함수 외부에서도 callback 클로저가 유효하게 되었습니다.

정리

클로저의 탈출 기능은 스위프트에서 강력한 기능 중 하나입니다. 비동기 작업 처리나 함수 호출 시 유용하게 사용될 수 있습니다. 탈출 클로저를 사용하려면 @escaping 키워드를 이용하여 클로저 매개변수를 명시해야 합니다. 이를 통해 클로저가 함수 외부에서도 계속 실행될 수 있음을 나타냅니다.

탈출 클로저의 활용은 스위프트 언어의 많은 부분에서 볼 수 있기 때문에, 적절한 상황에서 해당 기능을 잘 이용할 수 있도록 공부해보시길 바랍니다.