본문 바로가기

C/Objective C/Objective C

Objective C protocol(프로토콜)

프로토콜

‘프로토콜’은 클래스 사이에서 공유되는 메서드 목록이다. 프로토콜에 나열된 메서드들은 해당하는 구현 부분이 없다. 프로그래머가 구현하도록 되어 있다.
프로토콜은 특정 이름과 관련된 메서드 모음을 정의하는 방법을 제공한다. 이 메서드들은 보통 문서화되어 어떤 식으로 동작하는지 알려 준다. 그 덕에 프로그래머가 원하다면 자신의 클래스 정의에서 이것들을 구 현할 수도 있다.

만일 특정 프로토콜에서 요구하는 메서드를 모두 구현하기로 했다면, 이는 프로토콜을 ‘따른다’ 혹은 ‘받아 들인다’고 말한다.
프로토콜을 정의하기는 쉽다. 그저 프로토콜 이름 앞에 @protocol 지시어를 붙이면 된다. 그 다음에 인터 페이스 부분에서 한 것과 동일하게 메서드를 선언하면 된다. 그러면 @end 지시어가 나오기 전까지 메서 드는 모두 프로토콜의 일부가 된다.

만일 Foundation 프레임워크를 사용한다면 이미 정의된 몇몇 프로토콜을 발견할 수 있다. 그중 하나인 NSCopying은 클래스에서 copy(혹은 copyWithZone:)메서드로 객체 복사를 지원할 때 구현해야 할 메서 드를 선언한다.
표준 Foundation 헤더파일 NSObject.h에서 NSCopying 프로토콜이 어떻게 정의되었는지 보자.

@protocol NSCopying -(id)copyWithZone: (NSZone *) zone; @end

만일 클래스에서 NSCopying 프로토콜을 받아들이려면 copyWithZone:이라는 메서드를 구현해야 한다. 컴파일러에게 프로토콜을 받아들인다고 알려주려면 @interface 줄에 프로토콜의 이름을 꺾쇠(<>)로 감싸 야 한다. 프로토콜 이름은 클래스 이름과 부모 클래스 이름 다음에 자리 잡는다.

@interface AddressBook: NSObject <NSCopying>
이 코드에서는 AddressBook 객체는 그 부모가 NSObject이고 NSCopying 프로토코를 따른다는 것을 보 여 준다. 프로토콜에 정의된 메서드에 대해 시스템이 이미 알고 있기 때문에 (이 경우 NSObject.h 헤더파 일에서 알아낸다) 인터페이스 부분에서 메서드를 선언하지는 않는다. 그러나 구현 부분에서는 메서드를 정 의해 줘야 한다.
프로토콜을 사용하면, 당신이 만든 클래스의 서브클래스를 만드는 사람들이 구현하고자 하는 메서드를 정 의할 수 있다.
예를 들어 GraphicObject 클래스를 위한 Drawing 프로토콜을 정의할 수 있다. 그 안에 다음과 같이 그 리기, 지우기, 테두리 그리기 등의 메서드를 정의하는 것이다.

@protocol Drawing -(void) paint; -(void) erase; @optional

-(void) outline;

@end
Graphic Object 클래스를 여러분이 만들었더라도, 이 그리기 메서드들을 반드시 직접 구현해야 하는 것은 아니다. 그러나 GraphObject 클래스의 서브클래스를 만드는 사람이 있다면 그가 만들고자 하는 그림 객 체의 표준을 따르기 위해 구현해야 하는 메서드를 지시해 줄 수 있다.
@optional 지시어 다음에 위치하는 메서들은 선택 사항이다. @required를 사용하면 필수 메서드 목록을 다시 작성할 수 있다.