'카테고리'에 해당되는 글 1건

  1. 2010.06.21 [펌] 프로토콜과 카테고리 : 오브젝티브 C에 대해서..
오브젝트C2010. 6. 21. 09:31
[펌] 프로토콜과 카테고리 : 오브젝티브 C에 대해서..
프로그램을 직접 짜는 것을 처음 접하는 분들 중에서
 
프로토콜과 카테고리가 왜 필요한가 의문이 드시는 분들이 있을 거라고 생각되요
 
그래서 올려요
 
옮긴 책: 예제로 시작하는 아이폰 개발

프로토콜

오브젝티브C는 자바처럼 다중 상속을 지원하지 않습니다. 그러면 자바의 인터페이스와 같이 구현해야 하는 메소드의 정의를 할 수 있는 방법이 필요합니다. 그와 같은 것이 프로토콜protocol입니다. 간단하게 프로토콜은 구현해야 하는 메소드의 정의의 묶음입니다. 그리고 클래스는 여러 개의 프로토콜을 구현할 수 있습니다. 그렇지만 앞서 이야기한 것처럼 오브젝티브  C는 매우 자유롭습니다. 프로토콜을 사용하지 않고 해당 프로토콜의 메소드를 구현해도 잘 사용할 수 있습니다. 프로토콜을 사용할 경우의 이점은 밖에서 확인이 가능한 것입니다. 타입체크가 가능한 것이죠. 예를 보겠습니다.

@protocol Archiving
- read: (Stream *) stream;
- write: (Stream *) stream;
@end

프로토콜 Archiving의 정의입니다. 간단하죠? 이제 실제 사용을 보겠습니다.

@interface MyClass: MySuperClass<Archiving>
@end

이 MyClass는 MySuperClass를 상속받고 추가로 Archiving 프로토콜을 지원한다고 정의했습니다. 이제 실제 구현에서 read: 메소드와 write: 메소드를 구현해야 합니다.

======================================================

카테고리

오브젝티브C의 자유도를 보여주는 단적인 예 중 하나인 카테고리입니다. 카테고리는 기존에 존재하는 클래스를 상속받지 않고 메소드를 추가하는 방법입니다. 예를 들면 애플리케이션 개발에 문자열을 사용하는 데 항상 이 문자열에 추가로 필요한 메소드가 있는 경우, 기존 문자열에 사용한 클래스를 상속받아 자신의 클래스를 구현하지 않고 바로 메소드를 합니다. 예로 NSString을 보겠습니다.

@interface NSString (URLSupport)
-(BOOL) isURL;
@end

이렇게 카테고리를 정의합니다. 클래스 정의와 매우 흡사합니다. () 안이 카테고리 명입니다. 특별히 조건은 없습니다만 추가하는 메소드를 예상할 수 있는 것이 좋습니다. 이제 구현은 다음과 같이 합니다.
@implementation NSString (URLSupport)
-(BOOL) isURL
{
return YES;
return NO;
}
@end
아주 유용합니다. 이제 사용하고 싶을 때 간단히 [unknownString isURL] 이렇게 사용하시면 됩니다. 주의할 점은 애플리케이션 전체에 영향을 준다는 점입니다. 그러니깐 위와 같이 개발하면 애플리케이션 내의 모든 NSString이 isURL 메소드를 가지게 되는 것입니다.




출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110086446844
Posted by 오늘마감

댓글을 달아 주세요