본문 바로가기
Programming

디자인패턴 시리즈 11. 프로토타입 패턴 (prototype Pattern)

by LeeJ1Hyun 2023. 1. 24.

프로토타입 패턴 (prototype Pattern)

특정한 클래스의 인스턴스를 만들 때 자원과 시간이 많이 들거나 복잡할 때 사용하면 좋은 패턴이다.

코드에 적용해보기

어떤 제품을 만들어서 출시하기에 앞서 테스트를 위한 샘플을 만드는데 이를 프로토타입이라고 한다. 객체를 생성하는 게 복잡하거나 이미 비슷한 객체가 있는 경우에 프로토타입 패턴을 이용하여 원본 객체를 새로운 객체에 복사하여 사용할 수 있다.

 

 

일반적으로 원본 객체를 복사하기 위해 자바의 clone() 메소드를 사용한다. Cloneable 인터페이스를 구현하여야 사용할 수 있으므로 상속 받는다. 예시 코드에서는 getClone() 메소드를 직접 만들어 구현해보겠다.

 

public interface Prototype {
    public Prototype getClone();
}

 

Prototype 인터페이스를 통하여 getClone 메소드를 정의한다. 이 메소드는 새로운 인스턴스를 만들어준다.

 

class ConcretePrototype1 implements Prototype {

    private String attribute;

    public ConcretePrototype1(String attribute) {
        this.attribute = attribute;
    }

    public String getAttribute() {
        return attribute;
    }

    public void setAttribute(String attribute) {
        this.attribute = attribute;
    }

    @Override
    public Prototype getClone() {
        return new ConcretePrototype1(attribute);
    }
}

 

구현 클래스인 ConcretePrototype1에서는 private 변수를 통해 attribute를 전달 받고 생성자를 통해 주입한다. getClone() 메소드를 상속 받아 해당 attribute에 해당하는 새로운 인스턴스를 생성하여 반환한다.

 

public class Client {
    public static void main(String[] args) {
        ConcretePrototype1 prototype1 = new ConcretePrototype1("prototype1");
        ConcretePrototype1 prototype2 = (ConcretePrototype1) prototype1.getClone();

        System.out.println(prototype1.getAttribute());
        System.out.println(prototype2.getAttribute());
    }
}

// prototype1
// prototype1

 

클라이언트에서는 ConcretePrototype1의 인스턴스를 2개 만들고 하나는 new 연산자를 이용하여 prototype1의 attribute를 갖는 프로토타입을 만들어낸다. 나머지 하나는 getClone() 메소드를 이용하여 복사해서 새로운 인스턴스를 만든다. 이는 복사한 오리지널 객체에서 독립적으로 수정되었다.

 

여기서 복사의 개념이 등장하는데 얕은 복사는 하나의 객체의 주소값을 복사하는 것이고, 깊은 복사는 하나의 객체의 값들을 복사하는 것이다. 위 방식으로 prototype1, 2 객체의 주소값을 찍어보면 prototype.pattern.test.ConcretePrototype1@17f6480, prototype.pattern.test.ConcretePrototype1@2d6e8792 두 값이 다른 것을 알 수 있다. 즉, 깊은 복사를 통한 구현 방식임을 알 수 있다.

 

 

클라이언트는 새로운 인스턴스를 만드는 과정을 몰라도 되고, 구체적인 형식을 몰라도 객체를 만들 수 있다. 상황에 따라서 객체를 새로 만드는 것보다 복사하는 것이 유용할 때가 있기 때문에 프로토타입 패턴을 사용한다.

 

 

 

 

 

* 아래의 자료들을 참고하였습니다.

에릭 프리먼 · 엘리자베스 롭슨 · 케이시 시에라 · 버트 베이츠, 『헤드퍼스트 디자인패턴 개정판』, 서환수 옮김, 한빛미디어(2022), p646-647.

댓글