Swift의 async
와 await
은 비동기 프로그래밍을 간결하고 직관적으로 작성할 수 있도록 도와주는 기능이다. 기존의 콜백 방식이나 CompletionHandler
를 사용한 비동기 코드보다 가독성이 뛰어나고, 동기 코드처럼 작성할 수 있는 장점이 있다.
async
는 해당 함수가 비동기적으로 실행될 것임을 나타낸다. async
함수는 내부에서 await
을 사용할 수 있으며, 비동기적으로 실행되지만 호출하는 측에서는 기다려야 한다.
func fetchData() async {
// 비동기 작업 수행
}
await
은 비동기 함수 내부에서 사용되어 특정 비동기 작업의 완료를 기다린다. await
을 사용하면 해당 작업이 끝날 때까지 기다린 후, 결과 값을 반환받아 이후 로직을 실행할 수 있다.
func fetchData() async {
let data = await someAsyncFunction()
print(data)
}
위 코드에서 someAsyncFunction()
은 비동기 함수이며, await
키워드를 사용해 결과가 반환될 때까지 기다린 후 data
에 저장된다.
비동기 코드의 장점은 작업이 완료될 때까지 기다리는 동안 다른 작업을 수행할 수 있어 프로그램의 성능을 최적화할 수 있다는 점이다. 아래 예제에서 동기와 비동기 코드의 차이를 비교할 수 있다.
func loadData() {
let result = fetchSyncData() // 데이터가 반환될 때까지 기다림
print(result)
}
func loadData() async {
let result = await fetchAsyncData() // 데이터가 준비될 때까지 기다렸다가 실행
print(result)
}
func fetchDataFromAPI() async throws -> String {
let url = URL(string: "https://example.com")!
let (data, _) = try await URLSession.shared.data(from: url)
return String(data: data, encoding: .utf8) ?? "No data"
}
func loadData() async {
do {
let result = try await fetchDataFromAPI()
print(result)
} catch {
print("Error: \(error)")
}
}
위 코드에서 fetchDataFromAPI
함수는 URLSession.shared.data(from:)
을 비동기적으로 호출하여 네트워크 요청을 수행한다. await
을 사용하여 응답을 기다린 후 데이터를 처리한다.
비동기 함수는 기본적으로 동기 코드에서 직접 호출할 수 없다. async
함수는 비동기 컨텍스트에서 실행해야 한다.
Task {
await loadData()
}
비동기 함수를 호출하는 함수도 async
로 선언해야 한다.
func startFetching() async {
await loadData()
}
async
함수 내부에서만 호출할 수 있다.try
와 함께 사용하여 오류를 처리해야 한다.Swift의 async/await
은 기존의 콜백 기반 비동기 코드보다 훨씬 가독성이 좋고 직관적이다. 이를 활용하면 비동기 프로그래밍을 보다 간결하고 효과적으로 구현할 수 있다.