| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Flutter Toy Project
- 영화기록
- 영화후기
- 토이프로젝트
- 리뷰
- 티스토리챌린지
- SOPT
- 키노
- 자바공부
- 영화
- MVVM-C
- 플러터
- 프로그래머스
- sopt 35기
- java
- 영화일기
- Flutter
- 일기
- 자바 스터디
- sopt ios
- 영화리뷰
- 새벽녘 소소한 기록
- 독서일기
- 백준
- 자바
- IOS
- SWIFT
- 오블완
- swift concurrency
- 코딩공부
- Today
- Total
새벽의 기록
[iOS] Swift Concurrency 박살내기 #0 - 동시성과 비동기 본문
Swift Concurrency의 개념은 사용히면서도 항상 어려운 것 같다.
기회될 때 한 번 싹 탐구를 해보고 싶다고 생각하고 있었고, 지금 잠깐 짬이 나는 김에 제대로 공부해보려고 한다.
동시성이란
동시성(Concurrency)이란 여러 작업을 번갈아 빠르게 처리해 사용자가 볼 때는 동시에 여러 일이 처리되는 것처럼 보이게 만드는 개념이다.
실제로는 한 번에 하나의 작업만 CPU에서 실행되지만, 작업 간 전환(컨텍스트 스위칭)이 매우 빨라서 동시에 처리되는 것처럼 느껴진다.
- 예시: 싱글코어 CPU에서 웹 서버가 여러 클라이언트 요청을 순차적으로 조금씩 처리함으로써, 각 요청이 동시에 처리되는 듯이 보임.
- 특징: 작업들이 서로 의존 관계에 있을 수 있으며, 대부분 하나의 프로세스 내에서 여러 스레드를 돌리는 방식으로 구현.

현재 하나의 코어만 사용되고 있으며 코어 안에 2개의 스레드가 존재하고, 각각의 스레드는 서로 다른 작업을 수행한다.
컨텍스트 스위치를 통해 두 스레드의 작업을 빠르게 번갈아가면서 처리하기 때문에 사용자는 두 개의 작업이 동시에 처리되고 있는 것처럼 보이는 것을 의미한다.
멀티태스킹이란
멀티태스킹(Multitasking)은 운영체제 관점에서 하나의 컴퓨터 시스템이 여러 프로그램(프로세스)을 동시에 실행하는 기능이다.
process가 한번 CPU를 사용할 때 아주 짧은 시간(quantum)만 실행되도록 하여 각 process의 작업을 아주 작은 단위로 번갈아가며(Context Switching) 처리하면서, 작업 응답 시간을 최소화 시키는 방법이다.
CPU 시간을 잘게 쪼개서 여러 프로그램이 실행되는 것처럼 보이게 하므로, 사용자는 다양한 앱을 동시에 사용하는 듯한 경험을 할 수 있다. 마치 현재 기기의 CPU 스펙보다 약간 느린( 1/프로세스개수 ) CPU를 독점적으로 사용하고 있는 듯한 효과를 보인다.
- 사용이유: 멀티프로그래밍 환경에서 만약 처음 시작된 프로세스가 너무 오래 걸리면 다른 프로세스는 너무 기약없이 오래 기다려야 한다.
- 예시: 음악을 들으면서 웹 브라우징과 채팅 프로그램을 동시에 실행하는 것.
- 특징: 주로 운영체제가 여러 프로세스와 스레드를 관리하여 CPU 자원을 효율적으로 배분.

그럼 동시성이랑 멀티태스킹은 같은 건가?
의미가 비슷하긴 하지만, 둘은 엄연히 다른 용어라고 생각된다.
멀티태스킹은 CPU관점에서 각 process를 컨텍스트 스위칭하며 번갈아가며 처리하는 방식을 말하고,
동시성은 process관점에서 각 task를 스레드를 통해 동시에 실행하는 것처럼 보이는 방식이다.
따라서 하드웨어적인 측면에서 본다면, 멀티태스킹은 동시성을 포함하는 상위 개념이다.
task, 스레드, 코어, 프로세스, 프로그램에 대한 개념이 헷갈린다면 운영체제를 공부해야됨!
| 구분 | 동시성 (Concurrency) | 멀티태스킹 (Multitasking) |
| 적용 대상 | 하나의 프로그램(프로세스) | 전체 시스템(운영체제) |
| 단위 | 여러 Task, 스레드 | 여러 프로그램, 프로세스, 스레드 |
| 동작 방식 | 빠른 전환으로 여러 작업을 번갈아가며 처리 | CPU 시간을 쪼개 여러 프로그램을 실행함 |
| 독립성 | 작업 간 의존 가능 | 각 작업(앱)이 대체로 독립적 |
| 예시 | 웹 서버에서 여러 요청 처리 | 음악+문서 편집+웹 브라우저 동시 실행 |
병렬성이란
병렬성은 "여러 작업을 실제로 동시에 처리하는" 개념.
여러 CPU나 코어가 각각의 작업을 동시에 실행하므로, 처리 속도가 빨라지고 작업들이 서로 독립적으로 실행된다.
멀티코어 환경에서 주로 발생.

그래서 동시성과 병렬성 차이가 뭔데?
병렬성은 여러 작업이 실제로 동시에 실행되며 각각 독립적으로 실행되지만,
동시성은 여러 작업이 동시에 실행되는 것처럼 보이게 하는 것이다.
간단하게 예를 들면,
동시성은 한 사람이 여러 요리를 번갈아가며 조금씩 진행하는 것
병렬성은 여러 사람이 각각의 요리를 동시에 만드는 것
| 구분 | 동시성 | 병렬성 |
| 개념 | 동시에 처리하는 것처럼 보이게 하는 것 | 여러 작업을 실제로 동시에 처리하는 것 |
| 사용 코어 수 | 싱글 코어 | 멀티 코어 |
| 동작 방식 | 싱글 코어에서 멀티 쓰레드(Multi thread)를 동작 시키는 방식 | 멀티 코어에서 멀티 쓰레드(Multi thread)를 동작시키는 방 |
동기(sync)
동기(synchronous)란 작업이 순차적으로 진행되는 구조를 의미한다.
한 작업이 끝나야 다음 작업이 시작되며, 이전 작업이 끝날 때까지 프로그램 흐름이 멈춘다.
즉, 호출한 함수 또는 작업이 반환될 때까지 모든 흐름이 차단된 상태로 대기한다.
일반적으로 간단하고 직관적인 코드를 작성하기 쉽다.
하지만 여러 작업이 대기하고 있을 경우, 각 작업이 끝날 때까지 기다려야하기 때문에 전체 작업성능이 저하될 수 있다.
- 예시: 라면을 끓이고 다 끓인 후에 밥을 짓는 것.
- 특징: 코드가 직관적이지만, 작업이 지연되면 전체 흐름이 멈춤.
비동기(async)
비동기(asynchronous)는 작업을 요청한 후, 결과가 올 때까지 기다리지 않고 다른 작업을 먼저 처리할 수 있는 구조를 의마한다.
즉, 작업이 순차적으로 진행되지 않기 때문에 한 작업이 시작되면 해당 작업이 완료될 때까지 기디리지 않고, 다른 작업을 실행한다.
이러한 특징 때문에 주로 I/O 작업이나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 사용된다.
(UI와 관련된 작업의 경우 오래 기다리면 UX를 심하게 저하시킬 수 있기 때문에 거의 필수적이다)
콜백, async/await 등의 메커니즘을 통해 구현할 수 있다.
- 예시: 라면을 끓이는 동안 밥도 동시에 짓는 것.
- 특징: 효율적이지만, 코드가 복잡해질 수 있음.
| 구분 | 동시성(Concurrency) | 병렬성(Parallelism) | 멀티태스킹(Multitasking) | 동기(Sync) | 비동기(Async) |
| 개념 | 동시에 처리하는 것처럼 보이게 함 | 실제로 동시에 처리함 | 여러 프로그램을 동시에 실행 | 순차적 처리 | 대기 없이 처리 |
| 사용 코어 수 | 싱글 코어 | 멀티 코어 | 싱글/멀티 코어 | 한 작업씩 | 여러 작업 동시 진행 |
| 동작 방식 | 빠른 전환(스위칭) | 여러 코어에서 병렬 실행 | OS가 여러 프로세스 관리 | 작업 완료 후 다음 | 결과 오면 처리 |
| 독립성 | 작업 간 의존 가능 | 작업 간 독립적 | 각 프로그램 독립적 | 의존적 | 독립적 |
| 예시 | 한 사람이 여러 요리 번갈아 함 | 여러 사람이 각각 요리함 | 음악+웹+채팅 동시 실행 | 라면→밥 순서대로 | 라면+밥 동시에 |
iOS 에서의 동시성과 비동기 프로그래밍
- Grand Central Dispatch (GCD): iOS에서 제공하는 동시성 및 병렬성을 지원하는 프레임워크이다. 간편하게 다양한 작업을 스레드로 분배하여 처리할 수 있다.
- Operation Queue: GCD와 유사한 방식으로 동작하지만, 더 추상화된 고수준의 작업 관리를 제공한다.
- swift concurrency: Swift 5.5부터 도입된 문법으로, Async/Await, Task, Actor 등 새로운 문법과 구조를 도입해 동시성과 비동기 프로그래밍을 훨씬 쉽고 안전하게 만들어준다.
GCD와 Operation 방식에는 콜백중첩, race condition 등 개발하는 데 불편함이 있었고, 현재는 swift concurrency가 강하게 선호되는 추세이다.
참고
https://youngkdevlog.tistory.com/86
https://codingmon.tistory.com/34
'[iOS]' 카테고리의 다른 글
| [iOS] Swift Concurrency 박살내기 #2 - 구조화된 동시성 (Structured Concurrency) vs 구조화되지 않은 동시성 (Unstructured Concurrency) (Task, TaskGroup, async let) (0) | 2025.10.20 |
|---|---|
| [iOS] Swift Concurrency 박살내기 #1 - iOS에서의 동시성과 비동기 프로그래밍 방법 (0) | 2025.10.18 |
| [iOS] SwiftUI에서 MVVM-C 패턴 톺아보기 (0) | 2025.10.02 |
| [iOS] 클린아키텍처 공부할 때 주저리주저리 썼던 거 (0) | 2025.10.01 |
| [iOS] SwiftUI+MVVM-C 프로젝트 클린 아키텍처 도입 (0) | 2025.10.01 |
