[TIL] 쓰레드와 동기/비동기

Eden·2025년 7월 8일

Swift에서의 쓰레드(Thread), 동기(Synchronous), 비동기(Asynchronous) 개념은 앱의 성능과 사용자 경험에 큰 영향을 미칩니다.
적절한 이해와 활용은 UI 멈춤 현상 없이 효율적인 동작을 구현하는 데 핵심적입니다.


1. 쓰레드(Thread)란?

  • 실행 중인 프로그램에서 독립적으로 작업을 수행할 수 있는 최소 실행 단위
  • Swift는 기본적으로 메인 쓰레드(Main Thread)에서 대부분의 코드가 실행됨
  • 메인 쓰레드는 UI 처리 전용이며, 무거운 작업은 별도의 백그라운드 쓰레드에서 실행해야 함

2. GCD (Grand Central Dispatch)

Swift에서 쓰레드를 효율적으로 다루기 위해 사용하는 API
비동기 처리, 병렬 처리, 지연 처리 등을 지원

주요 큐 종류

큐 이름설명
mainUI 업데이트는 반드시 이 큐에서 실행
global백그라운드에서 작업 처리 (QoS에 따라 우선순위 지정 가능)
custom필요한 경우 직접 생성 가능 (serial or concurrent)

예시

DispatchQueue.global().async {
    // 백그라운드 작업
    let result = heavyTask()

    DispatchQueue.main.async {
        // UI 업데이트
        updateUI(with: result)
    }
}

3. 동기(Synchronous) vs 비동기(Asynchronous)

구분설명특징
동기작업이 끝날 때까지 기다림코드 순서대로 실행됨
비동기작업을 백그라운드에서 수행하고 즉시 다음 코드 실행비순차적 실행 가능

예시

// 동기
print("A")
doSomethingSync()  // 작업 끝날 때까지 대기
print("B")

// 비동기
print("A")
DispatchQueue.global().async {
    doSomethingAsync()
}
print("B")  // 먼저 출력됨

4. async/await (Swift 5.5 이상)

비동기 작업을 보다 간결하고 직관적으로 표현 가능

func fetchData() async throws -> String {
    let (data, _) = try await URLSession.shared.data(from: url)
    return String(data: data, encoding: .utf8) ?? ""
}

Task {
    let result = try await fetchData()
    print(result)
}

5. 주의사항

  • UI 작업은 반드시 DispatchQueue.main.async에서 실행
  • 무거운 작업은 global 큐나 Task 등을 활용
  • 동기 함수는 메인 쓰레드에서 사용 시 UI 멈춤을 유발할 수 있음

결론

Swift에서 쓰레드와 동기/비동기 처리를 적절히 사용하는 것은 성능과 UX 향상에 필수적입니다.
GCD, async/await 등을 활용하여 안전하고 효율적인 코드 구성이 중요합니다.

profile
iOS Dev

0개의 댓글