[Cocoa Design Pattern] 22. Flyweight pattern

![](http://ash84.net/wp-content/uploads/1/cfile24.uf.122D734C4E1C04261DF168.jpg) **22. 플라이 웨이트 패턴 ** **플라이웨이트 패턴이란?** – 객체를 사용할 때 필요한 메모리의 양과 프로세서 오버헤드를 최소화시킨다.  – 인스턴스 공유를 가능하게 하여, 실제 인스턴스의 수를 줄여준다.  **패턴이 만들어진 동기 ** – 비 – 객체 데이터를 캡슐화하여 객체가 필요한 컨텍스트에 그 데이터를 사용할수 있게 한다.  – 많은 수의 인트선트가 필요할때 저장공간 요구를 줄여준다.  – 다른 객체의 대역으로 행동한다.  **패턴으로 문제 해결** 스프레드 시트의 경우  – 행과 열의 모든 셀을 각각의 인스턴스로 표시할 것인가? – 공유가능한 인스턴스 : 셀이 비어 있는 경우, 동일한 값을 가지고 있는 경우 (SpreadSheetCell) – 포맷 정보의 분리 (SpreadSheetCellFormat) – 인스턴스 공유를 통해서 총 사용하는 인스턴스의 수를 줄일수 있다.  – 인스턴스에 저장된 정보의 일부를 따로 클래스화 함으로써 저장을 최소화 시킨다.  ** 코코아 사용 예제 ** **3가지 목적 : **
1. 비-객체 값을 캡슐화 2. 메모리 사용 줄이기  3. 다른 객체의 대역으로 사용
**비-객체 값을 캡슐화 ** * NSNumber  – char, int, long, float 와 같은 숫자형 데이터 타입, bool 과 같인 데이터 타입도 객체형으로 전환 가능  – NSNumber 의 슈퍼클래스인 NSValue 가 비객체 데이터 타입에 객체 래퍼를 제공.  * NSDecimalNumber, NSDate, NSString 등과 같은 클래스 모두 비 객체 값이나 데이터 구조를 감싼다.  **저장공간 요구 감소 ** NSNumber 인스턴스 공유 – 최근에 사용한 혹은 자주 사용하는 NSNumber 인스턴스는 캐시에 저장한다. 그리고 요청이 오면 꺼내서 반환함.  – 인스턴스 공윤는 해당 클래스가 수정 불가능 할때만 가능하다.  NSFont, NSColor 역시 수정 불가능한 인스턴스를 캐시하고 재사용함.  NSCell – NSCell 의 인스턴스는, NSString, NSImage 의 포인터와 같이 상대적으로 단순한 값만 저장.  – NSView 가 80바이트를 사용함에 비해 NSCell은 20바이트 사용함.  – NSTableView와 NSMatrix 에서 사용함으로써 저장공간 감소 효과  **다른 개개체의 대역으로 사용 ** – 좀더 무거운 다른 객체의 임시 자리표시자 역할 수행 – NSTextView : 텍스트 표시와 입력을 다루는 클래스  – 그러나, 배치 저장, 철자확인 과 같은 다양한 텍스트 관련 기능에 대한 부분은 다른 클래스와 협력한다.  – 복잡한 텍스트 관리 시스템의 플라이웨이트 자리표시자로 NSCell을 사용  **패턴 사용 결과  ** – 패턴을 사용하는 것은 늘 디자인을 복잡하게 한다.  ex) C 언어의 데이터 타입과 NSNumber 사이에서의 데이터 변환  – 분명히 저장공간과 성능의 최적화 효과가 있다.  – 그러나, 만약 NSCell을 NSView 대신에 사용 했다면, 코어 애니메이션과 같은 고급 뷰 기능을 사용할 수 없다.  – 성능적인 부분에도 문제가 있을수가 있다.  – 플라이웨이트의 사용이 복잡도를 증가 – 개발하려는 어플리케이션에서 저장공간과 성능의 최적화에 대한 이슈가 있다면 사용해라. 아니면 권장하지 않는다.