IOS [ 개념정리 ]

23.10.31 Grand Central Dispatch (GCD)와 Operation Queue의 차이점 / Delegate pattern 에 대한 설명

oong2 2023. 11. 1. 03:08

Grand Central Dispatch (GCD) Operation Queue는 iOS 및 macOS 앱에서

다중 스레딩  병렬 프로그래밍을 위해 사용되는 두 가지 주요 다중 스레딩 기술입니다.

다음은 GCD와 Operation Queue의 주요 차이점입니다

*다중 스레딩 : 하나의 컴퓨터 프로세스에서 여러개의 작업을 수행하는것 ( 컴퓨터 성능 최적화 & 응답시간 개선 )
*병렬 프로그래밍 : 다중 코어를 활용하여 작업을 병렬로 처리하는과정을통해 시스템성능을 향상시키는것

* 다중 스레딩이 병렬 프로그래밍안에 속해있으며 , 다중코어를 활용하는 각 코어 하나들이 다중스레딩으로 동작할 수 있음.

 

  • GCD: GCD는 더 저수준의 API로, 간단하고 빠른 병렬 처리를 위한 기본 도구를 제공합니다. GCD를 사용하면 큐를 만들고 블록을 큐에 제출하여 비동기 작업을 실행할 수 있습니다.
    *비동기 작업 : 작업이 순차적으로 실행되지 않고, 동시에 또는 원할때 실행할 수 있는 작업
    - GCD를 사용하면 작업을 에 제출하고 GCD가 스레드 관리를 담당합니다. GCD는 간단한 큐 기반 모델을 제공하며 작업이 완료되면 호출될 콜백 블록을 설정할 수 있습니다.
    *큐 : 데이터를 저장하고 검색하는데 사용되는 추상 자료 구조, 데이터를 순차적으로 처리하거나 일시적으로 저장하기위해 사용
    - GCD에서는 작업의 의존성 및 취소를 처리하기 어렵습니다. 작업을 취소하려면 약간의 추가 노력이 필요합니다.
    - GCD 코드는 단순하고 간단한 비동기 작업에 적합하며 코드가 짧을 때 가독성이 좋을 수 있습니다. 그러나 복잡한 작업 흐름 및 의존성을 관리하기 어려울 수 있습니다.
    - GCD는 경량이며, 간단한 비동기 작업의 경우 오버헤드가 낮을 수 있습니다.
    *오버헤드 : 어떤 작업을 수행하는데 필요한 추가적인 리소스 or 시간을 나타냄. 일반적으로 실제작업에 비해 부가적인 작업을 수행하기위한 비용이나 부담을 설명하는데 사용된다.
  • Operation Queue: Operation Queue는 GCD의 상위 수준 추상화로, 작업(Operation)을 사용하여 작업 간의 의존성을 처리하고 작업의 실행과 취소를 관리할 수 있습니다.
    - Operation Queue는 작업(Operation) 개체로 작업을 정의하고 작업 간의 의존성을 설정할 수 있으며, 작업이 완료되면 KVO(Key-Value Observing)를 사용하여 알림을 받을 수 있습니다.
    *KVO(Key-Value Observing): 객체 지향 프로그래밍에서 사용되는 디자인패턴중 하나. 객체의 속성 값이 변경될 때 다른객체에게 이 변경 사항을 알리는 메커니즘 ( 앞서 배웠던 옵저버가 여기 포함됨 )
    - Operation Queue는 작업 간의 의존성을 직관적으로 설정할 수 있으며, 작업을 취소하고 대기 중인 작업을 무시하는 등의 작업 관리가 쉽게 가능합니다.
    - Operation Queue를 사용하면 코드가 보다 명확하며 작업의 의존성 및 실행 순서를 이해하기 쉽습니다.
    - Operation Queue는 GCD 위에 구축되어 있으며, 더 복잡한 작업 관리 및 의존성 처리를 위해 설계되었으므로, 작업 추가 및 작업간 의존성이 큰 앱에서 유용할 수 있습니다.

    요약하면 , GCD는 간단한 비동기 작업에 적합한 더 저수준의 도구이고 , Operation Queue는 작업간의 의존성을 처리하고 관리하기 쉽도록 고수준 추상화를 제공합니다. 선택은 작업의 복잡성 , 관리 및 유지 관리 요구사항에 따라 달라집니다.

 

.

.

.

 

Delegate pattern 이란?

- 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로 ,

객체 간의 상호 작용을 캡슐화 하고 확장가능한 형태로 구현하는데 사용됩니다.

 

Delegate 프로토콜( Delegate Protocol ) : Delegate로 사용할 객체가 따라야하는 프로토콜을 정의합니다. 이 프로토콜은 해당 객체에서 구현해야 할 메서드나 프로퍼티를 선언합니다.
Delegate 속성( Delegate Property ) : 위임 객체(Delegate)를 가리키는 속성을 정의합니다. 이 속성은 Delegate 프로토콜을 따르는 객체의 인스턴스를 가리킵니다.
Delegate 메서드( Delegate Methods ) : Delegate프로토콜에서 선언한 메서드를 구현하고 , 위임 객체가 호출할 때 해당 동작을 수행합니다.

 

요약하면, Delegate패턴의 핵심은 , 하나의 객체가 다른 객체의 동작을 변경하거나 확장하기 위해 외부 도움을 받을 수 있게 하는것입니다.

 

예시 코드 👇

// 1. Delegate 프로토콜 정의
protocol SomeDelegate {
    func didSomething()
}

// 2. Delegate를 사용할 객체
class SomeObject {
    var delegate: SomeDelegate?
    
    func performAction() {
        // 어떤 작업 수행
        // 작업 완료 후 Delegate 메서드 호출
        delegate?.didSomething()
    }
}

// 3. Delegate 프로토콜을 따르는 다른 객체
class AnotherObject: SomeDelegate {
    func didSomething() {
        print("AnotherObject did something")
    }
}

// 4. Delegate 설정 및 사용
let someObject = SomeObject()
let anotherObject = AnotherObject()

someObject.delegate = anotherObject
someObject.performAction() // 출력: "AnotherObject did something"