프로토콜은 구현부가 없음. 헤더 파일만 존재.
클래스에서 프로토콜을 '채택'하여 기능을 구현.
클래스의 구현부에서 프로토콜 메소드를 정의한 후에, 사용은 일반 클래스 메소드처럼 호출하면 됨.
프로토콜에 프로퍼티도 선언 가능하나, 클래스에서 채택 후 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
'Objective-C 기초' 카테고리의 다른 글
NSData 다루기 (바이너리 데이터 저장/복원) (0) | 2019.02.18 |
---|---|
아카이빙(Archiving) (0) | 2019.02.16 |
클래스 내부 구성요소 숨기기 (0) | 2019.02.15 |
카테고리 Category (0) | 2019.02.15 |
ARC, Objective-C 메모리 관리 방법 (0) | 2019.02.15 |