본문으로 건너뛰기

프로토콜 컴포지션

프로토콜 컴포지션Protocol Composition은 타입이 여러 프로토콜을 채택할 수 있게 해준다. 이는 클래스 계층 구조 대신 프로토콜을 사용할 때 얻을 수 잇는 가장 큰 장점이다. 스위프트나 다른 단일 상속 언어에서 클래스는 한 개의 슈퍼클래스만 상속할 수 있기 때문이다.

struct MyStruct: ProtocolOne, ProtocolTwo, ProtocolThree {
// implementing requirement
}

프로토콜 컴포지션은 매우 단순한 개념이지만 프로토콜지향 프로그래밍에서 꼭 필요한 개념이다. 프로토콜 컴포지션은 모든 요구 사항을 단일 프로토콜이나 단일 클래스에서 상속하지 않고 요구 사항을 여러 작은 컴포넌트로 나눌 수 있게 해준다. 타입군type families의 높이를 증가시키기보다 너비를 증가시킨다. 이는 해당 프로코톨을 따르는 타입 모두가 필요로 하는 요구 사항이 아닌 것을 포함하는 비대한 타입을 생성하는 것을 피하게 해준다.


위의 클래스 계층 구조를 예로 들어보자. Athlete 라는 기본 클래스가 있고, 하위에 AmateurPro 인 두 개의 서브클래스가 있다. 그 하위에는 각 서브클래스 별로 FootballPlayerBaseballPlayer 를 의미하는 서브클래스를 갖는다. AmFootballPlayer, AmBaseballPalyer, ProFootballPlayer, ProBaseballPlayer

이 예와 같은 구조는 이러한 클래스 간에 수많은 중복 코드를 갖게 요구하게 된다.

하나의 슈퍼클래스로부터 모든 기능을 상속받는 서브클래스를 갖는 대신, 프로토콜 컴포지션을 사용하면 타입에서 믹스앤매치가 가능한 프로토콜 컬렉션을 갖게 된다.


타입의 필요에 따라 한 개 이상의 프로토콜을 사용할 수 있다. 프로토콜 컴포지션은 타입의 요구 사항에 대해 매우 구체적으로 될 수 있게 해주며, 필요한 요구 사항만 채택할 수 있게 해준다.

struct AmFootballPlayer: Athlete, Amateur, FootballPlayer {}
struct ProBaseballPlayer: Athlete, Pro, BaseballPlayer {}

한두 개 정도의 요구 사항만을 포함하는 프로토콜을 여러 개 생성한다면 너무 세밀하게 만드는 것이다. 이러한 방식은 유지나 관리를 어렵게 만드는 설계로 이어질 수 있다.