iOS

[iOS] GCD(Grand Central Dispatch) 알아보기

스벅 보안관 2024. 6. 24. 11:34

안녕하세요 스벅보안관입니다.

날씨가 요즘 더워지고있네요,, 저는 요즘 에어컨값 아끼려고 스타벅스에서 공부를 하고 있습니다.(TMI)

아무튼 이 글을 보는 여러분도 더위조심하시고 감기 조심하세요. :)

 

오늘은 Swift의 GCD(Grand Central Dispatch)에 대해 이야기해보려고 합니다.

어찌보면 iOS 개발자 면접에 필수로 나오는 키워드인데요, 한번 확실하게 알아보려합니다 ㅎ

 

GCD란?

Grand Central Dispatch (GCD)는 Apple에서 제공하는 멀티스레딩 API입니다. 즉, GCD를 이용하면 프로그램이 동시에 여러 작업을 병렬로 실행할 수 있게 되어, 성능을 크게 향상시킬 수 있습니다. 특히 UI 작업을 처리하는 메인 스레드와 백그라운드에서 실행되는 작업을 쉽게 구분할 수 있게 해줍니다.

 

정리하면 

 

  • 비동기 작업을 간단하게 구현
  • 멀티스레딩 환경에서 성능 최적화
  • 백그라운드 작업 및 메인 스레드 UI 작업 관리

이러한 특징을 갖고 있습니다.

 

 

GCD에는 몇 가지 중요한 개념과 키워드들이 있습니다. 예시코드를 통해서 살펴보겠습니다.

 

1. 비동기(Asynchronous)와 동기(Synchronous)

GCD에서는 작업을 비동기(Asynchronous) 또는 동기(Synchronous) 방식으로 처리할 수 있습니다.

  • 동기(Synchronous) : 해당 작업이 끝날 때까지 현재 스레드가 멈춰서 기다립니다.
  • 비동기(Asynchronous) : 작업이 바로 실행되고, 해당 작업이 끝나기 전에 다른 작업이 진행됩니다.
let queue = DispatchQueue.global()

// 동기 작업: 작업이 끝날 때까지 대기
queue.sync {
    print("동기 작업 시작")
    Thread.sleep(forTimeInterval: 2)
    print("동기 작업 끝")
}

// 비동기 작업: 다음 작업이 기다리지 않음
queue.async {
    print("비동기 작업 시작")
    Thread.sleep(forTimeInterval: 2)
    print("비동기 작업 끝")
}

print("이 코드는 비동기 작업이 끝나기 전에 실행됩니다.")

 

 

 

2. Dispatch Queue

GCD에서 작업을 처리할 때는 Dispatch Queue를 사용합니다. 이 큐는 작업을 순차적으로 또는 동시에 처리하는 역할을 합니다. 큐는 크게 두 가지로 나눌 수 있습니다:

  • 메인 큐 (Main Queue) : 메인 스레드에서 실행되는 큐로, UI 관련 작업을 처리합니다.
  • 글로벌 큐 (Global Queue) : 백그라운드 작업을 처리하는 큐로, 여러 작업을 병렬로 실행할 수 있습니다.
// 메인 큐에서 UI 업데이트
DispatchQueue.main.async {
    print("메인 큐에서 실행 중 - 주로 UI 작업에 사용")
}

// 글로벌 큐에서 백그라운드 작업 실행
DispatchQueue.global(qos: .background).async {
    print("백그라운드에서 실행 중 - 예: 네트워킹 작업")
}

 

 

3. DispatchGroup으로 작업 동기화

여러 비동기 작업을 동시에 실행하고, 그 결과를 모아야 할 때가 있습니다. 그럴 때 DispatchGroup을 사용할 수 있습니다.

let group = DispatchGroup()

group.enter()
DispatchQueue.global().async {
    print("첫 번째 작업 시작")
    Thread.sleep(forTimeInterval: 2)
    print("첫 번째 작업 끝")
    group.leave()
}

group.enter()
DispatchQueue.global().async {
    print("두 번째 작업 시작")
    Thread.sleep(forTimeInterval: 1)
    print("두 번째 작업 끝")
    group.leave()
}

group.notify(queue: DispatchQueue.main) {
    print("모든 작업이 완료되었습니다.")
}

 

위 코드는 두 개의 비동기 작업이 끝난 후에 메인 스레드에서 "모든 작업이 완료되었습니다"라는 메시지를 출력합니다. 여러 작업이 동시에 진행될 때, 그 작업들이 언제 끝나는지 알아야 할 경우에 자주 사용합니다.

 

 

 

결론

GCD는 처음엔 생소해 보일 수 있지만, 실전에서 유용하게 쓰이는 강력한 도구입니다. 특히 비동기 작업을 효율적으로 처리하는 데 있어 매우 중요한 역할을 하죠. Swift에서 GCD를 잘 활용하면 UI의 반응성을 높이고, 병렬 처리를 통해 성능을 크게 향상시킬 수 있습니다.

 

알고 쓰자 GCD