본문 바로가기
프로그래밍 놀이터/iOS

[Objective-C] 카테고리 개념 ( Category )

by 돼지왕 왕돼지 2017. 7. 18.
반응형

 [Objective-C] 카테고리 개념 ( Category )


http://soooprmx.com/wp/archives/2436#disqus_thread

+, @implementation, @interface, associated object, Category, category instance variable, class 명, header, Interface, naming convention, Objective-C, Overload, override, private interface, Super, syntax, [Objective-C] 카테고리 개념 ( Category ), 괄호, 메소드, 상속, 오버라이드, 원칙, 유사한 효과, 유지보수, 이름, 인스턴스 변수, 재정의, 카테고리 개념, 카테고리 갯수 제한, 클래스 확장, 확장 목적 설계, 확장된 기능


-

기존에 정의된 어떤 클래스를 쉽게 확장할 수 있게 해준다.

카테고리를 적용하면, 이 녀석을 사용하는 녀석은 물론 상속받는 녀석까지 확장된 기능을 사용할 수 있다.



-

왜 이름이 카테고리냐하면...

범용적으로 사용되는 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 라고 부르기도 하는데, 여기서 선언한 프로퍼티나 메소드들은 클래스 외부에서는 접근할 수 없고, 클래스 내부에서만 사용할 수 있다.




반응형

댓글