프로토타입 패턴 (Prototype Pattern)

이번 시간에는 prototype 패턴에 대해 알아보겠습니다.
객체 생성을 위한 디자인 패턴 중에서는 마지막 패턴이네요.

1. 객체 생성을 위한 디자인 패턴
  • Singleton(싱글톤) 패턴
  • Abstract Factory 패턴
  • Builder 패턴
  • Factory Method 패턴
  • Prototype 패턴

우리는 앞에서 객체를 생성해주는 여러가지 방식을 살펴보았습니다.
부분부분을 먼저 생성해서 최종으로 하나의 완성본을 만들기도 하고, 대행 함수를 통해 객체를 만들기도 했습니다.
이번에 배울 prototype 패턴은 "이미 생성된 객체를 복제해서 새로운 객체를 생성하는 방법"입니다.

이 패턴은 간단해서 이해하기는 쉽습니다. 이미 있는 객체를 복제한다는 것이 키 포인트입니다.
이러한 기존 객체 복제 방식은 아마도 게임에서 많이 사용할 것입니다.
게임에서는 다양한 캐릭터가 등장하고 이러한 캐릭터들이 게임 진행 상태에 따라 진화하여 또 다른 발전된 캐릭터로 발전하기도 합니다.
이러한 진화된 캐릭터는 또 다른 class 로 설계할 필요없이 모든 캐릭터가 진화 값에 따라 다른 동작을 하도록 하면 될 것입니다. 진화될 때마다 기존의 객체를 복제하고 진화 값을 설정해주면 다른 동작을 하도록 구현할 수 있습니다.
또한, 스타크래프트에서 저그같은 유닛을 계속 생산해내는 경우, 똑같은 캐릭터 객체를 계속 복제해서 생산해내면 아주 간단할 것입니다.
생산된 객체는 어차피 정확히 같으면 되니까요.

아래의 class 구조도와 간단한 코드를 보시죠.

 

// client operation
Prototype * base_object = new ConcretePrototype1;
Prototype * clone_object = base_object->Clone();

Client 는 초기에 base_object 를 만들어두고 필요 시에 base_object 의 Clone 함수를 호출하여 똑같은 Prototype 객체를 만들어낼 수 있습니다.

prototype 패턴에 대한 sample 은 여러분도 쉽게 만들어낼 수 있을 것 같습니다.
여러분이 직접 만들어보시기 바랍니다.
힌트를 드리면, Prototype 은 virtual 로 추상 class 를 만들고, ConcreatePrototype 들은 Prototype class 를 상속하여 Clone 함수를 구현하면 됩니다. 즉, 자신을 정확히 복제하여 리턴하도록 구현하면 됩니다.

다만 prototype 패턴을 구현 시에 가장 주의해야할 점이 있는데, 이는 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)입니다.
c++ 언어에서는 프로그래머가 별도로 복제 생성자(Copy Constructor)를 정의하지 않는 한 기본적으로 Shallow Copy 형태의 복제 생성자(clone())가 제공됩니다.
하지만, 이러한 기본적인 복제 생성자는 포인터 데이터 멤버를 사용할 경우 문제가 됩니다.
왜냐하면, 포인터 자체를 복제할 뿐 포인터 자체가 가리키는 내용물까지 모두 복제해주는 개념은 아니기 때문입니다.
이럴 경우 다양한 객체의 함수를 수행할 때 프로그래머가 이러한 사항을 모든 경우에서 인지하고 있지 못하면 자칫 프로그램이 Down 되거나 오동작을 일으킬 수 있습니다.
따라서, 보통은 데이터 멤버에 포인터 변수가 있는 경우 직접 깊은 복사 방식으로 구현해주는 것이 좋습니다.

이러한 prototype 패턴의 경우 어떨 때 사용하면 편리할까요 ?
위에서 게임유닛에 대해서 잠깐 언급했지만 prototype 패턴을 사용하면 다음과 같은 점이 좋습니다.

  • 실행할 객체가 run-time 에 결정될 경우 유용하다.
  • 몇몇의 표본 객체를 만들어두면 이를 이용하여 무한정의 복제된 객체를 만들어낼 수 있다.
  • Abstract Factory 나 Builder 패턴의 경우 생성될 객체의 자료형에 따라 객체를 생성해주기 위한 클래스들을 정의해야 하지만, prototype 패턴에서는 이것이 필요없다.

단점은 역시 각 ConcretePrototype 클래스들이 각자 모두 Clone 함수를 구현해야 한다는 것입니다. 

참고로 프로토타입 매니저(Prototype Manager)라는 것이 있는데, 이는 복제할 원본 객체가 동적으로 추가, 삭제될 수 있는 환경에서 원본 객체들을 모아서 관리하는 역할을 담당하는 객체를 별도로 두는 것을 말합니다. 포토샾같은 그래픽 프로그램에서 파레트(Pallette)가 그러한 역할을 할 것입니다.

자, 여기까지 객체 생성을 위한 디자인 패턴을 모두 살펴보았습니다.
다음 시간부터는 "구조 개선을 위한 디자인 패턴"들을 공부해보도록 하겠습니다.

You may also like...

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x