출처: Objective‐C Language Reference 박종암 jongampark@gmail.com
protocol의 이용부분부터는 박종암님의 pdf를 보고 썼음.. 문제있으면 알려주세요~

Protocol의 종류 : Informal Protocol


Category 선언내에 method를 선언하면 그게 바로 informal protocol이 된다.

@interface NSObject ( RefCounting )
- (int)refCount;
- incrementCount;
- decrementCount;
@end

위의 예에서 볼 수 있듯이, informal protocol은 대개 NSObject 클래스에 대한 카테고리로써 선언한다. 그렇게 하면, NSObject에서 나온 새끼 클래스들이 모두 다 사용할 수 있기 때문이다. 물론 다른 클래스에 대한 category로써도 정의할 수 있다. 그럼 그 클래스에서 나온 클래스들만 사용할 수 있다.
여기서 주의할 점은, 카테고리 interface를, protocol을 선언하기 위해서 쓸때는, 거기에 상응하는 implementation을 가지지 않는다는 점이다. 대신에 그 method들을 가지는 protocol을 구현하는 클래스들이 그 자체의 interface 파일에서 다른 method들과 마찬가지로 구현하게 된다.
다시 말해보자. 생긴 걸로 봤을때, informal protocol은 Category와 완전히 같다. 단지 차이점은 Category는 구현에 대한 부분도 역시 카테고리로 만들어서 넣어주나, informal protocol일 경우엔 그 구현을 해당 클래스에서 method로 직접 해 준다는 것이다.
또한 informal protocol은 category를 선언하는 방식을 좀 바꿔서 method들의 리스트를 써 놓기는 하지만 어떤 특정 클래스나 구현에 고정시켜 놓지는 않는다.
informal protocol은 구현하기가 이렇게 편하다. 하지만 단점이 있게 마련이다. 편한거치고 단점없는게 어디 있겠는가? 즉 language로부터 그다지 많은 지원을 받지 못한다. 표로 정리해 보자.

compile time시  :  type checking을 하지 않는다
run time시   :   한 객체가 그 protocol을 conform(준수)하는지 알수 없다.

이런 단점이 싫다면 그때는 다음에서 알아볼 formal protocol을 사용하면 된다. 그럼 이런 informal protocol은 언제 쓰면 좋을까? 그건, protocol에 정의된 method들을 구현하는게 굳이 필요하지 않을때이다. 즉 delegate같은 것을 구현할 때 쓰면 편하다. 즉 다른 객체 대신에 일을 수행하는 객체를 만들때 좋다.

NOTE : 엄밀하게 보면 informal protocol은 없는 것으로 보인다. 이것은 Category의 다른 이용일 뿐이다. Category와의 차이점은 앞에서도 나와 있지만, 그 구현을 클래스내에 하느냐 아니면 따로 준비된 곳에 하느냐의 차이이다. 필자가 Objective-C를 처음 접하면서, 처음엔 참 쉽게 잘 만들어졌다고 생각하면서도 한동안 보지 않다가 다시 보면 헷갈리고, 복잡하다고 여긴 부분이 바로 이 부분때문이다. syntax로 category와 informal protocol이 명확하게 구별이 안된다.
또한 그 사용 목적도 그렇다. Category의 원목적이 이미 있는 클래스에 뭔가를 더 추가해 넣을때, 그리고 attribute/property가 아닌 behaviour로 클래스들을 구분할 때 쓰기 위함인데, 결국 protocol과 비슷하지 않은가? protocol도 그 protocol을 conform하는 것끼리의 구별하는 목적이 있다. Objective-C는 NeXT의 몰락과 함께 사실 그 명맥이 다했으며 C++처럼 활발한 개발과 확장, 혹은 정제가 이루어지지 않았다. 언어의 간결함에 대해선 C++보단 더 좋으나, 뭔가 아직 미완성인 듯한 느낌이 나는 부분이 바로 이 부분이다. 앞으로 Apple이 다시 이 Objective-C를 발전시켜 나가면 좋겠다.

--> 안 쓰는게 좋을 듯 함... category와 protocol의 명확한 사용을 위해서...