본문 바로가기

Objective-C 기초

프로토콜 (Protocol)

반응형
프로토콜 (Protocol)
: C와 C++의 Virtual Class를 떠올리면 됨.

클래스 구성을 다시 짚어보면, 클래스는 인터페이스(.h)와 구현(.m)의 결합. 인터페이스는 외부의 사용설명서 역할을 하였음.


프로토콜구현부가 없음. 헤더 파일만 존재.

클래스에서 프로토콜을 '채택'하여 기능을 구현.


클래스의 구현부에서 프로토콜 메소드를 정의한 후에, 사용은 일반 클래스 메소드처럼 호출하면 됨.


프로토콜에 프로퍼티도 선언 가능하나, 클래스에서 채택 후  getter/setter나 synthesize 만들어야함.


클래스에서 채택 후 필수로 구현해야할 요소는 프로퍼티 선언부에서 @required 이후에 명시하면 되고,

선택사항은 @optional 아래에 명시하면 됨.


[프로토콜 생성]


[프로토콜] Bark.h

#import <Foundation/Foundation.h>


@protocol Bark <NSObject>


@required//필수 요소

+(void)bark; //채택한 클래스 구현부에서 메소드 정의해서 클래스 메소드처럼 사용하면 됨.


@optional//선택 요소

@property int old; //어떻게 쓸 건지, 채택한 클래스에서 getter/setter 혹은 synthesize 필요.


@end


프로토콜에서는 선언만 해두고 끝. 클래스에서 채택해서 정의.


@required, @optional는 안써도 됨. 구분이 필요하다면 명시.


[클래스] Cat.h (선언부)

#import <Foundation/Foundation.h>

#import "Bark.h" //protocol 헤더 import


@interface Cat : NSObject <Bark> //Bark 프로토콜을 받겠다.

@end


클래스 선언부에서 1)프로토콜 헤더파일을 import하고 클래스 상속 옆에 2)<프로토콜명> 으로 프로토콜 채택.


[클래스] Cat.m (구현부)

#import "Cat.h"


@implementation Cat

+(void)bark{            //Bark.h 프로토콜의 bark메소드 정의

    NSLog(@"\n야옹~!\n");

}


@synthesize old; //Bark.h 프로토콜의 old property의 getter/setter 생성.


@end


클래스 구현부에서 채택한 프로토콜의 내용을 정의.

Bark.h 프로토콜의 내용을, Bark프로토콜을 채택한 Cat.h클래스에서 내용을 정의.


[실행 코드] main.m

#import <Foundation/Foundation.h>

#import "Cat.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        [Cat bark];

        

        Cat *my_cat = [[Cat alloc] init];

        my_cat.old = 2;

        NSLog(@"\nmy cat's old is %d\n", my_cat.old);

    }

    return 0;

}


프로토콜(Bark.h)은 클래스에서 임포트하므로, 실행코드에서는 Cat.h 클래스만 임포트하면 됨.


==> 결과 :

2019-02-16 11:43:00.376960+0900 Study[1013:109146] 

야옹~!


2019-02-16 11:43:00.377212+0900 Study[1013:109146] 

my cat's old is 2

Program ended with exit code: 0



프로토콜이 프로토콜을 채택할 수도 있고,

클래스 혹은 프로토콜이 다른 여러 프로토콜을 채택할 수도 있음.


[클래스에서 여러 프로퍼티 채택]

@interface Cat : NSObject <Bark, Jump> //Bark와 Jump 총 2개의 프로토콜 채택

@end


[프로토콜이 다른 프로토콜을 채택]

@protocol Entertaining <Singing, Dancing>

-(void) amuse;

@end



반응형