[App 개발] Cocoa Design Patterns (3)
본문
*****
Class Clusters
클래스 클러스터는 복잡한 상속 구조를 숨기는 방법입니다. 기본적인 아이디어는 복잡한 객체 구조를 하나의 객체 안에 숨기는 GOF Facade 패턴과 유사합니다. 서로 연결된 객체들뿐 아니라 여러 다양한 클래스를 하나의 추상적인 슈퍼클래스에 숨기는 것입니다. 서브클래스의 상세한 내용을 아는 것 대신 슈퍼클래스에 준비된 API만 이용하도록 만드는 것입니다. 우리가 실제로 조작하는 인스턴스는 슈퍼클래스 내에 있는 서브클래스들이지만 우리는 어떻게 그 일들이 되고 있는지 전혀 모르며, 또한 알 필요도 없습니다.
클래스 클러스터를 사용하면 볼 수 있는 새로운 점은 아마 디버거에서 "Concrete"라고 이름된 친숙하지 않은 클래스들을 보게 될 것입니다. 예를 들어, 여러분이 NSArray를 써서 작업할 때에 NSConcreteArray와 같은 이름의 클래스들을 보게 될 것입니다. 콜랙션 클래스와 NSSTring등, Foundation Kit에 있는 많은 클래스들이 클래스 클러스터입니다.
일반적으로 말하면 클래스 클러스터의 자세한 내용을 전혀 알지 못해도 코코아 프로그램을 만들 수 있습니다. 다만 디버거에서 전혀 알지 못하는 클래스 이름이 나온다고 해서 당황하지는 마십시오. 다른 새로운 점은 클래스 클러스터의 서브클래스를 만드는 일이 까다롭고 아주 큰 주의가 필요합니다. 클래스 클러스터와 서브클래스를 만드는 방법에 대한 자세한 사항은 Appendix A, "Unleashing the Objective-C Runtime."을 참조하십시오.
Shared Objects
코코아 문서에서 가장 간단하게 소개된 패턴으로 Shared Object가 있습니다. GOF의 용어로는 "Singleton"이라고 합니다. 공유 객체는 어떤 클래스가 단 한 번만 인스턴트화 되는 경우에 쓰입니다. 공유 객체의 가장 확실한 예로는 중앙 응용 프로그램 객체가 있습니다. 모든 코코아 응용 프로그램에는 하나의 NSApplication 인스턴스가 있습니다. 실행되고 있는 응용 프로그램을 대표하는 인스턴스는 응용 프로그램당 하나이기 때문에 당연한 일입니다.
그 외에도 앞으로 배우게 될 여러 가지 코코아 클래스들이 공유 객체들입니다. NSWorkspace는 Mac OS X Finder를 대표하고, 이것도 공유 객체입니다. 그 외에도 코코아가 제공하는 몇 가지 기본 패널들, 폰트, 컬러 패널들도 역시 공유 객체입니다. 그리고 몇 가지 스크립팅 객체들도 역시 공유 객체의 성격을 갖고 있습니다.
이 패턴을 구현하려면 광역적으로 접근하고, 공유 객체 인스턴스를 얻을 때에 쓰이는 방법들을 클래스 객체에서 제공해야 합니다. 동시에 가외의 인스턴스를 생성하는 것을 막기 위하여 +alloc 메쏘드를 막아야 합니다. 특정한 공유 객체는 사용자의 요구에 의하여 한 번 생성되고 난 이후에는 생성된 객체의 인스턴스를 공유하게 됩니다. 보통 공유 객체 인스턴스를 얻어내는 메쏘드는 "shared"라는 단어가 포함되고 그 다음 "NS"를 뺀 클래스의 나머지 이름을 뒤에 붙입니다.
NSWorkspace.h 에서
+ (NSWorkspace *)sharedWorkspace;
NSApplication.h 에서
+ (NSApplication *)sharedApplication;
아마 다음과 같은 일반적인 메쏘드를 볼 때도 있을 것입니다.
+ (id)sharedInstance;
마지막으로, +new 클래스 메쏘드를 호출해서 공유 객체 인스턴스를 얻을 경우도 있습니다. +new메쏘드를 쓰는 방법은 프레임웍 옛날 버젼에서 유전된 것이고 지금은 사장되었습니다. +new 메쏘드는 Objective-C가 개발되던 초기 프레임웍에서는 중요한 역할을 차지했지만, 코코아에서는 그렇지 않습니다.
어떤 클래스들에서는 공유 객체 인스턴스가 이미 생성되었는지의 상태를 알아낼 수도 있습니다. 예를 들어
NSSpellChecker.h 에서
+(NSSpellChecker *)sharedSpellChecker;
+(BOOL)sharedSpellCheckerExists;
코코아는 객체 지향이기 때문에 공유 객체의 서브클래스를 만들 수 있으며, 원래 클래스 대신 서브 클래스를 공유 객체 인스턴스로 사용할 수 있습니다. Objective-C에서는 고맙게도 이런 일이 간단합니다. 그냥 서브클래스를 만들고, 원래 슈퍼클래스 대신 여러분의 서브클래스 객체를 수신자로 해서 적당한 억세서 메쏘드를 호출하면 됩니다. 예를 들어, 여러분이 특별한 NSSpellChecker의 서브클래스를 만들었다고 합시다. 여러분의 응용 프로그램의 다른 부분에서 스펠 체커를 호출하기 전에, 여러분이 먼저 여러분의 것을 다음과 같이 호출하면 됩니다.
[MySpellChecker sharedSpellChecker];
이렇게 하면 아직 +sharedSpellChecker 메쏘드를 덮어쓰지 않았다 할지라도 여러분의 서브클래스 인스턴스를 얻을 수 있습니다.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0