🔥 소개

322자
5분

프로그래밍 언어가 발전함에 따라 동시성(Concurrency)을 지원하는 것은 필수불가결한 요소가 되었습니다. 현대의 프로그램들은 복잡한 작업을 수행하면서 사용자에게 빠른 응답성을 제공해야 하기 때문이죠. 이러한 상황 속에서 Swift는 구조화된 방식으로 비동기 코드와 병렬 코드를 작성할 수 있도록 언어 차원에서 지원을 아끼지 않고 있습니다.

비동기 코드(Asynchronous code)는 일시 중단되었다가 나중에 다시 재개될 수 있지만, 한 번에 하나의 코드 조각만 실행됩니다. 프로그램에서 코드를 일시 중단하고 재개하면 네트워크를 통해 데이터를 가져오거나 파일을 파싱하는 등의 장기 실행 작업을 계속 수행하면서도 UI 업데이트와 같은 단기 작업을 계속 진행할 수 있습니다.

병렬 코드(Parallel code)는 여러 코드 조각이 동시에 실행된다는 것을 의미합니다. 예를 들어, 4개의 코어를 가진 컴퓨터는 각 코어가 하나의 작업을 수행하면서 4개의 코드 조각을 동시에 실행할 수 있죠. 병렬 및 비동기 코드를 사용하는 프로그램은 한 번에 여러 작업을 수행하고, 외부 시스템을 기다리는 작업을 일시 중단합니다.

하지만 병렬 또는 비동기 코드에서 얻을 수 있는 추가적인 스케줄링 유연성에는 복잡성 증가라는 비용이 따릅니다. Swift에서는 컴파일 시간에 일부 검사를 수행할 수 있는 방식으로 개발자의 의도를 표현할 수 있게 해줍니다. 예를 들어, 액터(Actor)를 사용하여 변경 가능한 상태에 안전하게 액세스할 수 있습니다. 그러나 느리거나 버그가 있는 코드에 동시성을 추가한다고 해서 빠르고 정확해진다는 보장은 없습니다. 오히려 동시성을 추가하면 코드를 디버깅하기가 더 어려워질 수도 있어요.

하지만 동시성이 필요한 코드에서 Swift의 언어 수준 동시성 지원을 사용하면 컴파일 타임에 문제를 잡는 데 도움이 됩니다. 물론 Swift의 언어 지원 없이 동시성 코드를 작성하는 것도 가능하지만, 그런 코드는 읽기가 더 어려운 경향이 있죠. 아래 코드를 보시면,

listPhotos(inGallery: "Summer Vacation") { photoNames in
    let sortedNames = photoNames.sorted()
    let name = sortedNames[0]
    downloadPhoto(named: name) { photo in
        show(photo)
    }
}
swift

사진 이름 목록을 다운로드하고, 해당 목록에서 첫 번째 사진을 다운로드한 다음, 사용자에게 해당 사진을 보여주는 간단한 경우에도 일련의 완료 핸들러로 작성해야 하기 때문에 중첩된 클로저를 작성하게 됩니다. 이러한 방식으로는 깊이 중첩된 더 복잡한 코드는 금방 다루기 힘들어질 수 있어요.

Swift의 동시성 지원은 이러한 문제를 해결하고, 보다 명확하고 이해하기 쉬운 코드를 작성할 수 있게 도와줍니다. 이제 Swift와 함께 동시성의 세계로 뛰어들 준비가 되셨나요? 그럼 Swift가 어떻게 동시성을 지원하는지 자세히 살펴보도록 합시다!