[프로그래밍 패러다임] 프로토콜 중심 패러다임(POP)

유재경·2021년 6월 13일
0
post-thumbnail

정의

Swift 2.0에서 언급된 새로운 패러다임으로, 프로토콜 확장/상속/조합 등 프로토콜을 이용해서 설계하는 프로그래밍 기법이다.

프로토콜 지향 프로그래밍에서는 value type인 struct나 enum을 권장하고 있습니다.

애플 공식 문서에 따르면, 프로토콜의 정의는 다음과 같습니다.

A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of those requirements

프로토콜이란 특정 작업이나 기능을 수행하기 위한 메소드, 프로퍼티, 다른 조건들의 청사진을 정의한 것입니다. 내가 특정 기능을 구현하려면 반드시 이걸 따라야 하는 명세서가 있으면 좋겠다는 것이죠. 프로토콜은 class, struct, enum에 의해 채택될 수 있다고 하네요

(추상화) <- 프로토콜 - 클래스 - 객체 -> (구체화)로 표현될 수 있습니다. 프로토콜 지향 프로그래밍은 프로토콜과 클래스의 차이점을 이해하는 것이 선행되어야 합니다. 왜냐하면 클래스 상속의 한계가 그 등장 배경이기 때문입니다.

"서로 다른 클래스에서 상속받은 클래스는 동일한 기능을 구현하기 위해 코드가 중복되는데 어떻게 해결하지?", "참조 타입으로 인해 동적 할당과 참조 카운팅에 많은 자원을 소모하게 되는데 이를 줄일 수 없나?", "의도하지 않았는데 상속했다는 이유로 모든 속성과 행위를 공유해야 하는가?"

특징

가벼움과 보안성

클래스는 reference type이므로 Heap에 저장되고 이는 개발자가 동적으로 할당해야 하며, Stack보다 느리고, 자원을 더욱 소모합니다. 프로토콜 지향 프로그래밍은 Stack에 저장되는 value type을 사용하기 때문에 시스템 비용이 적습니다. 또한, 클래스는 모든 api에 접근 가능한 반면, 프로토콜은 정의한 api만 가져오기 때문에 보안성 측면에서 낫습니다.

다중속성과 수평확장

클래스는 SuperClass 하나만 상속 가능한 수직적인 확장 구조입니다. 하지만 프로토콜은 여러 개를 채택함으로써 필요한 부분만을 수평적으로 확장시킬 수 있습니다.

Value Type 상속

class뿐만 아니라 struct, enum 또한 프로토콜을 채택할 수 있어 value type도 상속받을 수 있기 때문에 멀티스레드 환경에서 thread-safe하며, OOP보다 확장 측면에서 보다 유연합니다. swift에서는 대부분 class가 아닌 struct로 구현되어 있으며, 상속이 되지 않는 struct가 공통 기능을 가질 수 있는 방법으로는 프로토콜과 익스텐션 덕분입니다. 여기에 Generic과 결합하면 더욱 유연해집니다. Protocl + Extension + Generic을 조합하면 환상이라고 합니다.

한계

  1. Objective-C 프로토콜에 Swift Extension을 붙여도 Protocol default implimentation이 구현되지 않습니다.
  2. 자주 사용되는 Delegate, DataSource 등 프레임워크 프로토콜에는 기본 구현이 불가합니다.

(출처 https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
https://academy.realm.io/kr/posts/protocol-oriented-programming-in-swift/)

profile
iOS 개발

0개의 댓글