- Objective-C 에서는 클래스 클러스터를 만들기 위한 언어 자체의 매커니즘은 없다. 하지만 일반적으로, 공개클래스는 추상 클래스로, 구체적인 클래스는 공개 클래스의 비공개 서브 클래스로 구현되어 있음.
- Cocoa에서 많은 클래스가 실제로는 클래스 클러스터로 구현되어 있다. 대표적으로 NSData, NSDate, NSArray, NSDictionary, NSSet, NSString, NSNumber, NSValue 등이 있다. 이들 클래스는 일반적인 방법으로 서브 클래싱을 할 수가 없다.
- 클래스 클러스터 인스턴스의 소속을 확인할 경우.
- 클래스 클러스터에서 각 인스턴스는 비공개 서브 클래스의 인스턴스이다. 따라서 공개 클래스를 인수로 한 메소드 isMemberOfClass:를 사용해도 어떤 결과가 나올지 알 수 없다. 인스턴스가 속하는 클래스를 확인하기 위해서는 isKindOfClass:나 respondsToSelector:로 확인하는것이 바람직하다.
- 서브 클래스를 만드는 경우 밑에 두가지 방법이 있다.
1) True Subclass
1. 비공개 데이터 구조를 결정한다.
- 인스턴스 변수로 가질 데이터 구조를 결정한다. 슈퍼 클래스인 클래스 클러스터가 가지는 데이터 구조는 절대 사용하면 안됨.
2. 이니셜라이저를 정의한다.
- init 이외의 슈퍼클래스의 이니셜라이저를 상속받아 사용하면 안됨. 비공개 데이터 구조가 없다면 init을 사용하면 되므로 이니셜라이저의 정의는 필요 없음.
3. 컨비니언스 컨스트럭터를 정의한다.
- 필요할 경우, 데이터 타입명으로 시작하는 임시 객체를 생성하는 클래스 메소드를 정의합니다. 슈퍼 클래스의 같은 메소드를 상속받아 사용하면 안됩니다.
4. 원시(primitive) 메소드를 정의한다.
- 원시 메소드는 각 클래스 클러스터의 레퍼런스 문서에 나와있다.
5. 그외의 메소드를 정의한다.
- 원시 메소드를 정의하면 공개 클래스에서 선언된 메소드가 일단 동작은 한다. 다만 그 데이터 구조의 특징을 살리기 위해 메소드를 오버라이드 해서 사용할 수 있다.
2) Composite Object
Composite Object의 경우 역시 abstract superclass를 상속 받은 후 데이터 모델을 직접 설계하지 않고 기존의 private cluster object를 맴버로 가지고 그것을 그대로 사용하는 방식입니다.
문제는 실제 데이터가 모두 맴버 변수에 저장되어있기 때문에 primitive methods들을 모두 구현하되 내부에 가지고 있는 private cluster object와 연결 해주어야 합니다.
뭐, 자주 쓰일 일은 없을 것 같지만 일단 두가지 방법으로 서브클래싱이 가능하기 때문에 특정 동작을 위한 컬랙션 같은 것을 구성할 때 편하게 사용할 수 있을듯 합니다.
그럼 어떤 때 이런 Class Cluster에 대한 subclassing이 필요할까요?
먼저 생각이 떠오른 것은,
True subclass의 경우 NSValue가 지원하지 않는형태의 value를 사용해야 한다던지.. (물론 valueWithBytes:objCType: 같은 것으로 해결 할 수도 있을것 같습니다.) file 같은 것에 매핑된 거대한 array같은 것을 사용한다던지, 심지어 서버와 통신하면서 동작하는 NSArray를 구현한다던지(아.. 너무 오버인것 같기도 합니다. 큰 데이터에 sorting 같은 걸 하면 안드로메다 가겠습니다.) 등등 응용분야는 많을듯 합니다.
Composite object의 경우 기존의 collection에 validation처리를 한다던지, logging을 한다던지, 데이터 처리 자체를 변경하지 않는 범위에서 무엇인가 추가작업을 간결하게 하고자 하면 유용할듯 합니다.
'IOS > Objective-C' 카테고리의 다른 글
Property List (0) | 2015.08.20 |
---|---|
Archive (0) | 2015.08.20 |
Copy (0) | 2015.08.18 |
Zone (0) | 2015.08.18 |
BOOL (0) | 2015.08.12 |