23.10.31 Grand Central Dispatch (GCD)와 Operation Queue의 차이점 / Delegate pattern 에 대한 설명
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"