안녕하세요, iOS 개발하는 루피입니다!
오늘은 Concurrency를 공부하다 메인 스레드에 대한 지식을 얻게되어 한번 정리해보려 합니다.
바로 시작합니다.
1. 모든 프로그램은 메인 스레드에서 시작한다.
모든 프로그램은 최소한 하나의 스레드에서 실행되며, 그걸 메인 스레드라고 부릅니다.
macOS에서 간단한 커맨드라인 앱은 이 메인 스레드 하나만으로 끝까지 돌 수도 있고, iOS 앱은 더 많은 일을 처리하기 위해 여러 스레드를 쓰지만, 어쨌든 앱이 시작될 때 생기는 첫 스레드(즉, 메인 스레드)는 앱이 살아있는 동안 항상 존재합니다.
이건 중요한 개념인데요!! 왜냐하면, 모든 UI 작업은 반드시 이 메인 스레드에서 해야 하기 때문입니다.
일부 작업이 가끔 메인에서 해야 하는 게 아니라, 모든 UI 작업을 항상 메인 스레드에서 해야 해요.
만약 다른 스레드에서 UI를 업데이트하려고 하면 아무 일도 안 일어날 수도 있고, 앱이 크래시될 수도 있고, 그 중간쯤인 이상한 결과가 나올 수도 있습니다. 이 규칙은 iOS, macOS, tvOS, watchOS에서 돌아가는 모든 앱에 적용됩니다.
2. 스레드를 만드는 건 드물어요
Swift에서는 원하면 언제든 스레드를 만들 수 있지만, 사실 그렇게 자주 하진 않습니다.
왜냐? 스레드가 많아지면 복잡도가 엄청 올라가거든요.
만든 스레드는 어딘가에서 실행돼야 하는데, 예를 들어 CPU 코어가 4개뿐인데 실수로 40개 스레드를 만들어버리면 시스템이 그걸 다 돌리느라 정신없어집니다.
스레드 간 전환은 컨텍스트 스위치라고 부르는데, 이게 성능 비용을 먹습니다. 시스템은 현재 스레드가 쓰던 데이터와 진행 상황을 저장하고, 다른 스레드를 실행시키는 식으로 바꿔야 하죠.
CPU 코어보다 스레드가 훨씬 많아지면 이 컨텍스트 스위치 비용이 커지고, 이를 스레드 폭발이라고 합니다.
그래서 보통은 앱을 시작하는 메인 스레드를 빼고, 나머지 작업은 큐로 생각하는 걸 선호합니다.
3. 스레드 vs 큐
스레드는 프로그램을 쪼개서 실행하는 개별 조각이고, 큐는 작업을 요청하고 실행시키는 파이프라인 같은 겁니다.
큐가 스레드보다 생각하기 쉬운 이유는 우리가 중요한 것만 신경 쓰면 되기 때문이에요. 코드가 CPU에서 어떻게 돌아가든 상관없고, 그냥 순서대로 실행되느냐(직렬), 아니면 동시에 되느냐(동시)만 결정하면 됩니다.
심지어 큐를 직접 만들 필요도 없는 경우가 많아요. Swift에 기본으로 있는 큐를 쓰고, 시스템이 알아서 처리하게 맡기면 되니까요.
4. 메인 스레드와 메인 큐
가끔 "메인 스레드"랑 "메인 큐"라는 말을 서로 바꿔 쓰기도 하지만, 사실 이 둘은 정확히 같은 게 아니에요.
이 차이는 좀 미묘해서 평소엔 신경 안 써도 되는데, 가끔 중요한 순간에 영향을 줄 수 있습니다.
핵심은 이겁니다
- 메인 큐는 항상 메인 스레드에서 실행됩니다. 그러니까 UI 작업을 할 때 메인 큐를 쓰면 자연스럽게 메인 스레드에서 돌게 되는 거죠.
- 하지만 메인 스레드에서 실행된다고 해서 꼭 메인 큐에 있는 건 아닙니다. 시스템은 효율성을 위해 다른 큐의 작업을 메인 스레드에서 돌릴 수도 있어요.
오늘도 화이팅입니다!
'iOS > Swift' 카테고리의 다른 글
[Swift] 동시성 vs 병렬성 (0) | 2025.02.26 |
---|---|
[Swift] Dispatch Work Item (0) | 2025.02.24 |
[Swift] Dispatch Group (0) | 2025.02.23 |
[Swift] Dispatch Queue 종류 (0) | 2025.02.21 |
[Swift] Concurrent + Sync 에 대한 궁금증 (0) | 2025.02.19 |