본문 바로가기
Thinking/Concept

프로토타입 패턴(Prototype Pattern) 이해하기

by Dev_카페인 2024. 11. 14.
반응형

프로토타입 패턴(Prototype Pattern) 이해하기

프로토타입 패턴은 객체 생성 패턴 중 하나로, 기존 객체를 복제하여 새로운 객체를 생성하는 방식입니다. 새로운 객체를 생성할 때 복잡한 초기화나 설정 과정이 필요한 경우, 프로토타입 패턴을 사용하면 기존 객체를 복사하는 방식으로 객체 생성 속도를 높이고 리소스 사용을 줄일 수 있습니다.

이번 포스트에서는 프로토타입 패턴의 개념과 구조, 구현 방법, 장단점 및 사용 시점에 대해 자세히 알아보겠습니다.

 

프로토타입 패턴이란?

프로토타입 패턴은 기존 객체를 복제(clone)하여 새로운 객체를 생성하는 방식의 디자인 패턴입니다. 이 패턴을 사용하면 복제 기능을 제공하는 객체를 활용하여 객체 생성 과정을 간소화할 수 있으며, 동일한 특성을 가진 객체를 빠르게 생성할 수 있습니다.

프로토타입 패턴은 특히 복잡한 초기화가 필요하거나 성능 최적화가 중요한 경우에 유용하며, 객체 복제를 통해 객체 생성을 단순화합니다.

프로토타입 패턴의 구조

프로토타입 패턴의 기본 구조는 다음과 같은 요소들로 구성됩니다.

  1. Prototype (원형 인터페이스): 객체를 복제하는 메서드를 정의하는 인터페이스입니다. 일반적으로 Clone() 메서드를 통해 객체를 복제합니다.
  2. ConcretePrototype (구체적인 원형 클래스): Prototype 인터페이스를 구현하여 Clone() 메서드를 통해 자신을 복제합니다.
  3. Client (클라이언트): Prototype 인터페이스를 사용하여 객체를 복제하며, 객체 생성에 필요한 구체적인 클래스를 알 필요가 없습니다.

프로토타입 패턴의 구현 방법

C#에서는 ICloneable 인터페이스를 구현하여 객체 복제를 지원할 수 있습니다. MemberwiseClone 메서드를 사용하여 얕은 복사(shallow copy)를 수행하거나, 모든 속성을 복사해 새로운 객체를 만드는 깊은 복사(deep copy) 방식으로 구현할 수도 있습니다.

예제 코드: 문서 복제 예제

문서 시스템에서 복잡한 설정이 적용된 여러 문서 템플릿을 복제하여 새로운 문서를 생성하는 예제를 통해 프로토타입 패턴을 구현해보겠습니다.

// Prototype 인터페이스
public abstract class DocumentPrototype
{
    public abstract DocumentPrototype Clone();
}

// ConcretePrototype 클래스 (구체적인 원형 클래스)
public class WordDocument : DocumentPrototype
{
    public string Content { get; set; }
    public List<string> Images { get; set; } = new List<string>();

    // 복제 메서드
    public override DocumentPrototype Clone()
    {
        // 깊은 복사 수행 (Images 리스트를 포함하여 복사)
        WordDocument clone = (WordDocument) this.MemberwiseClone();
        clone.Images = new List<string>(Images);
        return clone;
    }

    public void ShowDocument()
    {
        Console.WriteLine("Content: " + Content);
        Console.WriteLine("Images: " + string.Join(", ", Images));
    }
}

// Client 코드
class Program
{
    static void Main()
    {
        // 원본 객체 생성
        WordDocument originalDoc = new WordDocument();
        originalDoc.Content = "Original Document";
        originalDoc.Images.Add("Image1");
        originalDoc.Images.Add("Image2");

        Console.WriteLine("Original Document:");
        originalDoc.ShowDocument();

        // 복제된 객체 생성
        WordDocument clonedDoc = (WordDocument)originalDoc.Clone();
        clonedDoc.Content = "Cloned Document";
        clonedDoc.Images.Add("Image3");

        Console.WriteLine("\nCloned Document:");
        clonedDoc.ShowDocument();

        Console.WriteLine("\nOriginal Document After Cloning:");
        originalDoc.ShowDocument();
    }
}

위 코드에서 WordDocument는 DocumentPrototype 클래스를 상속받아 Clone() 메서드를 통해 객체를 복제할 수 있도록 합니다. Clone() 메서드에서는 MemberwiseClone()을 사용하여 얕은 복사를 수행한 후, 리스트 같은 참조 타입 속성은 새로운 인스턴스로 깊은 복사를 합니다. 이렇게 하면 원본과 복제본이 각기 다른 데이터를 가질 수 있습니다.

실행 결과는 다음과 같습니다:

Original Document:
Content: Original Document
Images: Image1, Image2

Cloned Document:
Content: Cloned Document
Images: Image1, Image2, Image3

Original Document After Cloning:
Content: Original Document
Images: Image1, Image2

복제된 객체와 원본 객체가 독립적인 값을 가지므로, 프로토타입 패턴을 통해 복잡한 설정이나 데이터를 갖춘 객체를 간편하게 복사할 수 있습니다.

 

프로토타입 패턴의 장단점

장점

  1. 객체 생성 속도 향상: 복제를 통해 객체를 생성하므로, 복잡한 초기화 과정을 생략하여 생성 속도를 높일 수 있습니다.
  2. 메모리 효율성: 비슷한 구성의 객체를 반복해서 생성해야 할 때 프로토타입 패턴을 사용하면 메모리를 절약할 수 있습니다.
  3. 확장성: 새로운 클래스가 추가되어도 기존 코드 수정 없이 새로운 프로토타입을 추가할 수 있습니다.

단점

  1. 깊은 복사와 얕은 복사 처리: 복제 시 참조형 필드의 깊은 복사가 필요하다면, 이를 별도로 구현해야 하므로 복잡도가 증가할 수 있습니다.
  2. 구현 복잡성: 복제 메서드가 객체의 내부 구조를 알고 있어야 하므로, 구조가 복잡한 객체의 경우 Clone() 메서드 구현이 어려울 수 있습니다.
  3. 메모리 사용 주의: 불필요하게 많은 객체를 복제할 경우 오히려 메모리 사용량이 증가할 수 있습니다.

 

언제 프로토타입 패턴을 사용해야 할까?

프로토타입 패턴은 다음과 같은 경우에 적합합니다.

  1. 복잡한 초기화 과정이 있는 객체가 반복적으로 필요할 때: 초기화 시간이 오래 걸리거나 설정이 복잡한 객체를 자주 생성해야 할 경우, 프로토타입 패턴을 사용하여 속도와 효율성을 높일 수 있습니다.
  2. 클래스 생성 비용이 높은 경우: 데이터베이스 연결, 파일 읽기, 네트워크 요청 등의 리소스가 많이 필요한 초기화 작업을 줄이기 위해 복제를 통해 객체를 생성하는 것이 유리할 수 있습니다.
  3. 서로 유사한 객체를 생성해야 하는 경우: 비슷한 속성을 가진 여러 객체가 필요할 때 프로토타입 패턴을 통해 원본 객체를 복제하여 쉽게 새로운 객체를 생성할 수 있습니다.
  4. 런타임에 객체의 구조를 동적으로 변경해야 할 때: 프로그램 실행 중에 객체의 구조를 변경하거나 다양한 설정을 가진 객체를 생성해야 할 경우, 원본 객체를 기반으로 복제하여 동적 구성을 손쉽게 변경할 수 있습니다.

 

프로토타입 패턴과 다른 생성 패턴의 차이점

프로토타입 패턴과 다른 생성 패턴, 특히 팩토리 메소드 패턴추상 팩토리 패턴은 객체 생성 방식을 정의하지만, 프로토타입 패턴은 객체의 복제에 중점을 둡니다.

  • 팩토리 메소드 패턴: 객체 생성을 하위 클래스에서 구현하여 객체의 종류를 결정하도록 합니다.
  • 추상 팩토리 패턴: 상호 관련된 객체 집합을 생성하는 인터페이스를 제공합니다.
  • 프로토타입 패턴: 객체를 새로 생성하는 것이 아닌, 기존 객체를 복제하여 새로운 객체를 생성합니다.

따라서, 새로운 객체 생성을 위한 로직이 복잡한 경우에는 팩토리 패턴을, 기존 객체와 유사한 객체가 필요한 경우에는 프로토타입 패턴을 사용하는 것이 적절합니다.

 

마무리하며

프로토타입 패턴은 기존 객체를 복제하여 새로운 객체를 빠르게 생성하고자 할 때 유용한 디자인 패턴입니다. 복제 기능을 통해 초기화 과정을 단축하고, 유사한 구조의 객체를 반복적으로 생성할 수 있습니다. 그러나 깊은 복사와 얕은 복사를 적절히 구현해야 하며, 메모리 사용량을 고려해야 합니다.

소프트웨어 설계에서 복잡한 초기화 과정을 단순화하고, 유사한 객체를 반복적으로 생성해야 할 경우 프로토타입 패턴을 고려해 보세요.

반응형