POP와 OOP는 공통적으로 다형성을 통해 코드들의 재사용성을 높이고, 이를 통해 기존보다 더욱 생산적이고 클린한 구조의 설계를 이끌어내도록 도와줍니다. OOP는 상속을 통해 수직적인 확장을 하는 반면 POP는 수평적인 확장이 가능하고, 객체뿐만 아니라 구조체와 열거형에도 사용이 가능하다는 장점이 있습니다. 그리고 OOP의 슈퍼클래스와 서브클래스의 의존적인 관계와는 달리, POP는 프로토콜에 정의된 인터페이스만 구현하면 되고 이를 따르는 사이들끼리도 깊게 연관되어 있지 않아 서로 독립적이며 안전합니다. 마지막으로 상속과 달리 다수의 프로토콜을 채택할 수 있고, 물려받는 개념이 아니므로 다중 상속 시의 문제점인 죽음의 다이아몬드 이슈에서 자유롭습니다.
과도하게 프로토콜을 사용할 경우 코드가 너무 복잡해지고 가독성이 떨어져 유지 보수가 오히려 어려워집니다. 그렇기 때문에 개발자는 스스로 판단하여 꼭 필요한 경우에만 도입하는 것이 좋습니다. 그리고 너무 추상화된 프로토콜은 오히려 스스로 제약이 생기므로 피하는 것이 좋은데 만약 기존에 채택된 프로토콜인데 추가적인 코드를 넣어 다른 곳에서도 사용하려는 경우라면 호환성을 위해 새로운 프로토콜을 도입하는 것이 더 좋은 방법이라고 생각합니다.
프로토콜 확장을 통해 기존의 프로토콜에 새로운 기능을 추가하거나, 이미 채택된 기능에 대해 기본 구현을 제공하는 방법으로 코드의 재사용성을 높일 수 있습니다. 실제 앱을 출시할 때 Realm과 통신하는 부분의 코드 중 Save, Delete와 같이 공통적으로 사용하는 기능에 대해서는 프로토콜 확장을 통해 재사용성을 줄인 경험이 있는데 상속과 달리 슈퍼클래스에 대한 의존성도 없고 다중 채택이 가능해서 활용하기 훨씬 용이하였습니다.