해당 포스트는 "자바 객체지향 디자인 패턴", "JAVA 언어로 배우는 디자인 패턴 입문" 책의 내용을 요약한 것이다.



※프로토타입(Prototype) 패턴

: 동일한 객체를 여러 번 생성해야 하는 비용을 줄이기 위해 고안된 패턴이다.

object 생성 비용이 높을 경우, 예를 들어 db에서 수 백개의 데이터를 읽어들인 후 객체를 생성해야 한다면 매번 객체를 생성할 때 마다 엄청난 비용이 들것이다. 이럴 때 한번만 db에서 읽어들인 후 객체를 생성하고 프로토타입 패턴을 통해 이 객체를 계속 복제해서 사용한다면 비용을 상당히 줄일 수 있다.

 

 

 

ex)
public class person implements Cloneable{
   private String gender;
   private String age;
   pirvate String work;

   public Person(String gender, String age, String work){
      this.gender = gender;
      this.age = age;
      this.work = work;
   }
   public Person clone() throws CloneNotSupportedException{
        Person p = (Person)super.clone();
        return p;
   }
}

public class Client{
   public static void main(String args[]{
           Person p = new Person("man", "13", "work");
           Person p1 = p.clone();
   }
}

위와 같이 자바에서 제공하는 clone 기본 메서드가 있는 데 해당 함수가 protected로 정의되어 있어서 외부에서 호출이 불가능하다 그래서 Cloneable 인터페이스를 상속 받은 후 외부에서 clone 메서드를 호출할 수 있도록 public 메서드 내부에 clone 메서드를 호출해야 한다. 위 main 함수를 보면 Person 객체 p를 생성한 후 p.clone 메서드를 통해서 생성자 호출 없이 복사하여 p1을 생성했다. 만약 Person 생성자 내부에서 db의 데이터를 여러 개 로딩한 후 필드값을 정의하는 메커니즘으로 되어 있다면 매번 new 생성자로 Person 객체를 만드는 것은 많은 비용이 들 것이다. 이 때 clone 메서드를 통해서 복사를 하게 된다면 매번 db에 접근하지 않고도 새로운 Person 객체를 만들 수  있다. 또한 객체 p에 들어 있는 값과 p1에 들어있는 값이 똑같기 때문에 기존의 객체의 값을 전체가 아닌 조금만 수정하고 싶다면 clone 메서드를 통해서 값을 똑같이 복사한 후 값을 일부분만 수정할 수 있다.

그리고 clone 메서드에서 주의할 점이 기본형 타입의 변수가 아닌 사용자가 정의한 클래스 객체를 포함한 reference type 변수를 clone을 통해 복사할 시 값에 의한 복사가 아닌 주소값 복사가 이루어진다. 만약 Person p 클래스의 변수로 사용자가 정의한 Work 클래스의 필드가 있고 p.clone을 통해서 복사하여 객체를 만들었다고 가정하자. 여기서 p객체 기본형 타입 속성을 변경한다면 p1 객체는 아무런 영향을 받지 않는다. 왜냐하면 기본형 타입 변수는 복사할 때 값 자체가 복사되기 때문이다. 하지만 p 겍체에서 사용자가 정의한 Work 클래스 객체 즉, reference type 변수를 수정하게 된다면 p1 객체의 Work 클래스 객체도 마찬가지로 수정이 된다. 왜냐하면 clone을 통한 복사가 reference type 변수일 경우 주소값 복사가 이루어지기 때문이다.  

'자바 > 디자인패턴' 카테고리의 다른 글

플라이웨이트 패턴  (0) 2017.06.08
퍼사드 패턴  (0) 2017.06.08
컴퍼지트 패턴  (0) 2017.06.07
데코레이터(Decorator) 패턴  (0) 2017.06.06
옵저버(Observer) 패턴(2) - 직접 구현  (0) 2017.06.06

+ Recent posts