Search

프로토타입 패턴

class
디자인 패턴
상태
완료
날짜
목차

프로토타입 패턴

프로토타입 패턴(Prototype Pattern)은 복잡한 객체의 생성 과정을 단순화하기 위해 사용됩니다.
이 패턴의 핵심 아이디어는 기존 객체를 복제하여 새로운 객체를 생성하는 것입니다.
특히 유니티와 같은 게임 개발 환경에서, 다양한 게임 오브젝트를 효율적으로 생성하고 관리하는 데 유용하게 쓰입니다.
객체 복제 : 기존 객체의 복제본을 생성하여, 새 객체를 만드는 데 필요한 비용과 시간을 줄입니다.
다형성 : 다양한 하위 클래스의 인스턴스를 동일한 방식으로 복제할 수 있습니다.
초기화 비용 절감: 복잡한 초기화 과정이 필요한 객체를 빠르게 복제할 수 있습니다.

프로토 타입 패턴의 장,단점

장점

성능 향상 : 객체를 처음부터 생성하는 것보다 복제하는 것이 성능 면에서 유리할 수 있습니다.
다형성 지원 : 다형적인 객체 생성을 지원하여, 객체의 구체적인 타입을 모르는 상태에서도 객체를 복제할 수 있습니다.
동적 클래스 확장 : 런타임에 새로운 클래스를 시스템에 쉽게 추가할 수 있습니다.

단점

복제 복잡성 : 복제 과정이 복잡한 객체에는 적용하기 어려울 수 있습니다.
숨겨진 비용 : 깊은 복사와 얕은 복사의 차이를 이해하고 적절히 적용해야 합니다.

숨겨진 비용에 대한 자세한 설명

깊은 복사와 얕은 복사의 차이를 이해하고 적절히 적용하는 것은 매우 중요합니다.
이 부분이 숨겨진 비용이라는 것 입니다.
여기서 '얕은 복사(Shallow Copy)'는 객체의 필드들을 복사하지만, 필드가 참조 타입일 경우 참조 자체를 복사합니다.
반면, '깊은 복사(Deep Copy)'는 참조 타입의 필드도 새로운 인스턴스를 생성하여 복사합니다.
예시를 들어보겠습니다.

얕은 복사 예시

유니티에서 Instantiate 메소드를 사용하면 게임 오브젝트의 얕은 복사본을 생성할 수 있습니다.
이는 오브젝트의 컴포넌트와 기본 프로퍼티들을 복사하지만, 참조형 필드에 대해서는 동일한 참조를 유지합니다.
using UnityEngine; public class ShallowCopyExample : MonoBehaviour { public GameObject original; void Start() { // 얕은 복사를 사용하여 새 객체 생성 GameObject clone = Instantiate(original); clone.transform.position = new Vector3(5, 0, 0); } }
C#
복사
위 코드에서, Instantiateoriginal 게임 오브젝트를 복제하지만, 모든 참조형 필드(예: 스크립트의 참조형 변수)는 원본과 동일한 객체를 가리킵니다.

깊은 복사의 필요성 및 예시

깊은 복사가 필요한 상황을 예로 들어보겠습니다.
게임 오브젝트가 복잡한 데이터 구조를 가지고 있고, 이 데이터 구조를 복제하여 완전히 독립된 새로운 인스턴스를 생성해야 하는 경우가 있습니다.
using UnityEngine; using System.Collections.Generic; public class DeepCopyExample : MonoBehaviour { public Enemy original; void Start() { // 깊은 복사를 사용하여 새 객체 생성 Enemy clone = Instantiate(original); clone.inventory = new List<Item>(original.inventory); // 깊은 복사 clone.health = original.health; // 복제된 적에게만 특별한 아이템 추가 clone.inventory.Add(new Item("Special Item")); } } public class Enemy : MonoBehaviour { public int health; public List<Item> inventory; } public class Item { public string name; public Item(string name) { this.name = name; } }
C#
복사
여기서 Enemy 클래스의 inventory 필드는 List<Item> 타입입니다.
Instantiate를 사용해 Enemy 객체를 복제할 때, inventory 리스트 자체는 복제되지만 리스트 내의 Item 객체들은 동일한 참조를 공유하게 됩니다. 이를 방지하기 위해, 깊은 복사를 사용하여 inventory의 각 Item 객체도 별도로 복제해야 합니다.

프로토 타입 패턴의 구조

프로토타입 패턴은 실제로 패턴 중에서 가장 구조적인 것이 없다고 생각합니다.
프로그래머가 객체를 어떻게 복사하느냐에 따라 구조가 바뀔 수 있기 때문입니다. 따라서, 가장 간단하게 알려져 있는 프로토타입 패턴의 구조에 대해 설명하겠습니다.
1.
프로토타입 인터페이스(Prototype Interface) : 복제(clone) 메소드를 정의합니다.
2.
구체적 프로토타입 클래스(Concrete Prototype Class) : 프로토타입 인터페이스를 구현하고, 실제 복제 로직을 제공합니다.
3.
사용(Client): 프로토타입 인스턴스를 복제하여 새 객체를 생성합니다.

프로토 타입 패턴의 UML

아래는 프로토 타입 패턴의 UML입니다.

프로토 타입 패턴의 구현

프로토타입 인터페이스 및 구체적 클래스
using UnityEngine; public interface IPrototype { IPrototype Clone(); } public class Enemy : MonoBehaviour, IPrototype { public int health; public string type; // Clone 메소드 구현 public IPrototype Clone() { return Instantiate(this); // 유니티의 Instantiate 함수로 복제 } }
C#
복사
클라이언트 코드
public class GameController : MonoBehaviour { public Enemy enemyPrototype; void Start() { // 프로토타입 객체 복제 Enemy clonedEnemy = enemyPrototype.Clone() as Enemy; clonedEnemy.health = 100; clonedEnemy.type = "Cloned Enemy"; // 복제된 적 캐릭터를 게임 세계에 배치하고 초기화합니다. } }
C#
복사