Swift 비동기 프로그래밍 & 제네릭 한 번에 마스터하기처리부터 제네릭까지

Ios_Roy·2025년 7월 31일
0

TIL

목록 보기
15/25
post-thumbnail

🚀 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) // 출력: 20, 10

✅ 제네릭 스택 구현

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") // 출력: 2

✅ 요약

항목설명
비동기 프로그래밍UI 응답성을 유지하며 백그라운드 작업 처리
GCD큐 기반 비동기 처리 방법
TaskSwift 5.5+의 구조화된 비동기 처리 방식
제네릭다양한 타입에 재사용 가능한 코드 작성 가능

✅ 마무리 요약

주제핵심 내용
비동기 프로그래밍UI가 멈추지 않도록 백그라운드에서 작업을 처리하는 기술
GCD (Grand Central Dispatch)큐 기반의 비동기 처리 방식. 시스템 자원을 효율적으로 사용함
Swift Concurrency (Task)Swift 5.5부터 도입된 구조화된 비동기 코드 스타일. async/await 지원
MainActorUI 관련 코드는 반드시 메인 스레드(MainActor)에서 실행해야 안전
제네릭(Generic)다양한 타입에 대해 재사용 가능한 코드를 작성할 수 있게 해주는 문법
제네릭 함수 & 타입함수나 구조체에 <T> 등을 활용하여 타입에 관계없이 유연한 코드 작성 가능
profile
iOS 개발자 공부하는 Roy

0개의 댓글