본문 바로가기
프로그래밍/Xcode-iOS

Objective-C 프로토콜 정의

by Mr-후 2017. 11. 1.
반응형

Objective-C 프로토콜 정의


아이폰앱 개발하면서 가장 유용하게 사용하는 것 중 하나가 바로 '프로토콜'이 아닌가 싶다. delegate를 통한 대리자에게 처리를 넘기는 방식인데 잘 만들어 두면 재미가 쏠쏠하다. 


'프로토콜 정의' 는 메서드만 정의하는 즉, 인터페이스를 정의하는 기능이고 이 인터페이스를 구현하는 쪽은 프로토콜을 따르는 쪽에서 구현해서 처리를 하면 된다. 

프로토콜의 메서드는 @required와 @optional 이 있고, 프로토콜을 따른다고 선언한 곳에서는 @required로 선언된 메서드는 반드시 구현을 해야만 한다고 알고 있다. ㅎ 

프로토콜이 클래스와 다른 점은 클래스는 하나의 틀이 되고 프로토콜은 틀이 아닌 일련의 메서드를 선언한다는 점이 다르다. 


정의 하는 방법은 다음과 같다. 

보통 클래스 .h파일 상단이나 하단에 해당 클래스의 부수적인 결과 처리나 해당 클래스를 사용하는 다른 클래스와의 커뮤니케이션을 위해 선언하며, 해당 프로토콜 메서드가 호출될 때 자신(클래스)이나 특정 데이터를 함께 인자로 전달하는 방식이다. 


일반적인 프로토콜 정의

@protocol 프로토콜명 

@required or @optional

- 메서드 정의 

@end 


다른 프로토콜을 따르는 프로토콜의 정의

@protocol 프로토콜명<프로토콜 리스트>

-메서드정의

@end 


프로토콜을 따르는 클래스의 정의 

@interface 클래스명 : 부모클래스명<프로토콜 리스트>

{

    인스턴스 변수 정의 

}

-메서드정의 

@end 


프로토콜을 따르고 카테고리가 추가된 클래스 정의 

@interface 클래스명 (카테고리명) <프로토콜 리스트>

-메서드정의 

@end 

그림은 얼마전까지 프로젝트를 진행했던 회사의 프레임워크 I/F작업에서 프로토콜을 선언해서 프레임워크를 사용하는 쪽에서 어떤 처리가 필요할 때 호출 되도록 delegate를 받고 delegate의 인스턴스 메서드를 호출해주는 방식으로 진행 했었다. 

사용하는 쪽에서는 다음과 같이 사용한다. 

우선 @interface에서 <프로토콜>을 따르겠다고 선언을 한다. 

그리고 프로토콜 메서드를 구현해두면 프로토콜이 선언된 클래스가 delegate를 통해 선언된 메서드를 적절하게 호출해주게 될 것이다. 

특정 모듈의 동작이 끝난 뒤 어떤 처리가 필요하거나 데이터를 주고 받고 할 때 사용할 수 있겠다. 

콜백 인터페이스와 같은 방법으로 사용하는 것 이 좋다. 잘 만들어진 예는 UITableView 의 DataDelegate와 DataSource부분을 참고한다면 훌륭한 학습 예제가 되지 않을까 싶다. 


delegate가 해당 프로토콜 메서드를 구현했는지 체크는 다음과 같이 하면 된다. 

            if (self.delegate && [self.delegate respondsToSelector:@selector(ubPayFinishedWithQR:)]) {

               [self.delegate ubPayFinishedWithQR:@""];

            }



반응형