[Cocoa Design Pattern] 21. Prototype

**프로토 타입이란?**
– 기능 구현을 위해 복사해서 사용하는 객체
– 기존 객체를 복사해서 사용하는 것은, 새 인스턴스를 생성하는 것 보다 더 유연하다.
– 객체간의 강한 의존성 관계를 피하도록 해준다. ‘**패턴이 만들어진 동기 **
– 새로 인스턴스를 생성하는 객체와 해당 객체의 타입간의 의존성을 최소화
– 생성되는 객체의 종류에 대한 정보를 컴파일시 지정하지 않고, 런타임시 조절할 수 있도록 한다.
**패턴으로 문제 해결**
– 핵심기능 : 복사 될수 있다는 것
– NSCopying, NSCoding 프로토콜 제공
*** NSCopying protocol – copyWithZone 메소드**
– 메소드를 수신하는 객체와 동일한 상태의 객체를 반환해야한다.
1. Shallow Copy
– 복사되는 객체와 동일한 값을 저장한다.
– 원본을 가리키는 또 다른 포인터를 만드는 것, 포인터 복사 2. Deep Copy
– 원본 객체에 저장된 값의 실제 복사본을 저장
* 프로토 타입 패턴은 딥 카피를 제공하는 객체와 가장 잘 동작,
완벽히 독립적인 사본이 필요한 경우가 있기 때문임.
ex) IB Library의 경우, 복사된 객체는 인터페이스 빌더가 종료된 후에도 동작해야함. 그러나, 대부부의 코코아클래스는 NSCopying 프로토콜을 구현해서 Shallow copy를 반환함.
*** Deep Copy가 쉽지 않은 이유**
: 참조하고있는 객체중 Shallow copy를 반환하도록 구현되어 있다면, 섞이게 된다.
*** NSArchiver, NSUnarchiver class 는 쉬운 Deep Copy 방식을 제공 **
– 복사되는 객체와 그 객체 내에서 참조하는 모든 객체들이 NSCoding Protocol을 따른다면, Deep Copy 반환
– 347p 예제 : 아카이빙 한 후, 언아카이빙하는 것은 딥 카피를 만들기 위한 억지 기법
– IB 라이브러리에서 객체를 복사할때 사용하는 방식.
– ” 작업중인 .NIB 파일에 객체를 드래그 해서 옮기면, 객체는 기존의 라이브러리 인스턴스르에서 먼저 아카이브 되고나서 언 아카이브하여 추가 편집할 사본을 생성한다. 그리고 .NIB 파일이 저장될 때, 객체들은 다시 아카이브된다. .NIB파일이 로드되면 파일에서 객체가 언아카이브 되어서 IB에 복원된다.”
*** NSCell – NSCopying프로토콜의 다른 기법인 NSCopyObject() 함수 사용함.
**
NSCopyObject : 원본이 차지하는 메모리를 그대로 복사해서 Shallow Copy 생성함.
이후, NSCell의 -copyWithZone이 원본에 저장된 속성이 참조한느 객체에 copy 메시지를 보내 복사함.
NSCell은 Shallow copy 와 Deep Copy를 섞어 씀.
**
코코아 사용 예제 **
– IB 라이브러리 객체는 모두 프로토타입 : 객체를 복사함으로써 IB를 재 컴파일 하지 않아도 확장이 가능함.
– NSMatrix 클래스에서는 프로토타입 NSCell 인스턴스를 사용함.
– 매트릭스에서 행, 열 추가가 있을시에는 필요한 만큼 프로토타입 셀을 복사한다.
– NSMatrix 클래스는 자신이 사용하는 셀에 의존하지 않는다.
**349p**
NSCell의 서브 클래스 MYLabeledBarCell에서 정의한 barValue 역시 NSCopyObject()에 의해서 상속된 변수들과 함께 자동으로 복사된다.
* NSCopyObject() 함수는 포인터를 저장하지 않는 클래스에만 사용해야 한다.
* NSCell의 NSCopyObejct() 사용은 NSCell의 객체를 가리키는 인스턴스 변수를 추가하는 서브클래스 생성하기를 어렵게 만든다.
**패턴 사용 결과**
– 객체를 복사하는 작업이 새로운 인스턴스를 생성하는 것 만큼 시간과 비용소요(절약되는 것이 아님)
– NSMatrix 의 경우, 필요한 셀의 수가 줄어들더라도 프로토타입의 셀 사본을 거의 릴리즈 하지 않는데, 다시 필요할 경우 유지하고 있는 사본을 사용한다. 그러나 메모리가 필요하지 않는 사본을 저장하는데 소비된다는 측며에서 보면 단점이다.
– 프로토타입 패턴 주의사항 : 프로토타입 객체를 지원하는데 필요한 행동을 문서화 하는 것이 필요함.