[Objective-C] 카테고리 개념 ( Category )
http://soooprmx.com/wp/archives/2436#disqus_thread
-
기존에 정의된 어떤 클래스를 쉽게 확장할 수 있게 해준다.
카테고리를 적용하면, 이 녀석을 사용하는 녀석은 물론 상속받는 녀석까지 확장된 기능을 사용할 수 있다.
-
왜 이름이 카테고리냐하면...
범용적으로 사용되는 Class 를 확장해서 사용을 한다고 생각을 한다면, 이 기능 저 기능 다 쑤셔넣어서 유지보수가 어려운 코드가 될 수 있다.
이 녀석을 SomeClassA, SomeClassA+Network, SomeClass+Graphic 과 같이 카테고리화해서 확장해서 사용하는 것을 목적으로 설계되었기 때문에, 이 녀석을 카테고리라고 부른다.
-
header 파일은 아래와 같이 기존 class 명에 괄호를 하고 additional feature 부를 써 준다.
카테고리의 header 는 "기존ClassName+새로운기능” 의 형태로 naming 하는 것이 convention 이다.
SomeClass+AdditionalFeature.h
@interface SomeClass ( AdditionalFeature )
-(NSString*) doSomething;
@end
-
구현부 파일은 아래와 같이 정의하여 사용한다.
SomeClass+AdditionalFeature.m
#import “SomeClass+AdditionalFeature.h"
@implementation SomeClass
-(NSString*) doSomething{
}
@end
-
카테고리로는 원칙적으로 인스턴스 변수를 추가할 수 없지만, associated object 를 이용하여 유사한 효과를 낼 수 있다.
-
기존 class 에 정의되어 있는 함수를 재정의할 경우 카테고리에서 재정의한 녀석의 구현이 반영된다.
상속의 경우와 달리 super 로 접근하지 못하고, 기존의 구현 자체가 폐기된다고 보면 된다.
어떤 카테고리의 override 가 적용될지 확신할 수 없기 때문에 오버라이딩하는 것은 위험하다.
-
카테고리의 갯수는 제한이 없지만 이름이 모두 달라야 한다는 제약은 있다.
그리고 각 카테고리는 서로 다른 메소드들을 선언해야 한다는 제약도 있다.
어떤 것이 적용될지 알 수 없기 때문이다.
-
구현부 파일의 @implementation 부분 앞쪽에 추가적인 @interface 구문을 사용하고 카테고리 이름을 비워두는 방식을 사용하여,
클래스 확장을 할 수도 있다.
이는 private interface 라고 부르기도 하는데, 여기서 선언한 프로퍼티나 메소드들은 클래스 외부에서는 접근할 수 없고, 클래스 내부에서만 사용할 수 있다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] #3 메서드보다는 같은 일을 하는 리터럴 문법을 사용하라 (0) | 2017.07.20 |
---|---|
[Objective-C] Class Extension 으로 delegate 정의하기 (0) | 2017.07.19 |
[Effecitve Objective-C] #2 헤더에 헤더를 포함하는 것을 최소화하라 (0) | 2017.07.17 |
[Effecitve Objective-C] #1 Objective-C 의 기원과 친숙해져라. (0) | 2017.07.16 |
[iOS Study] 병렬 프로그래밍 가이드 ( dispatch source ) (0) | 2017.07.03 |
댓글