iOS 개발을 하다보면 필수적으로 알아야할 개념인 GCD(Grand Central Dispatch) 를 알아야 한다. 오늘은 동시성 프로그래밍을 위한 GCD를 알아보도록 하자. 먼저 동시성 프로그래밍이란 무엇이고 GCD란 무엇일까? 하나하나씩 알아보자.
여기 좋은 그림을 하나 가져왔다. 사진을 보면 하얀 실이 바늘 구멍을 들어가면 여러가지 색의 줄로 나뉘고 있다. 이 줄들이 바로 스레드(Thread)이다. 여기서 잠깐 상상력(?)을 발휘해보자. 사진에는 보이지 않지만 실 위에 많은 작업들이 쌓여있다고 상상해보자. 그럼 당연히 하나의 실(스레드)보다 여러 가지 색의 실로 나뉘면 작업을 수행하기 더욱 수월할 것이라는 것을 직감적으로 알 수 있다 이것이 바로 동시성 프로그래밍이다 !
그렇다면 어떻게 코드로 동시성 프로그래밍을 구현할 수 있을까?
iOS 개발자들은 이런 작업들을 Queue로만 보내주면 된다 !
바로 여기서 등장하는 것이 GCD(Grand Central Dispatch)란 개념이다.
작업을 대기행렬(Queue)을 보내는 것은 크게 GCD와 Operation이 있는데, 이번에는 GCD에 대해 알아볼까 한다.
Operation은 GCD를 기반으로 만들어졌으며, 주로 복잡한 작업을 수행할 때 사용하고 데이터와 기능을 캡슐화한 객체이다. 반대로 GCD는 간단하고 메서드 위주의 작업을 수행할 때 사용한다.
💡 GCD란 직접적으로 스레드를 관리하지 않고 작업을 Queue로 보내 분산처리 하는 방법이다.
여기까지 들어도 이해가 가지 않을 수 있는데, 작업을 Queue로 보내면 메인스레드에서 처리 되었던 작업들이 차례차례 다른 스레드2번, 스레드3번, 스레드 4번... 으로 작업이 자동적으로 분산처리 된다는 뜻이다 !
결국 궁극적으로 여러 작업들이 비동기적으로 실행된다는 것이다. 물론 여기서 말하는 작업들은 대부분 네트워크와 관련된 작업을 말한다. 왜냐하면 iOS에서는 UI와 관련된 작업들은 모두 메인스레드라는 하나의 스레드에서 처리하도록 되어있기 때문이다.
DispatchQueue.global().async {
print("나는")
print("GCD를 배우고 있어")
}
위 코드에서는 DispatchQueue(큐에 보낼거야), global(global 큐로), async(비동기적으로) 라는 의미로 클로저 안에는 하나의 작업을 의미한다.
여기서는
print("나는")
print("GCD를 배우고 있어")
이 코드가 하나의 작업(task)가 되는 것이다 ! (통으로 묶는다는 뜻..)
지금까지 간단하게 GCD와 동시성 프로그래밍을 알아보았다. 다음에는 동기(sync)와 비동기(async)의 차이점과 Concurrent Queue와 Serial Queue의 차이점을 알아보도록 하자.