비동기코드를 작성하기 위한 키워드입니다. 비동기 코드로 프로그램을 작성하면, 어느 정도 시간이 걸리는 작업을 수행할 때 해당 작업이 완료되기를 기다리며 스레드를 차단하지 않고, 스레드가 다른 일을 하도록 합니다. 그러다가 수행하던 작업이 완료되면 completionHandler를 호출하여 다음 작업을 진행하게 되죠.
아래 코드는 async와 await을 사용하기 전의 비동기 코드입니다. @escaping 과 completion Handler 를 이용해 작성한 코드입니다. URLSession을 이용해 이미지를 받아와, 썸네일에 적용시키는 작업을 합니다.
위의 코드를 async
, await
을 사용하면 아래와 같이 간단하게 줄일 수 있습니다. 전에 이야기했던 1. 콜백 아도겐, 2. 에러 핸들링, 3. Top-down approach 위배 문제를 해결할 수 있습니다.
그럼 이제 async
와 await
에 대해 자세히 알아봅시다.
async
키워드가 붙는 위치는 아래와 같아요. async
키워드의 역할은, 비동기 함수임 알려주는 것입니다.
단, async 함수는 Concurrent context 내에서만 실행이 가능하다는 주의점이 있는데요. 이는 Task 혹은 async 블럭 내에서 실행이 가능하다는 말과 같습니다. 이에 대해서는 아래에서 좀 더 자세히 알아봅시다.
await
은 async 함수를 실행시키기 위해 필요한 키워드입니다.
다시 URLSession의 코드로 돌아와보면, 아래처럼 async
가 붙은 concurrenct 컨텍스트여야, await
키워드가 붙은 코드가실행될 수 있다는 말입니다. await
키워드가 붙은 걸 보면, URLSession.shared.data()
는 이미 비동기로 구현된 코드라는 것을 알 수 있겠죠?
await 키워드가 붙은 지점은 potential suspension point, 즉 잠재적 일시 중단 지점이 되는데요.
여기서 “suspend” 한다는 의미는, 해당 코드를 작업하던 스레드가 다른 작업을 실행할 수 있도록 제어권을 놓아준다는 것을 의미합니다.