BLOG main image
분류 전체보기 (92)
Cocoa Touch (11)
Cocoa (10)
Objective-C (13)
Swift (6)
Development (11)
Tools (11)
Books (7)
etc (21)
Application release (1)
Document Project (1)
106,090 Visitors up to today!
Today 0 hit, Yesterday 7 hit
daisy rss
tistory 티스토리 가입하기!
2013. 10. 31. 12:36

오래된 기억이라 정확 할지는 모르겠지만, 예전의 Cocoa Framework에서는 collection class들의 subclass들은 만들지 말라고 했던것 같은데 Class Cluster에 대한 문서를 보다보니 이제는 collection class들의 subclass를 만드는 방법을 설명하고 있군요.


두가지 방법의 서브클래싱이 가능한데 그것은 아래와 같습니다.


1. True Subclass


True subclass는 클래스 내부의 데이터 모델을 직접 설계할 때 사용하는 방법을 지칭합니다. 즉, NSArray라면 NSArray를 상속 받지만 실제 데이터가 저장되는 모양은 모두 직접 만든다는것인데요, abstract superclass를 상속 받은 후 initializer method와 primitive methods들만 구현해주면 됩니다.

primitive method가 구현되면 나머지 메소드들은(derived methods) 모두 제대로 동작합니다. 예를 들면 NSArray의 경우 primitive method로 count와 objectAtIndex만 있습니다.



2. Compsite 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을 한다던지, 데이터 처리 자체를 변경하지 않는 범위에서 무엇인가 추가작업을 간결하게 하고자 하면 유용할듯 합니다.


부연설명들.


1. Class Cluster


Class Cluster는 abstract factory pattern의 확장입니다. 동일한 하나의 인터페이스 하에 다양한 구현들이 존재하는데 initializer의 선택에 맞게 가장 알맞은 형태의 구현 객체를 사용하게 되는 패턴입니다. 가장 대표적인 예는 NSNumber같은 것이 될 수 있는데 int를 처리하는 클래스와 float을 처리하는 클래스 등등 데이터 형에 맞는 여러개의 클래스가 NSNumber라는 동일한 클래스를 인터페이스로 사용하고 있습니다.


2. primitive method, derived method


이름에서 알 수 있듯이, primitive method를 그 cluster에서 반드시 구현되어야 하는 메소드를 말합니다. derived method는 내부적으로 primitive method를 사용하기 때문에 primitive method만 구현되면 해당 class cluster로 제대로 동작해주게 됩니다.


Name
Password
Homepage
Secret