Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 고차함수
- segue
- calendar
- mvvm
- protocol
- struct
- array
- apns
- SWIFT
- 화면전환
- class
- Switch
- uikit
- Observer
- singleton
- self
- PushNotification
- list
- viewlifecycle
- escaping
- error
- 글또
- NotificationCenter
- SWIFTUI
- Refresh
- ScrollView
- http
- IOS
- 회고
- Git
Archives
- Today
- Total
seong_hye, the developer
Swift) 동기 vs 비동기에 대해서 알아보기 본문
코드를 작성하다보면 동기와 비동기에 대해 알게 되는데
오늘은 이 내용을 한 번 정리해보려 합니다.
동기 & 비동기 = 프로그래밍에서 작업의 실행 흐름과 시간 제어 방식에 대한 개념
📘 동기(Synchronous)
한 작업이 끝나야 다음 작업을 실행하는 방식
작업이 완료될 때까지 기다렸다가 다음 명령을 실행하는 순차적 흐름
🔹예시 코드
func loadData() -> String {
//ex. 오래 걸리는 작업
return "데이터 로딩 완료"
}
let result = loadData() //📌 작업이 끝날 때까지 여기서 멈춤
print(result)
- loadData() 함수가 완료될 때까지 다음 줄로 넘어가지 않음
- 사용자 경험 (UX) 측면에서 UI가 멈추는 것처럼 보일 수 있음
🔹핵심 특징
항목 | 설명 |
실행 흐름 | 순서대로 실행 (선형적) |
다음 작업 실행 시점 | 이전 작업이 완료된 후에만 가능 |
병렬 처리 | 기본적으로 없음 |
UI/UX 영향 | 오래 걸리는 작업은 UI를 멈추게 함 |
예시 | for 반복문, 숫자 계산, 즉시 반환 함수 등 |
🔹장점과 단점
장점 | 단점 |
직관적 (코드의 흐름이 순차적이라 읽기 쉬움) | 느림 (오래 걸리는 작업이 전체 흐름을 멈춤) |
디버깅 쉬움 (코드 실행 순서가 명확함) | 멀티태스킹 X (다른 작업과 동시에 처리하기 어려움) |
상태 관리 쉬움 (복잡한 콜백이나 비동기 상태 필요 없음) | UI 멈춤 가능성 (메인 스레드에서 실행되면 앱이 멈춘 것처럼 보일 수 있음) |
🔹사용하는 경우
단순 계산 (오랜 안걸리는 작업을 바로 처리 가능)
내부 로직 테스트 (흐름을 쉽게 파악하고 디버깅 가능)
메인 스레드 아닌 곳에서 블로킹해도 괜찮은 상황 (ex. 백그랑누드 계산 전용 스레드)
📘 비동기 (Asynchronous)
어떤 작업이 진행되는 동안 기다리지 않고, 다른 작업을 동시에(병렬 또는 예약) 처리할 수 있도록 하는 실행 방식
🔹예시 코드
// Swift 5.5 + async/await
func fetchData() async -> String {
// 시간이 걸리는 작업 (EX. 네트워크 요청)
return "완료된 데이터"
}
Task {
let result = await fetchData()
print(result) //기다리긴하지만 메인흐름을 막진 않음
}
// 클로저 기반 비동기 (전통적 방식)
func fetchData(completion: @escaping (String) -> Void) {
DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
completion("완료된 데이터")
}
}
fetchData { result in
print("받은 값 : \(result)")
}
🔹핵심 특징
항목 | 설명 |
실행 흐름 | 여러 작업이 동시에 (또는 독립적으로) 실행됨 |
완료 시점 | 콜백 / await 등을 통해 나중에 결과 전달 |
사용자 반응성 | 유지됨 (UI 멈추지 않음) |
사용 장소 | 네트워크 요청, 파일 읽기, 타이머, 애니메이션 등 |
구현 방식 | DispatchQueue.async, async/await, completion handler 등 |
🔹비동기 구현 방식
방식 | 설명 |
DispatchQueue.async | GCD 기반 비동기 실행 |
async/await | Swift 5.5부터 도입된 비동기 패턴 |
completion handler | 전통적 비동기 방식 |
Combine | RxSwift 유사한 비동기 이벤트 처리 |
🔹장점과 단점
장점 | 단점 |
사용자 경험 향상 (UI가 멈추지 않음) | 코드 복잡도 증가 (콜백 지옥, 흐름 추적이 어려움) |
성능 향상 (여러 작업을 동시에 처리 가능) | 에러 처리 복잡 (완료 시점이 나중이라 예외 추적 어려움) |
적은 리소스로 대기 없이 처리 | 상태 관리 어려움 (작업 간 순서와 결과 관리 필요) |
🔹사용하는 경우
네트워크 요청
디스크 / 파일 읽기
애니메이션 / 타이머
UI 관련 작업 (MainActor에서 처리 필요)
계산량 많은 CPU 작업 (백그라운드로 보내야 앱 멈춤 방지)
🔹한 줄 비교
동기 (Sync) - 작업이 끝날 때까지 기다리고 다음 작업을 실행
비동기 (Async) - 작업이 끝나길 기다리지 않고, 바로 다음 작업 실행
🔹특징 비교
항목 | 동기 (Synchronous) | 비동기 (Asynchronous) |
처리 흐름 | 직선적 (한 번에 하나) | 분기적 (다른 일과 병행) |
속도 / 반응성 | 느릴 수 있음 (UI 멈춤) | 빠름, UI 끊김 없음 |
사용 위치 | 단순한 계산, IO가 없는 경우 | 네트워크, 파일, 디스크 등 느린 작업 |
코드 스타일 | 이해하기 쉬움 | 복잡하지만 유연함 |
예시 | readFile() | URLSession.dataTask, async/await, DispatchQueue.async |
'IOS' 카테고리의 다른 글
Swift) 디자인 패턴에 대해 정리하기 (0) | 2023.02.07 |
---|---|
Swift) 구조적 특징에 대해 알아보기 (0) | 2022.12.16 |
Swift) StateObject, ObservableObject, EnvironmentObject (0) | 2022.11.02 |
Swift) Error Code (0) | 2022.10.28 |
Swift) Library, Framework, Package에 대해 정리하기 (0) | 2022.10.24 |
Comments