[Objective C] Protocol

프로그래밍/iPhone Dev 2009. 11. 20. 15:35 Posted by galad
Protocol

- 클래스랑 관련 없는, method 선언의 모음
- protocol로 선언된 method를 써야 할 필요가 있다면, 그 클래스는 해당 protocol을 쓰겠다고 하고(adopt), 그 method를 자체 내에서 구현하면 된다.
- 보통 protocol은 관련있는 메소드들 끼리 모아 놓게 된다. 그러므로 어떤 클래스가 그 protocol을 사용하겠다고 하면, 그 클래스는 그 "통신 규약"을 이해하는 클래스가 된다.
  -> protocol에 정의된 메소드들이 통신 규약이 되고, 그 protocol을 사용하는 클래스는 반드시 정의된 메소드들을 구현해야 되므로 통신 규약을 이해하는 클래스가 된다.

- dynamic language의 입장에서 볼때, class를 inheritance와 category에 의거한 "어디에서 상속을 받았나"로 클래스들을 구분해 놓는 것 뿐만 아니라, protocol로 인해서 어떤 클래스들이 서로 비슷한 행동을 하나라는 동적인 구분까지 가능하게 해 준다.
- 아예 클래스의 종류가 다른 것까지도 서로 protocol을 지키면 해당 메시지를 처리하는 것도 가능.

- 언제 protocol을 사용하게 되는지 정리해 보자.
  > 다른 프로그래머들이 구현하게 될 메소드의 선언 (Apple 문서에서 따온 말). 하지만 이 말보다는 "다른 프로그래머들에게 구현하라고 유도해야 할 메소드들의 선언"이라고 하는 편이 더 맞겠다.
  > 오브젝트의 클래스 자체는 숨기면서 그에 대한 인터페이스를 만들어야 할 때.
  > 계층적으로는 전혀 상관 없는 클래스들이지만 뭔가 상호연관성을 가지게 해야 할 필요가 있을때.

- 어떤 한 객체 A 가 있는데, 그것이 helpout이라는 메시지를 다른 객체 B에 보내서 어떤 일을 수행해 달라고 요청한다고 하자. 이때 현재 코딩하고 있는 객체 A에 다음과 같은 함수를 이용해서 객체 B를 기록해 놓을 수 있겠다.
- setAssistant:anObject
{
    assistant = anObject;
}
그리고 이 객체에 메시지를 보낼때는, 그 메시지를 처리하는 측에선 자신이 그 메시지를 처리할 수 있는지를 검사하는 루틴을 넣어야겠다.
- (BOOL)doWork
{
    ...
    // helpOut이라는 메시지에 해당 객체, 즉 assistant가 가르키고 있는 객체가 반응을 하는지를 알 수 있다.
    if ( [assistant respondsTo:@selector(helpOut:)] )
    {
        [assistant helpOut:self];

        return YES;
    }
    return NO;
}
  -> 객체B, 즉 assistant가 protocol을 따르도록 하라는 건지? 이 예제만으로는 protocol과는 관련이 없는데?
  > Apple의 문서에서는 protocol을, 정의되어 있지 않은 객체에 메시지를 전달하고자 할 때 쓸 수 있다라고 되어 있다. 즉 아직 만들지 않은, 혹은 다른 사람이 작업하고 있어서, 그 클래스의 구조를 정확하게 모를때, 그 클래스에 어떤 메시지를 전달하는 여러분의 루틴을 만들 수 있다는 말이다. Objective-C는 이렇듯 대상에 대한 정보가 없어도 되는 메커니즘을 가지고 있다.
  -> 이거에 대한 예제라면 OK. 객체B, 즉 assistant의 구조를 몰라도 메시지-helpOut-에 반응하는지를 동적으로 체크해서 전달 가능.