본문 바로가기

Programming/Design pattern

[Design pattern] 프로토타입(Prototype) 패턴

파이썬 로고

프로토타입(Prototype) 패턴

프로토타입 패턴기존 객체를 복제(clone)해서 새로운 객체를 생성하는 디자인 패턴입니다.
새로운 인스턴스를 만들 때 클래스 생성자(__init__)를 거치지 않고, 기존 객체를 기반으로 빠르게 복제할 수 있도록 합니다. 객체를 일일이 새로 만드는 게 아니라, 샘플 객체를 복사해서 재사용하는 방식입니다.

프로토타입 패턴은 다음과 같은 경우에 사용됩니다.

  • 객체 생성 비용이 크거나, 객체 생성 과정이 복잡한 경우
  • 다양한 구성의 인스턴스를 자주 생성해야 하는 경우
  • 런타임 시점에 객체 구조를 동적으로 정의하고 싶은 경우

Python의 프로토타입 패턴 생성 : copy 모듈

import copy

original = {"name": "John", "skills": ["Python", "Security"]}
shallow = copy.copy(original)
deep = copy.deepcopy(original)

파이썬에서는 객체를 복제하기 위해 copy 모듈을 사용할 수 있습니다.

copy 모듈에서는 얕은 shallow copy와 deepcopy를 지원해줍니다.

함수 설명
copy.copy() 얕은 복사 (중첩 객체는 참조 공유)
copy.deepcopy() 깊은 복사 (중첩 객체도 새로 복제)

 

프로토타입패턴 예제

import copy

class Document:
    def __init__(self, title, author, content, footer):
        self.title = title
        self.author = author
        self.content = content
        self.footer = footer

    def clone(self):
        return copy.deepcopy(self)

    def show(self):
        print(f"제목: {self.title}")
        print(f"작성자: {self.author}")
        print(f"내용: {self.content}")
        print(f"푸터: {self.footer}")
        print("-" * 30)

위의 예제에서 clone() 메소드는 현재 객체를 deep copy하여 새로운 인스턴스를 생성합니다.

deepcopy를 사용함으로 내부 값들까지 안전하게 복제합니다.

# 문서 템플릿 생성
contract_template = Document(
    title="표준 계약서",
    author="홍길동",
    content="본 계약은 다음 조건에 따라 작성됩니다...",
    footer="Confidential. Do not distribute."
)

# 복제하여 새로운 계약 문서 작성
employee_contract = contract_template.clone()
employee_contract.author = "김개발"
employee_contract.content = "김개발과 회사 간의 계약 조건은 다음과 같습니다..."

nda_contract = contract_template.clone()
nda_contract.author = "이기획"
nda_contract.content = "본 NDA는 다음의 보안 조건에 따라 체결됩니다..."

# 출력
contract_template.show()
employee_contract.show()
nda_contract.show()

contract_template은 문서의 기본 형태로 사용될 프로토타입입니다. 해당 템플릿 객체를 clone 한 뒤 복제된 객체의 속성을 업데이트합니다. 위와 같이 copy를 통해 새로운 객체를 생성하면, 객체 생성과정에서 발생하는 비용을 줄일 수 있습니다.

 

프로토타입 패턴은 "기존 것을 복사해서 새로운 것을 만들자"는 단순한 아이디어지만,
파이썬처럼 유연한 언어에서는 copy.deepcopy()와 결합해 아주 쉽게 구현할 수 있습니다.
템플릿 개념이 필요한 상황에서 프로토타입 패턴은 유지보수성과 재사용성을 동시에 챙길 수 있는 좋은 선택지입니다.