Programming Languages/Swift

Concurrency

꼰대코더 2025. 12. 26. 23:51

1️⃣ Swift Concurrency 개요

무엇이 추가되었나?

  • Swift 5.5: async / await 도입
  • Swift 6: 데이터 레이스 없는 동시성을 컴파일러가 보장

왜 중요한가?

  • UI 멈춤 방지
  • 네트워크 / 계산 작업과 UI를 동시에 처리
  • Swift 6 모드에서 안전한 동시성 강제

2️⃣ 핵심 개념 정리

Asynchronous (비동기)

  • 작업을 중단(suspend) 했다가 재개(resume)
  • 기다리는 동안 다른 작업 가능
  • ⏱ 시간은 그대로지만 앱이 멈추지 않음

Parallel (병렬)

  • 여러 작업을 동시에 실행
  • ⏱ 전체 시간 단축
  • 관리 난이도 ↑

👉 비동기 ≠ 병렬
👉 병렬은 비동기의 한 형태


3️⃣ 문제 상황: Concurrency 없는 앱

기존 코드 문제

 
toastLabel.text = makeToast() // 2초 sleep eggLabel.text = boilEggs() // 7초 sleep

결과

  • UI 완전 멈춤
  • 버튼 눌러도 반응 없음
  • 중간 상태 메시지 표시 ❌
  • 총 실행 시간 ≈ 9초

📌 이유

메인 스레드에서 긴 작업을 실행했기 때문


4️⃣ async / await 도입

async 함수

 
func makeToast() async -> String

await 호출

 
let toast = await makeToast()

핵심 의미

  • async : 중단 가능한 함수
  • await : “여기서 잠시 멈출 수 있음”

5️⃣ Task로 비동기 실행

왜 필요한가?

  • viewDidAppear()는 async 불가

해결

 
Task {
     toastLabel.text = await makeToast()
}

결과

  • UI 즉시 반응
  • 버튼 클릭 바로 처리
  • 중간 상태 표시 정상

👉 앱은 살아 있고 작업은 백그라운드에서 진행


6️⃣ 하지만 아직 느린 이유

  • makeToast() 끝난 후
  • boilEggs() 시작

여전히 순차 실행


7️⃣ async-let으로 병렬 처리

문법

 
async let toast = makeToast()
async let eggs = boilEggs()
 
await toastLabel.text = toast
await eggLabel.text = eggs

효과

  • toast + eggs 동시에 실행
  • 총 시간 ≈ 7초
  • UI 반응 유지 + 성능 향상

8️⃣ 전체 흐름 요약

단계상태
동시성 없음 UI 멈춤, 9초
async/await UI 정상, 9초
async-let UI 정상, 7초

'Programming Languages > Swift' 카테고리의 다른 글

Protocols / Extensions/ Error Handling  (0) 2025.12.26
Class / Struct  (0) 2025.12.26
Functions (함수) / Closures  (0) 2025.12.26
Swift / C++ Collection Types 비교  (0) 2025.12.26
Swift vs C/C++ 문법 비교  (0) 2025.12.19