-
[Swift] Protocol Oriented Programming야매 iOS 2023. 8. 7. 06:53
OOP
- 클래스 상속을 사용해 해당 타입이 가진 공통적인 기능들을 모듈화해 구현
- 다중 스레드 환경에서 사용에 유의해야 한다 (race condition)이 발생할 수 있기 때문에
- 구조체/열겨헝은 클래스와 달리 상속이 불가하다.
→ 하지만 구조체/열거형과 같은 타입에 대해 공통적인 기능 구현을 위해서 다른 방법을 사용해야 한다.
Protocol & Extension
프로토콜 : 특정 역할을 수행하기 위한 메서드, 프로퍼티 등 사항들을 한 데 모아놓은 청사진
익스텐션 : 기존 타입의 기능을 확장하도록 도와주는 기능
만일 특정 프로토콜을 정의하고 여러 타입에서 해당 프로토콜을 채택해 각 타입마다 똑같은 내용들을 구현해야 한다면 얼마나 많은 코드들이 중복되는가?
- 추후 이를 유지보수한다면 정의한 모든 데이터 타입의 코드를 일일이 변경시켜줘야 한다.
→ 프로토콜과 익스텐션을 결합한 프로토콜 초기 구현
프로토콜 초기 구현
구현해야 할 내용이 담겨있는 프로토콜과 타입의 기능을 확장시켜주는 익스텐션의 결합으로 만들어진다.
프로토콜을 채택한 타입의 정의부에서 일일이 모든 프로토콜 내 요구사항을 구현할 필요 없이 익스텐션을 통해 미리 프로토콜의 요구사항을 구현해 놓을 수 있다.
- 변형하고 싶다면 재정의해서 사용할 수 있다.
Protocol 적용 방법
Protocol extension
Protocol inheritance
Protocol Composition
POP 장점
가볍고 안전하다
- 상속의 경우, 참조 타입이므로 참조 추적을 위한 비용이 많은 발생하기 때문에 속도 측면에서 다소 느리다.
값 타입의 상속 효과
- Value 타입임에도 불구하고 클래스처럼 공통된 기능들을 쉽게 구현할 수 있다.
수직 구조 확장이 아닌 수평 구조의 기능 확장
- Class의 경우 자식 클래스는 하나의 부모클래스만 상속할 수 있으며 수직적인 구조를 갖는다.
- 하지만 프로토콜을 수평구조로 기능을 확장시킬 수 있다.
제네릭과 연관값
- Associated Type을 제공해 데이터 타입 관계없이 기능을 제공할 수 있다.
'야매 iOS' 카테고리의 다른 글
[iOS] Certificate & Provisioning (0) 2023.08.07 [Swift] some & any (0) 2023.08.07 [iOS/Swift] @StateObject vs @ObservedObject (0) 2023.08.07 [iOS/Swift] Operation (0) 2023.08.06 [iOS/Swift] 동시성 문제 (0) 2023.08.06