Swift 언어를 사용하여
동기(Synchronous)와 비동기(Asynchronous) 이해 🔥
예제를 통해 알아보자!
대용량 처리를 할 때 스레드는 어떻게 될까?
네트워크 통신 혹은 대용량 파일 처리하는 스레드의 경우 오랫동안 점유된다
그러면 다른 작업들은 어떻게 실행될까??
이 상황을 예로 들면,
나는 빵공장에서 일하게 되었다 🥲
빵공장에는 기계 A,B,C 3개가 있다
옆에 초등학교에서 단체 주문이 들어와 빵 900개를 만들어야 한다
동기(Sync)의 경우
-> 기계 A에서 빵900개를 제작하는 동안 B, C를 사용할 수 없다
A에서 빵900개를 모두 만들면 B 또는 C에서 다른 일을 시작한다
비동기(Async)의 경우
-> 기계 A,B,C에서 빵 300개씩 나눠서 만든다
동기는 한번에 한 작업만 수행 가능하다
즉 기계A가 작업이 완료돼야 B, C가 다음 작업을 시작한다
비동기는 한번에 여러 작업이 수행 가능하다
작업이 완료되기를 기다리지 않고 다음 작업을 시작한다
동기(Sync)와 비동기(Async)의 개념
동기(Sync)
: 동기로 작성한 코드는 한 번에한 가지 작업만 수행
즉, 한 작업이 완료될 때까지 기다린 후 다음 작업을 시작합니다.
But, 작업이 오래 걸릴 경우 프로그램이 일시중지 될 수 있다🚫
비동기(Async)
: 비동기로 작성한 코드는 여러 가지 작업을 동시에 수행할 수 있습니다.
한 작업이 완료되기를 기다리지 않고 다음 작업을 시작할 수 있다.
But, 코드의 실행 순서를 추적하기 어렵게 만들 수 있다❗️
동기(Sync) VS 비동기(Async)
동기(Synchronous)
동기 프로그래밍은 작업을 순차적으로 진행한다!
작업 A가 시작되면 완료될 때까지 기다린 후, 작업 B를 시작한다
⭕️ 장점
- 코드 한 번에 하나의 작업을 수행하여 코드의 실행 순서가 예측 가능하다
- 작업의 상태를 쉽게 추적 가능하다
❌ 단점
- 긴 시간이 걸리는 작업을 처리하는 동안 프로그램이 일시 중단될 수 있다
비동기(Asynchronous)
비동기 프로그래밍은 작업을 동시에 실행하고 결과를 기다리지 않고 다음 작업을 진행한다!
작업 A가 시작되면 결과를 기다리지 않고, 작업 B를 실행할 수 있다
⭕️ 장점
- 긴 시간이 걸리는 작업이 있는 경우, 동시에 다른 작업을 처리할 수 있다
- 프로그램이 더 효율적으로 동작한다
❌ 단점
- 작업 순서가 일정하지 않아 코드의 실행 순서를 추적하기 어렵다
- 작업 간의 상태 및 종속성을 관리해야 할 수 있다
동기, 비동기 둘 중 어떤 것을 사용해야 할까? 🤔
어떤 상황에 어떤 것을 써야 하는지?
- 정해진 답은 없다. 상황에 따라 다르다
동기(Synchronous)
- 작업 결과가 다음작업에 바로 필요하거나, 코드의 실행 흐름이 일관성을 유지해야 할 때 유용하다!
ex) 파일을 읽고 그 내용을 처리하는 작업 - 파일 읽기 작업이 완료된 후에 처리해야 한다
비동기(Asynchronous)
- 작업 순서가 중요하지 않거나, 작업이 오랜 시간 걸리는 경우에 유용하다!
ex) 네트워크 요청, 파일 다운로드, 애니메이션 - 작업을 동시에 처리하고 응답 대기 시간을 최소화
Swift 예제 - Async, Sync 동기 비동기 사용 방법
DispatchQueue 사용한 비동기(Async) 방법
// DispatchQueue 사용한 비동기 처리
DispatchQueue.global.async {
}
해석: DispatchQueue 를 통해 global 큐에 비동기 처리 작업을 한다
코드를 통해 비동기 동기 비교해보자!
import Foundation
func synchronousTask() {
print("Synchronous Task 1")
sleep(2) // 2초 동안 대기
print("Synchronous Task 2")
}
func asynchronousTask() {
DispatchQueue.global().async {
print("Asynchronous Task 1")
sleep(2) // 2초 동안 대기
print("Asynchronous Task 2")
}
}
print("=== Synchronous Task Start ===")
synchronousTask()
print("=== Synchronous Task End ===")
print("=== Asynchronous Task Start ===")
asynchronousTask()
print("=== Asynchronous Task End ===")
위의 코드를 실행하면, 동기 작업의 경우 synchronousTask() 함수가 완전히 끝난 후에 다음 라인의 코드를 실행한다
🔴 synchronousTask() 결과
Synchronous Task Start → Synchronous Task 1 → (2초 대기) → Synchronous Task 2 → Synchronous Task End
반면, 비동기 작업의 경우 asynchronousTask() 함수는 별도의 스레드에서 실행되기 때문에, 메인스레드는 함수의 작업 완료를 기다리지 않고 다음 라인의 코드를 실행한다
🔴 asynchronousTask() 결과
Asynchronous Task Start → Asynchronous Task End → Asynchronous Task 1 → (2초 대기) → Synchronous Task 2
'iOS Swift > iOS Swift - 기초' 카테고리의 다른 글
[iOS] Swift XCFramework 생성 후 Objective-C에서 적용 (0) | 2024.05.02 |
---|---|
[iOS/Swift] GCD 멀티스레딩 with DispatchQueue (1) (1) | 2024.03.13 |
[iOS/Swift] 달력 UICalendarView Custom 예제 programmatically (0) | 2023.05.08 |
[iOS/Swift] URLSession Task 네트워크 api 통신 (0) | 2023.02.28 |