비동기(Asynchronous)란 한 작업이 다른 작업의 완료를 기다리지 않고 독립적으로 실행되는 것을 의미합니다. 동기(Synchronous) 방식에서는 한 작업이 완료될 때까지 다음 작업이 실행되지 않지만, 비동기 방식에서는 한 작업이 시작되면 완료 여부와 관계없이 다음 작업을 실행할 수 있습니다.
비동기 작업은 대개 네트워크 요청, 파일 입출력, 데이터베이스 쿼리 등과 같이 시간이 오래 걸리는 작업에 사용됩니다. 이러한 작업은 완료까지 시간이 오래 걸릴 수 있으므로, 동기적으로 처리하면 전체 프로그램이 작업의 완료를 기다리는 동안 멈추게 됩니다. 하지만 비동기 방식을 사용하면 한 작업이 실행되는 동안 다른 작업을 수행할 수 있어 전체적인 성능과 응답성이 향상됩니다.
비동기 작업을 처리하는 방법은 여러 가지가 있습니다. 일반적으로는 콜백(Callback) 함수, Delegate, completion 클로저,비동기/대기(Async/await) 패턴 등을 사용합니다.
1. 콜백(Callback) 함수: 비동기 작업이 완료되면 호출되는 함수를 지정하여 사용합니다. 이 함수는 주로 작업의 결과를 처리하거나 다음 작업을 수행하는데 사용됩니다. 콜백 함수는 비동기 작업의 인자로 전달되어 작업이 완료되면 호출됩니다.
3. 비동기/대기(Async/await) 패턴: 비동기 작업을 동기적으로 처리하는 것처럼 보이게 하는 문법적인 구조입니다. `async` 키워드를 함수 앞에 붙이고, 비동기 작업을 수행하는 부분에 `await` 키워드를 사용합니다. `await`는 비동기 작업이 완료될 때까지 해당 함수의 실행을 일시 중지하고, 작업이 완료되면 결과를 반환합니다.
func fetchData() async throws -> Data {
let url = URL(string: "https://api.example.com/data")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
func processData() async {
do {
let data = try await fetchData()
// 데이터 처리 로직
// ...
} catch {
// 오류 처리
// ...
}
}
Task {
await processData()
}
위의 코드는 `fetchData()` 함수에서 비동기적으로 데이터를 가져오고, `processData()` 함수에서 해당 데이터를 처리하는 예시입니다.
`fetchData()` 함수는 `async` 키워드를 사용하여 비동기 함수임을 표시하고, `await` 키워드를 사용하여 데이터를 가져오는 동안 해당 함수의 실행을 일시 중지합니다. `URLSession.shared.data(from:completionHandler:)` 메서드는 비동기 작업을 수행하며, 작업이 완료되면 `await` 키워드 다음의 코드가 실행됩니다.
`processData()` 함수도 `async` 키워드를 사용하여 비동기 함수임을 나타냅니다. `await fetchData()`를 호출하여 데이터를 비동기적으로 가져온 후 데이터를 처리하는 로직을 수행합니다.
마지막으로, `Task`를 사용하여 `processData()` 함수를 비동기적으로 실행합니다. `Task`는 비동기 작업의 실행을 관리하는 데 사용되며, `await` 키워드가 있는 함수를 실행할 때 필요합니다.
위의 예시 코드에서는 URL 세션을 사용하여 데이터를 가져오지만, 비동기/대기 패턴은 다른 비동기 작업에도 적용될 수 있습니다.
'Swift랑 친해지기 > Swift문법정리' 카테고리의 다른 글
[Swift] convenience init (보조 이니셜라이저) (0) | 2023.08.03 |
---|---|
Cocoa Touch FrameWork,Foundation,UIKit,MVC 패턴, UIView, ViewController (0) | 2022.09.27 |
[Swift] 고차함수 (map,filter,reduce) (0) | 2022.09.27 |
[Swift] try-catch (에러처리) (0) | 2022.09.27 |
[Swift] 열거형 (Enum) (1) | 2022.09.22 |