[Swift] Protocol(프로토콜) vs Inheritance(상속)

Jay SJ Baek·2021년 3월 25일
0

Swift Basic

목록 보기
8/8
post-thumbnail

🎯 Protocol(프로토콜) vs Inheritance(상속)


📎 Protocol 및 Inheritance 되짚기

  • Protocol을 학습하며 지속적으로 학습한 내용은 'blueprint(청사진)이다', '공통 기능을 가진다' 등 입니다. 이러한 학습을 하며 자연스럽게 동시에 떠오르는 생각은 위의 특징이 클래스의 상속(inheritance)와 유사하다는 점이며 이 두가지 개념을 구분할 필요성을 느꼈습니다. 우선 구분을 하기 전, 각각의 특징을 상기할 필요가 있습니다.

    상속 : 상속받을 클래스의 모든 기능을 물려받는다.(부모의 모든 기능을 자식 클래스가 물려받는다)

    프로토콜: 프로토콜의 선언을 통해 이 프로토콜의 규약을 준수하겠다. 객체간의 소통 규약이다.

    위의 정의는 기본적인 것으로 정확한 차이를 이해하기 어렵습니다. 그래서 예시 상황을 통해 두 개념을 조금 더 알아볼 필요가 있습니다.


📂 예시를 통한 이해

위의 예시는 Employee라는 클래스로 고용된 모든 사람이 공통으로 가져야할 특징이 구현되어있고, PM, Developer, Tester라는 개개별의 피고용인이 해당 클래스를 상속받는 구조로 되어있습니다. 개념적으로 보면, Employee는 모든 고용인이 가져야할 내용이며 PM, Developer, Tester는 Employee의 특징을 그대로 갖습니다. 여기에 만약 아래의 코드가 Employee에 추가된다면 마찬가지로 모든 직원들이 아래의 코드를 가집니다.

만약 이렇게 작성된다면, PM 역시 위의 메소드들을 모두 갖게 되는데, 두 메소드 sendDevelopingReport()와 sendTestingReport()는 PM class와 무관하게 됩니다. 다시 말해, PM은 DevelopingReport와 TestingReport를 보낼 일이 없습니다. PM class는 getDevelopingReport()와 getTestingReport()만을 가져야 하기 때문에 위의 구조는 좋은 모델이라고 할 수 없습니다. 아래의 상황을 가정해보겠습니다.

이 모델을 다른 모델에서 사용하고, Developer class의 instance를 생성한다.

이 상황에서, getDevelopingReport를 어떻게 사용할지, 그리고 어떤 Developer가 제출한 report인지(어떤 Developer instance가 getDevelopingReport() 메소드를 호출했는지)가 헷갈리게 됩니다. 이런 문제의 상황에서 protocol의 구조를 사용하는 것이 더 적합하며, 문제를 해결할 수 있습니다.

위의 코드에서는 PM은 send할 필요가 없으므로 getDevelopingReport와 getTestingReport만 가지게 되고, Developer는 sendDevelopingReport만, Tester는 sendTestingReport 메소드만 가지게 됩니다. 즉, 공통적인 기능이나 개념은 상속을 통해 처리하고, 개별적인 개념은 프로토콜을 선언함으로써 개별 구현하여 필요없는 기능의 중첩을 막았습니다. 그러면 단순히 상속을 받고 추가로 그 클래스에 메소드를 구현해주는 것과 프로토콜을 선언하여 채택하는 것의 차이는 무엇일까요?

프로토콜 없이 class 안에 메소드를 구현하게되면 우선 강제성이 없어집니다. 즉, 프로토콜을 사용함으로써 매니저가 가져야하는 필수적인 기능, 개발자가 가져야하는 필수적인 기능, 테스터가 가져야하는 필수적인 기능을 명시함으로써 해당 기능을 구현해야만 하게 해주며 다른 클래스에서도 확장 사용 가능합니다. 또한 Swift는 다중 상속이 불가능한 언어로, 여러 클래스가 서로 다양한 공통점을 공유할 때 이를 명시적으로 표현해주기 위해서는 Protocol의 선언이 필요합니다.

📝 더 생각해보기

  • 상속의 상황에서 여러 객체들의 공통점만을 추상화한 것이 아니라, 여러 객체들의 정보들이 합해진 객체가 부모로 존재할 수 있습니다. 이런 경우, 상속을 통하면 원하지 않아도 부모의 정보를 모두 가져오게 됩니다. 이렇게 되면 자식 클래스 중 하나가, 원하지 않는 다른 자식 클래스만 가져야 하는 정보를 가져올 수 있고, 부모와 자식의 결합도를 증가시키는 문제가 됩니다.

reference: Protocol vs Inheritance

profile
iOS Developer

0개의 댓글