Prototype 디자인 패턴GoF의 23가지 디자인 패턴중 생성관점에서 바라보는 패턴중에 하나이다. 생성관점에서 바라보는 이유는 복사를 해서 새로운 객체(인스턴스,instance)를 만든다는 개념을 가지고 있기 때문이다.

Prototype의 용어가 “원형“이라는 뜻을 알아둘 필요가 있다.

Prototype 디자인 패턴은 “원형”이 되는 클래스의 객체와 똑같은 것을 복제해서 사용할 수 있게 하는 것이다.

 

왜 Prototype 디자인 패턴을 사용하는가?

일반적으로 Something 클래스를 이용하여 객체를 만들때 new Something()과 같이 new 연산자를 이용해서 생성하게 된다. 이 경우 10개 만들면 new연산자를 10개 써야한다. 하지만 Prototype 디자인 패턴을 이용하면 new 연산자를 사용하지 않는다. 대신 복사(복제)하는 방법을 이용한다. 이 패턴은 어떤 클래스의 객체를 생성하는 것이 자원과 시간을 많이 잡아먹거나 복잡한 경우에 유용하게 쓰일 수 있다. 또한 객체를 생성하는 부분이 필요한 상황일때, 생성하려는 객체의 종류정보가 컴파일 시간이 아닌 실행시간에 정해지는 경우에도 필요하다.

Yuki Hiroshi가 지은 “Java 언어로 배우는 디자인 패턴 입문”에서 다음 경우에는 기존의 객체를 가지고 복사(복제,clone생성)해서 사용하는 경우가 유용할 수 있다고 한다.

 

1. 취급하는 객체의 종류가 너무 많아 다수의 소스파일을 작성하는 일이 빗어질때

마음만 먹으면 얼마든지 많은 객체를 다루게 될 수 있다. 이러한 경우 복사해서 사용하는 경우가 유용할 수 있다.

 

2. 클래스로부터 인스턴스를 생성하기가 복잡할 때

가령, 마우스를 사용해서 조작하는 도형 에디터와 같은 애플리케이션에서 도형을 나타내는 객체와 똑같은 것을 만드는 경우 클래스를 이용해 new 연산자로 객체를 생성하는 것보다 인스턴스를 복사해서 만드는 방법이 더 간단할 수 있다.

 

3. 프레임워크와 생성할 인스턴스를 분리하고 싶을 때

프레임워크의 기본은 클래스간에 결합도를 줄여주고 확장성을 높여주는 것이 중요하다. 이것은 프레임워크가 특정 클래스에 의존적이지 않게 한다는 의미이다.  가령, 진열장이 프레임워크라고 하자. 진열장안에는 각종 물건이 있다. 진열장에는 어떤 물건이든 들어올 수 있다.  진열장에 있는 물건은 구입자가 그 물건을 사기위한 원본이 된다. 이 원본에는 이름이 있고 구입자가 이 물건을 구입할때 진열장에 있는 물건을 바로 구입하는 것이 아니라 물건과 똑같은 물건이 구입자 손으로 넘어온다. 여기서 중요하게 짚고 넘어갈 것은 진열장(프레임워크)는 어떤 물건(객체)이 들어있는지 알 수 없으나 그 물건이 선택되면 그와 똑같은 물건을 반환해준다.

 

Prototype 디자인 패턴에서 객체를 복사해서 사용하는 이유에 대해 3가지를 언급했지만 감이 잘 안올것이다. 사실 제대로 이해하기 위해서는 직접 코딩해보고 유용함을 몸소 깨달아야한다. 본인도 new연산자를 사용하는 것과 복사해서 사용하는 것에 대한 장단점을 가려내는데 많이 힘들었지만 하다보니 객체를 복사해서 사용하는 것이 더욱 깔끔한 설계를 이끌어 내는데 도움이 되는 것을 느낄 수 있었다.

 

깊은 복사와 얕은 복사

여기서 한가지 짚고 넘어갈 것은 “복사”라는 용어이다. 복사에는 “얕은 복사(Shallow Copy)”와 “깊은 복사(Deep Copy)”가 있다. 얕은 복사는 일종의 참조이다.  ActionScript 3.0의 복사는 대부분 얕은 복사이다.

 

 

상단 코드의 결과는 어떻게 나올까?

 

1,2,4

1,2,3

 

이라고 생각했다면 아직도 당신은 ActionScript 3.0이 깊은 복사로 되는줄로 착각하고 있는 것이다.

 

답은

 

1,2,4

1,2,4

 

이다.

 

앞서 설명했지만 일반적인 복사의 형태는 참조복사의 형태이다. 즉, 얕은 복사이다. 참조한다는 것은 메모리를 공유하고 있다는 것을 뜻한다. 위 코드에서 단순히 var b:Array = a를 통해 b에 a를 복사했기 때문에 a와 b가 전혀 다른 객체를 참고하고 있다는 것을 뜻하지 않는다. 실제로는 a에서 참조하고 있는 데이타를 b도 참고한다는 것을 의미한다. 그러므로 a의 요소가 수정되면 b의 요소도 바뀌는 것이다.

 

 

이 글에서 다뤄지는 Prototype 디자인 패턴의 복사는 깊은 복사이다.

 

즉, 앞선 코드에서 a와 b가 있다고 할 때 a와 b의 데이터의 값은 완전히 같지만 서로 다른 메모리의 주소를 참고하도록 한다는 것이다. 일반적으로 일란성 쌍둥이를 생각하면 된다. 모든 유전자정보가 같은 일란성 쌍둥이지만 엄연히 완벽히 다른 2개의 객체인 것이다. Prototype 디자인 패턴에서 객체를 복사한다는 의미는 이러한 의미에서 깊은 복사를 뜻한다.

 

위 코드에서 깊은 복사의 형태로 바꿔지기 위해서는 다음과 같은 작업이 필요하다.

 

createClone() 메소드를 통해서 위 코드를 실행하면

결과는 아래와 같다.

 

1,2,4

1,2,3

 

깊은 복사가 제대로 실행된 것을 볼 수 있다.

 

createClone() 메소드에 사용된 ByteArray를 통해 객체를 생성하는 것을 유심히 살펴보자.

 

Java의 경우 Cloneable인터페이스와 java.lang.Object에 clone()이 정의되어 있어서 객체복사(깊은복사)를 매우 쉽게 할 수 있다. 하지만 ActionScript 3.0의 경우 그런 메소드가 존재하지 않는다. 그래서 이와 같이 조금 어려운 객체 복사를 해야한다. 이 또한 클래스의 객체를 완벽하게 복사하기 위해서 쓰기에는 완벽하지 않다. 아래처럼 조금 더 수정될 필요가 있다.

 

 

위 코드는 createClone() 메소드를 통해 클래스 객체도 완벽히 복사할 수 있도록 만들었다.

 

메소드내 추가된 코드는 객체을 복사할때 원본 객체의 클래스 유형을 유지하기 위한 부분이다. 기존에 클래스가 등록된 경우에는 getClassByAlias()로 Class가 반환되지만 등록되어 있지 않은 경우 ReferenceError를 발생시킨다. 에러 발생시 registerClassAlias()을 이용해 원본객체의 클래스 유형을 유지시킨다. 이 코드를 넣지 않으면 이 함수를 통해 만들어진 복사된 객체가 Object가 되어 원하는 Class의 원형을 갖추지 못하게 된다. 이 말은 registerClassAlias()를 사용하지 않으면 var a:MyClass = createClone( b ) as MyClass로 사용할 수 없고 var a:Object = createClone( b ) 로 밖에 사용할 수 밖에 없다는 것을 뜻한다. 아래 코드는 이에 대해서 이해하기 위한 예제이다.

 

 

위 코드에서 registerClassAlias()를 빼면 trace() 결과가 false로 나온다. 이와 관련된 자세한 내용은 “getClassByAlias()와 registerClassAlias() 설명서“를 참고하길 바란다.

 

Prototype 디자인 패턴을 적용한 UML과 ActionScript 3.0 코드

 

위 그림은 Prototype의 기본 디자인 패턴에 대한 클래스 다이어그램이다. 사용자인 Client 클래스는 인터페이스 Prototype을 구체적으로 구현한 ConcretePrototype1, ConcretePrototype2…. 를 사용한다. Client 클래스는 ConcretePrototype1, ConcretePrototype2의 존재를 알필요 없이 clone()만 알고 있으면 된다. 이 clone() 메소드가 바로 깊은 복사를 통해서 자신을 복사해주는 역할을 하는 것이다.

 

 

위 다이어그램은 이제부터 선보일 Prototype 디자인패턴을 적용시킨 클래스들의 관계를 설명하고 있다. 아래 이미지는 다이어그램에 따라서 만들어진 ActionScript 3.0 프로젝트의 Package구조를 보여주고 있다.

 

 

간단히 설명하자면

framework 패키지와 car 패키지로 구분되어 있는데 이렇게 구분한 것은 Prototype 디자인패턴이 적용된 framework 패키지 안에 클래스를 이용하여 계속 확장할 수 있음을 뜻한다. 가령, car 뿐아니라 boat, television, radio 어떤 것이든 상관 없다는 것이다.

Prototype의 핵심 인터페이스인 IPrototype을 확장한 Product를 또 Engine과 Wheel 클래스로 확장했다. 또한 IPrototypeClient 인터페이스를 확장해 ProductManager를 framework에 만들고 이것을 확장한 CarPartManager 클래스를 볼 수 있다.  CarPartManager 클래스에 Engine, Wheel의 객체를 등록하면 CarPartManager의 create()메소드를 통해 Engine과 Wheel의 객체의 새로운 객체를 복제할 수 있다.

이해를 돕기 위해 사용예를 보자.

 

CarPartManager의 객체에 2개의 Wheel 객체와 2개의 Engine 객체를 등록하고 create() 메소드를 통해 새로운 객체를 생성하고 있다. 결과는 다음과 같이 나온다.

 

This is a wheel A
This is a wheel B
This is a engine 1
This is a engine 2

 

중요하게 체크해야할 사실은 등록할때 외에는 Wheel과 Engine의 객체 복사를 new를 통해하지 않는다는 것이다. 단지 처음에 Wheel과 Engine를 CarPartManager에 register()메소드의 첫번째 인자값만 가지고 등록된 객체를 복사해낸다. Prototype 디자인 패턴은 이렇게 new를 사용하지 않고 등록시 사용한 별칭(wheel1, wheel2, engine1, engine2)만 가지고 똑같은 객체를 복사생성하기 때문에 new를 통한 생성의 복잡함(설정이 매우 많은 경우)이 있는 경우 크게 도움이 될 수  있다.

각각의 클래스 코드를 살펴보자.

 

먼저 인터페이스이다.

 

IPrototype은 매우 단순하다. clone() 메소드를 통해서 복사만 가능하도록 구현할 수 있으면 된다.

 

 

IPrototypeClinet는 복사가 가능한 인터페이스(IPrototype)를 가지는 객체를 특별히 지정된 이름으로 등록할 수 있고 등록된 객체로 부터 지정된 이름으로 생성할 수 있도록 하는 것이 목적이다.

 

위 2개의 핵심 인터페이스를 구현한 프레임워크내 2개의 핵심 클래스를 살펴보자.

 

위 클래스는 IPrototype을 구현한 Product클래스이다. 앞서 소개했던 CloneMachine클래스를 확장해서 만들어졌다. clone()메소드를 구현한 부분을 살펴보면 CloneMachine 클래스에 정의된 createClone()메소드를 이용하여 자기 자신을 복제하여 넘겨주는 것을 확인할 수 있다. Product클래스는 일종의 생산품의 부모라고 생각하면 된다. 이 생산품을 설명해주는 description get/set 메소드도 추가되어 있는 것을 확인하자. 이 클래스는 단독으로 쓰이지 않으며 반드시 확장해서 사용한다. 일종의 추상클래스라 생각하면 된다. ActionScript 3.0에서는 추상클래스로 지정하기 위해 Java의 abstact와 같은 키워드가 없으므로 별도의 설정은 하지 않았다.

 

 

위 클래스는 IPrototypeClient 인터페이스를 확장한 ProductManager 클래스이다. 이 클래스는 등록(register)와 복제(create)를 구현하고 있다. 코드는 그리 어렵지 않다. create()메소드에 등록된 객체를 찾아 clone()메소드로 복사하는 것을 꼭 확인하기 바란다.

 

프레임워크 부분은 모두 설명했다. 이제 활용 예제로 만든 car 패키지 부분을 살펴보자.

 

IPrototype을 구현한 Product를 확장해 Wheel과 Engine 클래스를 만들었다. 자동차 부속품인 바퀴휠과 엔진을 의미한다. 단순히 생성자만 새로 만들었을뿐 별 다른 구현은 하지 않았지만 필요하다면 다른 구현을 해도 무방하다.

 

 

IPrototypeClinet를 구현한 ProductManager를 확장해 CarPartManager를 만들었다. 더이상 다른 정의를 하지 않았고 ProductManager가 구현한 것을 그대로 쓰고 있지만 원하는데로 확장해서 사용해도 문제없다. 의미적으로는 자동차 부속품을 관리하는 관리자 클래스라고 생각하면 되겠다.

 

다시 한번 이 클래스를 사용하는 예제를 보자.

 

 

이제 어렵지 않게 해석할 수 있을것이다.

 

이것만은 꼭 기억하자. Prototype 디자인 패턴은 객체를 원하는데로 복사(깊은복사)해서 사용할 수 있게 만든 패턴이다. Prototype 패턴을 이용해 Flex/AIR/Flash/ActionScript 3.0 프로그램 설계에 도움이 되길 바란다.

 

참고자료

ActionScript 3.0 Prototype Design Pattern: A Minimalist Example

ActionScript 3.0 Clone: A Prelude to the Prototype Design Pattern

getClassByAlias()와 registerClassAlias() 설명서

소스

-> 무료 UML 툴인 StarUML을 다운로드 받아 보실 수 있습니다.

-> Flex Builder 3 에서 Import 해 사용하세요.

 

추가내용

Flex에 관련된 컴포넌트는 여기서 소개된  Prototype 방식으로 clone()을 생성하면 에러가 생성될 가능성이 많다. 특히 UIComponent 계열은 Flex SDK 프레임워크 종속적인 클래스이다. 이 것으로 만들어진 객체를 clone()으로 깊은 복사에 성공하더라도 프레임워크 자체에서 UIComponent 객체들을 관리하기 때문에 단순한 clone() 메소드로는 Flex 자체에서 동작하도록 만들 수 없다. 그러므로 프레임워크와는 상관없는 Sprite, Shape등을 이용해서 만들도록 하자.

추가내용 2 (2009.12.9)

히카님과 대화하면서 새롭게 안 사실입니다. 위에서 객체 복사를 위한 부분에 대해서 실제로 메서드, 변수정의는 모두 되지만 ByteArray, Vector, Array, Dictionary, Object 값외에 다른 값의 복사는 되지 않는다고 합니다. 그래서 결국 이 방법으로 복사하는 것은 잘못된 것이네요. 참고하세요.

예전부터 Flex4 프로젝트의 일환인 Gumbo를 다운로드를 받았지만 쓸 기회가 없어서 안쓰다가 Flash Player 10에서 3D 회전 예제가 있어서 한번 해봤다.

Flex Builder 3에서 작업을 하기 위해 수행해야할 일은 다음과 같다.

1. Gumbo 최신버전을 다운받는다. [다운로드 받으러가기]

2. 다운로드 받는 Flex 4 SDK를 Flex Builder 설치폴더안에 sdks 폴더에 압축하여 풀어준다.

3. Flex Builder 3를 실행해서 메뉴에 Windows->Preperences...에 들어가면 창이 뜬다. 창 왼쪽에 Flex->Installed Flex SDKs를 선택한 다음 아까 압축을 푼 SDK폴더를 등록한다.

4. File->New->ActionScript Project를 선택하면 창이 뜬다. 창 아래부분에 Use a specific SDK를 선택한다음 Flex 4를 선택하고 프로젝트 명을 CubeRotationExample로 프로젝트를 만든다.

5. 아래 소스를 복사해서 메인 소스에 덮어쓴다.

 

package{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
 
	public class CubeRotationExample extends Sprite {
		
		private static const EDGE	:Number = 40;		//edge length
		private var mtxWorld		:Matrix3D;			//world transform matrix
		private var vCube			:Vector.<Number>;	//cube points
		private var vFlatCube		:Vector.<Number>;	//projected cube points
		private var vUVT			:Vector.<Number>;	//uvt data
		private var vIndicies		:Vector.<int>;		//triangle indicies
		private var sprCube			:Sprite;			//canvas object
		
		public function CubeRotationExample(){
			// setup and initialize
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.quality = StageQuality.BEST;			
			
			mtxWorld = new Matrix3D();
			vCube = Vector.<Number>([	EDGE,EDGE,-EDGE,
				 						EDGE,-EDGE,-EDGE, 
										-EDGE,-EDGE,-EDGE,
										-EDGE,EDGE,-EDGE, 
										EDGE,EDGE,EDGE,
										EDGE,-EDGE,EDGE,
										-EDGE,-EDGE,EDGE,
										-EDGE,EDGE,EDGE
										]);
			vFlatCube = new Vector.<Number>(16);
			vUVT = new Vector.<Number>(24);
			vIndicies = Vector.<int>([0,1,2, 2,3,0, 4,7,6, 6,5,4, 0,4,5, 5,1,0, 1,5,6, 6,2,1, 2,6,7, 7,3,2, 4,0,3, 3,7,4]);
			
			sprCube = new Sprite();
			addChild(sprCube);

			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onEnterFrame(eo:Event):void {
			// center the cube
			sprCube.x = stage.stageWidth/2;
			sprCube.y = stage.stageHeight/2;
			
			// rotate the transform matrix
			mtxWorld.appendRotation(2, new Vector3D(0,1,0));
			mtxWorld.appendRotation(2, new Vector3D(0,0,1));
			mtxWorld.appendRotation(2, new Vector3D(1,0,0));
			
			// project 3D data to 2D plane
			Utils3D.projectVectors(mtxWorld, vCube, vFlatCube, vUVT);
			
			// draw the cube using cube data
			sprCube.graphics.clear();
			sprCube.graphics.beginFill(0xFF00FF);
			sprCube.graphics.lineStyle(1,0xFF0000,1);
			sprCube.graphics.drawTriangles(vFlatCube, vIndicies, null, TriangleCulling.POSITIVE);
			sprCube.graphics.endFill();
		}
	} 
}

 

6. 저장하면 에러가 날거다. Flash Player 10에서 작동하므로 그에 따른 설정을 해주어야 한다. 메뉴에서 Project->Properties 로 들어가면 창이 뜬다. 왼쪽메뉴에 ActionScript Compiler를 선택하고 오른쪽 아래 Require Flash Player version을 10.0.0으로 맞춰준다.

7. 실행한다.(단 Flash Player 10이 설치되어 있어야 한다.)


[실행화면]


다시한번 언급하지만 Flash Player 10 환경에서만 된다.

위의 소스를 보면 예전 ActionScript 3.0에서 볼 수 없었던 것들이 보인다.
Vector, Matrix3D, Util3D등이다. Papervision3D와 같은 것을 쓰지않아도 쉽게 네이티브 코드로 3D를 구현할 수 있게 한 Flash Player 10. 아직 다양한 표현을 위한 많은 API를 가지고 있지 않지만 더욱 발전될 가능성이 크다고 생각한다. 기대해보겠다.

[소스출처]
http://dispatchevent.org/calebjohnston/flash-player-10-3d-example/

글쓴이 : 지돌스타(http://blog.jidolstar.com/421)

제가 직접 참여해서 만든 사이트 홍보입니다. ^^

Flex/Flash로 개발을 담당했고요~~

스타플에서 홍보이벤트 중입니다.

1등 문화상품권(10만원)+스타플 카드지갑 입니다.

여러분도 도전해보심이 어떨까요?


Starpl. 밤하늘의 별을 당신에게 드립니다.

밤하늘의 별을 주는 재미있는 서비스가 있어 소개합니다.

스타플은 실제 별 관측 데이터를 이용해서, 정말 존재하는 별 중에 하나를 나에게 준답니다.
나의 별에다가 나의 이야기를 담고, 우주를 여행하며 사람들도 만나는 흥미로운 서비스에요.

별찾기 성향테스트

나만의 별을 찾아라!

회원가입을 누르면, 성향 테스트를 거쳐 나만의 별을 받게 됩니다.
그림으로 푸는 성향테스트가 독특하고 재미있어요.

예시 별 1. 예시 별1의 타임라인

나를 담는 별

별을 방문한 모습입니다. 별 위에 보이는 바가 타임라인이라고 하는 건데,
타임라인에 추억과 일상, 생각 들을 기록할 수 있습니다. 글을 쓸 때 시간을 설정하거나, 첨부사진의
촬영시간을 적용하면 그 때 그 시간의 타임라인에 글이 쓰여져 내 인생의 히스토리를 만들 수 있어요.
블로그를 가지고 있다면, 블로그를 타임라인에 등록하여 새 글이 자동으로 타임라인에 담기게 할 수도 있어요.

예시 별 2. 예시 별3.

나의 취향대로 꾸미는 나만의 별

여러 별들의 모습입니다. 스타플에는 나만의 별을 꾸밀 수 있도록 다양하고 예쁜 아이템과 위젯들이 많습니다.
아이템은 별가루로 구입할 수 있는데, 별가루는 처음에 가입하면 왕창 주는데,
다 써 버려도 스타플 사용하다보면 저절로 계속 쌓이더라구요. ^^

스타플 별지도

다른 별들을 만날 수 있는 공간, 별지도

별지도에 가보면 많은 별들이 있습니다. 저 별들에도 다 사람들이 살고 있다고 생각하니 신기하네요.
별지도 위의 상단메뉴를 클릭하면
다른 별들이 남긴 기록들을 볼 수가 있는데요, 말풍선을 클릭하니 그 별로 방문이 되는군요.

똑똑한 소식 배달부 알림이

별지도 왼쪽에 알림이를 통해 나의 별친구들의 새 기록과 댓글, 생일 등의 소식들을
바로 바로 알려줘서 알림이에서 손을 땔 수가 없더라구요.
또, 관심 가는 별이 있으면 관심별로 등록해 알림이로 쉽게 받아 볼 수 도 있답니다.

너무 너무 이쁘고 개성 넘치는 스타플!
나만의 별을 받고 싶으신 분들, 나의 이야기를 담을 특별한 공간을 찾으신 분들께
꼭 추천해드리고 싶은 서비스입니다.

별증서

나의 별임을 인증하는 별증서 이벤트도 진행 중이니, 한번 방문해 보세요.

스타플 방문하기

재사용/유지보수를 극대화를 위해 다형성, 추상화 개념이 들어간 객체지향프로그래밍을 이용한다.


객체지향프로그래밍(OOP) 5대 원칙도 마찬가지입니다. 결국 재사용/유지보수를 위해서 필요한 원칙입니다. 이런 원칙을 잘 지키는 것은 초보 개발자에게 무척 어려운 일이기도 합니다. 왜냐하면 이해와 설계과정이 함께 들어가는 것이기 때문입니다. 하지만 지속적으로 적용하고 몸에 베면 그리 어려운것만은 아닙니다.


[공부]

http://muticd.com/lec/director/viewBody.php?t_Name=Lec_drbook2

11, 12 동영상을 학습한다.



[과제]


1. 인터페이스(Interface), 추상 클래스(Abstract Class), 구상 클래스(Concrete Class)

1.1 인터페이스란 무엇인가?  

1.2 추상클래스란 무엇인가? 추상클래스의 역할을 정확히 언급하라. 인터페이스와의 차이점을 언급하라.

1.3 구상클래스란 무엇인가?

1.4 AS3에는 추상 클래스의 키워드로 abstract가 없다. 그러나 실제 설계시에는 추상클래스 역할을 하는 클래스가 필요한 경우가 많다. 이런 경우에 대한 적절한 예제를 들고 Class Diagram을 작성하라. (단,추상클래스는 직접 사용할 수 없도록 해야한다.)

1.5 1.4에서 만든 추상클래스를 가지고 구상클래스를 3가지 이상 예제를 들고 Class Diagram을 작성하라.

1.6 1.4, 1.5에서 만든 추상클래스와 구상클래스를 가지고 문제없이 사용할 수 있다. 하지만 다중상송의 경우 문제가 발생할 수 있다. 이런경우 예를 들고 왜 인터페이스-추상클래스-구상클래스를 셋트로 설계하는게 좋은지 설명하라.



2. Open-Close 원칙 (OCP, 개방-폐쇄의 원칙)

2.1 OCP원칙에 의하면 확장 상속(is-a)에 관해서 어떻게 하나?

2.2 OCP원칙에 의하면 합성 상속(has-a)에 관해서 어떻게 하나?

2.3 OCP원칙에 따르기 위해 Class를 어떻게 설계해야하는가?

2.4 OCP 원칙에 맞지 않는 예를 Class Diagram으로 표현하라.

2.5. OCP 원칙에 대한 적절한 예를 Class Diagram으로 표현하라.



3. The Liskov Substitution 원칙(LSP, 리스코프 치환 원칙)

3.1 LSP 원칙에 대해 설명하라

3.2 LSP 원칙에 맞지 않는 적절한 예를 Class Diagram으로 설명하라.

3.3 LSP 원칙에 맞는 적절한 예를 Class Diagram으로 설명하라.



4. The Dependency Inversion 원칙(DIP, 의존 관계 역전 원칙)

4.1 DIP 원칙에 대해서 간단하게 설명하라.

4.2 DIP 원칙에 맞지 않는 예제를 Class Diagram으로 설명하라.

4.3 DIP 원칙에 맞는 예즈를 Class Diagram으로 설명하라.



5. The Interface Segregation 원칙(ISP, 인터페이스 격리 원칙)

5.1 ISP에 대해서 간단히 설명하라.

5.2 ISP에 맞지 않는 예제를 Class Diagram으로 설명하라

5.3 ISP에 맞는 예제를 Class Diagram으로 설명하라.



6. The Single Responsibility 원칙(SRP, 단일 책임의 원칙)

6.1 SRP에 대해서 간단히 설명하라.

6.2 SRP에 맞지 않는 예제를 Class Diagram으로 설명하라.

6.3. SRP에 맞는 예제를 Class Diagram으로 설명하라.



[참고서적]

Flex/AIR Bible (대림, 윤훈남저)

액션스크립트 3.0 디자인 패턴(에이콘, 조이로트.대니 패터슨 저)



이들에 대해서 학습을 완료하면 재사용/유지보수를 위해 아래와 같은 작업을 해야할 것을 느낄겁니다.


1. 인터페이스 또는 추상클래스로 설계한다.

2. 참조시 인터페이스 및 추상클래스를 참조해야한다.(의존성을 줄임)

3. 인터페이스나 추상클래스는 확실한 자기 역할을 부여해라.(유지보수,확장성 향상)


OOP 5대 원리 및 다양성, 추상화 과정에 대해서 이해하고 계속 적용할려고 노력하는 것은 개발의 삽질을 줄여주는데 반드시 필요한 부분입니다. 처음에는 머리 아플지 모르지만 예전보다 이쁘게 만들어진 자신의 프로그램을 보며 웃을날이 분명 올것입니다. ^^


객체기반프로그래밍(OBP, object based programming)이 아닌 객체지향프로그래밍(OOP, object oriented programming)을 하시기 바랍니다.


댓글이 곧 달리겠죠? ^^

글쓴이: 지돌스타(http://blog.jidolstar.com/419)

많은 프로그래머들이 클래스 관계 및 설계에 대해서 명확히 이해하지 않고 손가는데로 프로그램을 만들다가 나중에 유지보수에 어려움을 겪는다.(본인도 예외가 아님) 이러한 문제를 극복하는 취지에서 이번 학습이 필요하다고 생각한다. 물론 Flex의 경우 Flex자체의 내부구조를 이해하고 효율적인 사용이 필요하다. 이 부분은 따로 학습해야할 것이다.


[공부할 것]

클래스들 간에 관계설정

출처:http://cafe.naver.com/javasolution/26


윤훈남의 Flex강의중 10.객체지향프로그래밍-클래스 다이어그램 : http://muticd.com/lec/director/viewBody.php?t_Name=Lec_drbook2


[숙제]

1. 클래스의 관계에서 is a, use a, has a 에 대해서 예시와 함께 설명하라.(예시는 3가지 이상)


2. UML에서 클래스 관계

2.1 "의존관계"의 영문, 의미, UML 표기법 설명, AS3 예시

2.2 "연관관계"의 영문, 의미와 2가지 종류에 대한 설명과 UML 표기법 설명, AS3 예시

2.3 "일반화관계"의 영문, 의미와 UML 표기법 설명, AS3 예시

2.3 "실체화관계"의 영문, 의미와 UML 표기법 설명, AS3 예시

2.4 위 관계에 대해 UML을 작성해보자

  (http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML 에서 다운받에 Flex Builder에 설치하고 다 만든 결과물을 스크린샷해서 붙인다)


3. 합성과 상속

3.1 의미를 설명하고 AS3로 예시를 들어라.

3.2 각각의 장단점을 설명하고 예시를 들어라.


4. 인터페이스

4.1 인터페이스의 의미와 AS3에서 일반적으로 통용되는 인터페이스 명명규칙

4.2 AS3는 다중상속을 할 수 없다. 하지만 인터페이스를 이용하면 다중상속의 문제점을 해소시키면서 클래스를 만들 수 있다. 예를 들어 설명하라.

4.3 인터페이스는 클래스간에 결합도를 줄여준다. 예를들어 설명하라.

4.4 ActionScript 3.0에서 부모SWF에서 자식SWF를 로드하여 자식 SWF안에 있는 클래스를 사용할 수 있다. 인터페이스를 이용하면 부모와 자식간에 클래스 공유의 결합도를 줄여줄 수 있는데 그 예를 들어보자.



5. 추상화 클래스(AS3는 이런 개념이 없지만 충분히 활용할 수 있다.)

5.1 추상화 클래스의 의미.

5.2 추상화 클래스를 사용해야하는 이유

5.3 인터페이스를 이용해서 추상화 클래스를 만들고 이 추상화 클래스를 이용한 구체화된 클래스에 대한 예제를 만들라(AS3, UML)


6. 캡슐화(은닉화)

6.1 캡슐화의 의미

6.2 캡슐화가 적절하게 된 클래스와 아닌 클래스에 대한 예시를 들어라.(Array 활용)


7. 다형성

7.1 다형성의 의미

7.2 다형성의 의미를 대변할 수 있는 예시(코드/UML)를 들어라.


8. 절차지향 방식과 객체지향 방식의 차이점(장,단점 포함)을 설명하라.


답은 언제 달릴까요? ^^

글쓴이: 지돌스타(http://blog.jidolstar.com)

POST방식으로 MultiPart 컨텐츠 타입으로 지정하여 데이타를 서버에 올리는 경우가 종종 있다.
가령, 이미지를 BitmapData로 캡쳐해서 ByteArray형태로 만든다음 서버에 전송하기 위해서는 URLLoader를 이용해 URLRequest의 contentType을 "multipart/form-data;"으로 지정해서 전송할 수 있다. 이와 관련되서는 예전에
"[Flex/AIR]BitmapData를 PNG나 JPG로 변환하여 ByteArray로 서버에 전송하는 방법" 제목으로 글을 올린적 있으니 참고바란다.

하지만 Flash Player 10부터 이러한 과정에서 보안이슈에 걸린다. 아래는 Flash Player 10 기준 ActionScript 3.0 메뉴얼에서 URLLoader의 load()에 설명되어 있는 글이다.  

Flash Player 10 이상에서는 multipart Content-Type(예: "multipart/form-data")을 사용하고 POST 본문 내 "content-disposition" 헤더에 "filename" 매개 변수를 지정하여 업로드를 처리하는 경우 POST 작업이 업로드에 적용되는 보안 규칙의 영향을 받을 수 있습니다.

  • POST 작업은 마우스 클릭이나 키 누르기 같은 사용자 동작에 대한 응답으로 수행됩니다.
  • POST 작업이 크로스 도메인인 경우, 즉 POST 대상이 POST 요청을 보내는 SWF 파일과 같은 서버에 없는 경우 대상 서버는 크로스 도메인 액세스를 허용하는 URL 정책 파일을 제공해야 합니다.

또한 multipart Content-Type의 경우 구문이 RFC2046 표준에 따라 유효해야 합니다. 구문이 유효하지 않은 경우 POST 작업은 업로드에 적용되는 보안 규칙의 영향을 받을 수 있습니다.


마우스 클릭이나 키 누르기 같은 사용자 동작에 대한 응답이 있은 직후에 하지 않고 이 기능을 사용하게 되면 "SecurityError: Error #2176 Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press." 에러가 발생한다. 이 메시지는 자바스크립트(Flash가 아닌 외부)에서 Flash 컨텐츠의 FileReference browse() 메소드를 같은 이유의 보안 문제로 호출할 수 없을때와 동일하다. 이와 관련되어서는 다음 글을 참고한다.

[Flash Player 10]FileReference의 변경된 보안정책과 새롭게 추가된 기능에 대한 나의 생각

아무튼, Flash Player 10 으로 업그레이드 되면서 보안문제때문에 걸리는게 한두개가 아니다. 이와 관련되서 명확히 이해할 수 있으면 좋겠다.

글쓴이 : 지돌스타(http://blog.jidolstar.com/)

Flash Player 10에 맞게 제작된 ActionScript 3.0 한글문서 입니다.
참조하세요. ^^

http://help.adobe.com/ko_KR/AS3LCR/Flash_10.0/
http://help.adobe.com/ko_KR/ActionScript/3.0_ProgrammingAS3/


글쓴이 : 지돌스타(http://blog.jidolstar.com/410)

+ Recent posts