🚀 Swift 핵심 개념 정리
🧵 1. 비동기 프로그래밍 (Asynchronous Programming)
📌 개념
- 작업을 완료할 때까지 기다리지 않고, 다음 작업을 바로 실행할 수 있는 프로그래밍 방식.
- iOS에서는 GCD (Grand Central Dispatch) 또는 Task (Swift Concurrency) 를 사용.
🔄 동기 vs 비동기
구분 | 설명 |
---|
동기 (Synchronous) | 작업이 끝날 때까지 다음 작업을 대기 |
비동기 (Asynchronous) | 기다리지 않고 다음 작업 바로 실행 |
📚 GCD 주요 큐
Main Queue
: UI 작업 처리
Global Queue
: 백그라운드 작업 처리
Custom Queue
: 사용자가 생성한 큐
✅ GCD 비동기 예제
DispatchQueue.global().async {
print("비동기 작업 실행")
DispatchQueue.main.async {
print("UI 업데이트")
}
}
🧪 Step 1: 비동기 실습 예제
✅ 1. 숫자 출력 후 UI 업데이트 (GCD)
🔹 GCD(Grand Central Dispatch)란?
GCD는 iOS에서 멀티스레딩을 쉽게 구현할 수 있도록 도와주는 Apple의 기술입니다.
주로 비동기 작업, 백그라운드 처리, UI 업데이트 등에 사용됩니다.
DispatchQueue.global()
: 백그라운드(글로벌) 스레드에서 작업 실행
DispatchQueue.main
: UI 업데이트는 반드시 메인 스레드에서 실행해야 하므로 사용
🔸 예제 코드
✅ 1. 숫자 출력 후 UI 업데이트 (GCD)
DispatchQueue.global().async {
for i in 1...5 {
print(i)
}
DispatchQueue.main.async {
print("UI 업데이트 완료")
}
}
✅ 2. 네트워크 시뮬레이션 (GCD)
DispatchQueue.global().asyncAfter(deadline: .now() + 3) {
print("데이터 로딩 중...")
DispatchQueue.main.async {
print("데이터 로드 완료")
}
}
🧩 주요 개념 요약
용어 | 설명 |
---|
DispatchQueue.global() | 백그라운드에서 비동기 작업 수행 |
DispatchQueue.main | 메인 스레드(UI 스레드)에서 작업 수행 |
async | 비동기 실행. 이전 작업을 기다리지 않고 다음 코드 실행 |
main.async | 메인 큐에서 비동기 작업 실행 (예: UI 업데이트 등) |
🧵 2. Swift Concurrency (Task)
✅ 숫자 출력 후 UI 업데이트 (Task)
func taskTest() {
Task {
for i in 1...5 {
print(i)
}
await MainActor.run {
print("UI 업데이트 완료")
}
}
}
✅ 네트워크 시뮬레이션 (Task)
func simulateNetworkTask() {
Task {
try? await Task.sleep(nanoseconds: 3_000_000_000)
print("데이터 로딩 중...")
await MainActor.run {
print("데이터 로드 완료")
}
}
}
📘 주요 개념 설명
용어 | 설명 |
---|
Task { ... } | Swift의 비동기 작업을 정의하는 방식. 새로운 비동기 컨텍스트를 시작. |
for i in 1...5 | 반복문을 통해 백그라운드에서 숫자를 출력. |
await MainActor.run | 메인 스레드(UI 스레드)에서 안전하게 UI 관련 작업을 수행하도록 보장. |
print(...) | 현재 스레드에서 출력. 메인 UI는 반드시 MainActor 에서 실행해야 안전. |
🧬 3. 제네릭 (Generic)
📌 개념
- 제네릭은 타입에 구애받지 않고 재사용 가능한 코드를 작성하기 위한 Swift 문법입니다.
- 코드의 유연성과 안정성을 동시에 확보할 수 있습니다.
✅ 제네릭 함수 예제
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var a = 10
var b = 20
swapValues(&a, &b)
print(a, b)
✅ 제네릭 스택 구현
struct Stack<T> {
private var elements: [T] = []
mutating func push(_ element: T) {
elements.append(element)
}
mutating func pop() -> T? {
return elements.popLast()
}
func printElements() {
print(elements)
}
}
var intStack = Stack<Int>()
intStack.push(1)
intStack.push(2)
print(intStack.pop() ?? "nil")
✅ 요약
항목 | 설명 |
---|
비동기 프로그래밍 | UI 응답성을 유지하며 백그라운드 작업 처리 |
GCD | 큐 기반 비동기 처리 방법 |
Task | Swift 5.5+의 구조화된 비동기 처리 방식 |
제네릭 | 다양한 타입에 재사용 가능한 코드 작성 가능 |
✅ 마무리 요약
주제 | 핵심 내용 |
---|
비동기 프로그래밍 | UI가 멈추지 않도록 백그라운드에서 작업을 처리하는 기술 |
GCD (Grand Central Dispatch) | 큐 기반의 비동기 처리 방식. 시스템 자원을 효율적으로 사용함 |
Swift Concurrency (Task) | Swift 5.5부터 도입된 구조화된 비동기 코드 스타일. async/await 지원 |
MainActor | UI 관련 코드는 반드시 메인 스레드(MainActor)에서 실행해야 안전 |
제네릭(Generic) | 다양한 타입에 대해 재사용 가능한 코드를 작성할 수 있게 해주는 문법 |
제네릭 함수 & 타입 | 함수나 구조체에 <T> 등을 활용하여 타입에 관계없이 유연한 코드 작성 가능 |