포스트

Swift Concurrency 개념과 사용법 총정리

Swift Concurrency의 개념과 사용법을 공식 문서를 기반으로 정리합니다.

Swift Concurrency 개념과 사용법 총정리

Swift 5.5부터 도입된 Swift Concurrency는 비동기 프로그래밍을 더욱 안전하고 효율적으로 처리할 수 있도록 설계된 시스템입니다. 공식 문서인 Swift.orgApple Developer Documentation에서 제공하는 자료를 기반으로 Swift Concurrency의 개념과 사용법을 정리합니다.

1. Swift Concurrency 개요

Swift Concurrency는 주요 개념인 async/await, Task, actor, structured concurrency 등을 포함합니다. 이를 통해 코드의 가독성을 높이고, 메모리 안전성을 보장하며, 경쟁 상태(race condition)를 최소화할 수 있습니다.

주요 특징

  • async / await 기반의 비동기 프로그래밍
  • Task 기반의 동시성 모델 지원
  • actor를 활용한 데이터 경쟁 방지
  • Structured Concurrency를 통한 안정적인 작업 관리

2. async / await

2.1 async 키워드

Swift에서 async 키워드는 해당 함수가 비동기적으로 실행된다는 것을 의미합니다.

1
2
3
func fetchData() async -> String {
    return "데이터 로드 완료"
}

2.2 await 키워드

await 키워드는 async 함수 내에서 비동기 작업이 완료될 때까지 기다리는 역할을 합니다.

1
2
3
4
func performTask() async {
    let result = await fetchData()
    print(result)
}

3. Task와 TaskGroup

Swift에서는 비동기 작업을 Task를 이용해 실행할 수 있으며, 여러 작업을 그룹화하는 TaskGroup도 제공합니다.

1
2
3
4
Task {
    let data = await fetchData()
    print(data)
}

TaskGroup 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func processMultipleTasks() async {
    await withTaskGroup(of: String.self) { group in
        group.addTask {
            return "작업 1 완료"
        }
        group.addTask {
            return "작업 2 완료"
        }

        for await result in group {
            print(result)
        }
    }
}

4. Actor

Actor는 데이터 경쟁을 방지하고, 공유된 상태를 보호하는 역할을 합니다.

1
2
3
4
5
6
7
8
9
10
11
actor Counter {
    private var value: Int = 0

    func increment() {
        value += 1
    }

    func getValue() -> Int {
        return value
    }
}

5. Structured Concurrency

Structured Concurrency를 활용하면 부모 Task 내에서 자식 Task를 안전하게 관리할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func fetchImages() async throws -> [UIImage] {
    try await withThrowingTaskGroup(of: UIImage.self) { group in
        var images: [UIImage] = []

        for url in imageUrls {
            group.addTask {
                return try await loadImage(from: url)
            }
        }

        for try await image in group {
            images.append(image)
        }

        return images
    }
}

6. 공식 문서 참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.