Protocol 이용 : 비계층적 유사성(Non-Hierarchical Similarities)

- 여러 클래스가 같은 method를 구현하게 된다면, 그런 클래스들은 한 abstract class 밑으로 들어갈 수 있으며, 그 abstract class에서 공통된 method들을 선언해 놓게 된다. 각각의 sub class에선 그런 method들을 각각의 용도에 맞게 구현하면 된다. 이렇게 함으로써 그런 클래스들은 상속에 의한 계층적 구조에서, 그리고 같은 abstract class를 그 조상으로 한다는 점에서 유사성을 가지게 된다.
- 하지만 때때로 abstract class에 공통적인 method를 다 잡아 넣을 수 없는 경우도 있다. 이를테면, 전혀 관련이 없는 클래스들이지만 유사한 method를 가지고 있을 수도 있는 것이다. 이럴 경우에 상속관계로 묶어 놓기엔 좀 곤란할 수 있을 것이다. 예를 들어, 완전히 다른 클래스들에 reference counting을 위해서 어떤 method를 구현해 넣는다던가 하는 것이 그런 예겠다.
- setRefCount:(int)count;
- (int)refCount;
- incrementCount;
- decrementCount;
이런 것들은 프로토콜로 묶어 놓을 수 있겠다. 그리고 저런 프로토콜이 필요한 클래스에선 그 프로토콜에 conform하게끔만 해 놓으면 되는 것이다.

- 객체는 class가 아니라 protocol로써 type을 구분할 수도 있다는 점
예를들어, NSMatrix가 그 서브 객체인 cell들과 뭔가 주고 받아야 한다고 하자. NSMatrix는 각 서브 객체들이 NSCell 라는 종류이어야만 하고, 그러므로 각 서브 객체들이 NSMatrix에서 오는 메시지에 반응하는 method를 가진, NSCell에서 상속을 받어야 할 것이다.
하지만 여기서 protocol의 개념을 이용하면, 굳이 같은 NSCell 클래스에서 나온 class가 아니더라도, 어떤 특정의 메시지에 반응하도록 만들어진 method를 conform하도록만, 서브 객체인 cell들이 구성되어 있다면 상당히 유연한 코딩이 가능해진다.

  -> 결국 전혀 관련 없는 클래스들 - 부모클래스 등이 같지 않는, 전혀 다른 상속 관계에 있는 - 도 protocol을 이용하면 묶을 수 있다는 점.
   굳이 상속하지 않아도 되므로 유연하다는 점 등이 장점인 듯.