[App 개발] Cocoa Design Patterns (6)
본문
코코아는 통지(notifications)기능을 이용해서 응용프로그램 내의 객체간에 중요한 일들이 발생했음을 알립니다. 어떤 통지 메세지들은 수신자가 여러 개일수도 있습니다. 물론 여러 개의 객체가 한 메세지를 보내거나 공시할 수도 있습니다. 어떤 통지들은 사건들을 표현하는 자세한 부가 정보들이 첨가될 수도 있고 그렇지 않을 수도 있습니다.
Notification 패턴의 중앙 구조는 7장에 기술되어 있는 NSNotificationCenter 입니다. GOF 패턴에서는 통지를 등록하는 객체를 observer라고 합니다. NSNotificationCenter 와 NSNotification 클래스는 일반적이며 융통성있고 재사용가능한 GOF 옵저버 패턴의 구현입니다. 따라서, 이 패턴을 여러분이 따로 구현하셔야 할 필요가 전혀 없습니다.
통지를 받기 위해서는 객체를 통지 센터에 등록해야 합니다. 일반적으로 응용 프로그램은 default center 라고 하는 등록 센터가 있는데, 필요하면 여러 개를 만들 수도 있습니다. 등록할 때 객체는 어떻게 통지를 받을 것인지를 기입할 수 있습니다. 또한 통지를 받는 객체로부터 방식을 얻을 수도 있습니다.
통지를 보낼 때에 발신자는 통지문을 통보 센터에 고시합니다. 통지문은 자동적으로 수신자로 등록된 객체들에게 전달합니다. 어떤 통지문은 이벤트가 표현하는 사용자 정보 인수를 가외로 포함하기도 합니다. 통지문과 함께 정보를 보내는 것은 발신자의 책임입니다.
Delegates와는 달리 Notifications는 어떤 이벤트에 대한 통지를 여러 개의 객체가 받을 수 있습니다. 몇 개의 옵저버도 괜찮습니다. Notification을 이용할 때에는 발신인이 누구인지 몰라도 통보를 받을 수 있고 발신인은 게시된 통보를 관찰하는 객체에 대해서 아무것도 몰라도 됩니다. 객체를 등록하고 통지를 게시할 때 객체간의 대화가 활발하게 드러납니다. 이것은 객체가 정보교환이 필요한 다를 객체를 찾을 때 광역 변수의 필요를 줄여줍니다.
Notifications의 한 가지 단점은 통보 센터를 통한 간접 통신이기 때문에 대리인 메쏘드에 비해서 속도가 느리다는 점입니다. 게다가 대리인이 하는 것처럼 통지문을 관찰하는 객체가 답신을 송신한 객체에 곧바로 보낼 수 없습니다.
Proxies
코코아 분산 객체 기술은 프록시 개념을 포함하고 있습니다. 이것은 GOF 의 프록시 패턴보다 더욱 구체적입니다. 이것은 코코아를 처음 공부하는 사람에게 혼란을 주는 부분이기도 합니다. 왜냐하면 구문에 따라 같은 표현이 두 개의 의미가 되기 때문입니다. 여기서는 특별히 GOF의 개념인 경우에는 "GOF 프록시"라고 표현하겠습니다.
코코아에서 프록시는 다른 프로세스나 다른 쓰레드에서 어떤 객체의 대역입니다. 프록시에 메세지를 보내는 것은 메세지를 실제 객체에 보는 것과 동일합니다. 프록시는 메세지를 투명하게 포장해서 다른 프로세스의 객체에게 전달합니다. 프로그래머는 프록시가 개입되어 있는지, 혹은 최종 메세지 수령자가 발신자와 동일한 프로세스에 있는지를 걱정할 필요가 없습니다. 그저 메세지를 보내기만 하면 해당하는 일이 발생합니다. 어떤 디자이너들은 이것을 대사라고 부릅니다.
GOF 프록시 패턴은 이 기능을 갖고 있고, 다른 기능도 제공합니다. 따라서 코코아 프록시는 GOF 프록시입니다, 그러나 GOF 프록시는 코코아가 말하는 프록시일 필요는 없습니다. GOF 프록시의 다른 종류는 코코아에 있습니다. 어떤 경우는 특정한 이름이 있고, 어떤것은 이름이 없습니다.
GOF 프록시의 다른 기능은 게으른 메모리 할당과 엄청난 리소스 읽기를 가능하게 할 수도 있습니다. NSImage 클래스는 그런 종류의 프록시의 한 예입니다. 이 경우 객체는 두 부분을 가집니다. 여러분이 일반적으로 억세스하는 이미지의 외부, 그리고 NSImageRep 혹은 코코아 언어로 image representation 이라고 하는 실제 이미지 데이터입니다. 이미지는 모든 데이터를 읽어들이고 디코딩하지 않더라도 그것에 대한 정보를 알 수 있습니다. 사실 이미지는 실제로 사용될 때까지는 디스크에 저장되어 있습니다. 이러한 기법은 어떤 이미지는 전혀 출력되지 않는 경우에 메모리 사용을 줄일 수 있습니다.
NSImage는 이것보다 좀 더 나아가서 다중 image represenatation 의 프록시 역할도 할 수 있습니다. 이런 경우 객체는 GOF 포장지(Facade) 패턴 역할을 합니다. 포장지는 내부의 복합적인 객체들의 복잡한 구조를 표현하는 하나의 단순한 인터페이스 객체입니다.
프록시와 포장지 패턴을 조합한 다른 코코아의 예는 NSWindowController입니다. 이것은 인터페이스 빌더의 .nib 파일의 내부에 있는 객체들을 포장하는 역할을 합니다. 이것은 실제로 필요하기 전까지 .nib 파일을 읽어들이지 않습니다. 동시에 윈도우 컨트롤러 서브클래스는 응용프로그램과 .nib 내부의 객체들을 연결하는 역할을 합니다. 이것은 프로세스 내에서 또 다른 프록시 임무를 임무를 맡고 있는데, 포장하고 있는 객체들의 억세스를 관리하는 것입니다.
프록시 역할을 하는 최종적인 예는 정확히 코코아에서는 찾을 수 없지만 애플의 Enterprise Objects Framework (EOF)에서는 찾을 수 있습니다. 어떤 프록시들은 아직 생성되지 않았고 어쩌면 전혀 필요하지 않은 객체들을 위해서 개설되어 있습니다. Enterprise Objects Framework의 EOFault 가 이런 역할을 합니다. 이것은 아직 데이터베이스에 저장되어 있고 전체 데이터베이스를 참조하는 객체를 불러들일 때 데이터베이스 내용을 통째로 불러들일 필요가 없을 때 사용됩니다. 왜냐하면 이런 참조는 응용프로그램에서 절대 건드려지지 않기 때문에, fault 객체가 실제 객체와 데이터를 위해서 설치되어 있어서, 만약 응용 프로그램이 전혀 객체를 억세스하려하지 않을 때, fault 객체가 자동적으로 자기 자신을 실제 객체로 전송하고 실제 데이터를 불러들일 것입니다.
코코아가 당장 이런 것을 갖지 않았다 하더라도 미래에는 비슷한 역할을 하는 클래스를 갖게 될 것입니다. 이러한 fault 객체들은 단지 데이터베이스 뿐만 아니라 객체의 영속성 문제를 해결하는 데에 유용하게 쓸 수 있을 것입니다.
일반적으로 GOF 프록시와 포장지 패턴은 코코아에 널리 사용되고 있으며 종종 두 개의 패턴이 동시에 사용되고 있음을 발견할 수 있을 것입니다.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0