[객체 생성 패턴] Chapter 5-1. Prototype Pattern : 패턴 소개

 

✍️ 프로토타입 패턴, 패턴 소개

프로토타입 패턴은 기존 인스턴스를 복제해서 새로운 인스턴스를 만드는 패턴으로 일반적으로 기존 인스턴스를 응용해서 새로운 인스턴스를 생성할 때 유용하게 사용된다.

특히 인스턴스를 생성할 때 시간이 오래 걸리는 작업이, DB에서 어떤 값을 읽어온 다음 생성자에 넘겨주는, 선행돼야 한다면 인스턴스를 생성할 때마다 DB로부터 값을 읽어오고 인스턴스를 생성하는 작업은 많은 자원을 소모할 것이다. 대신에 한번 생성된 인스턴스의 모든 값을 복사해서 새로운 인스턴스를 만들고 원하는 값만 변경한다면 DB 접근 없이도 새로운 인스턴스를 구성할 수 있다.

 

프로토타입 패턴의 구조는 심플하다. Prototype 인터페이스는 복제를 추상화한 Clone 메서드를 포함하고, 복제 기능을 제공할 클래스는 프로토타입 인터페이스를 구현함으로써 복제된 인스턴스를 클라이언트에 제공하게 된다.

 

🍊 프로토타입 패턴, 적용 전 코드

가령, 매우 심플하게 국가의 정보(국가명, 대륙, 국가 번호)를 담는 Country 클래스가 있고, DB로부터 한국의 정보를 가져와서 객체를 구성하는 loadKoreaFromDB 메서드가 있다고 가정해 보자.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Country {
    private String name; // 국가명
    private String continent; // 대륙
    private int phone; // 국가 번호

    // 한국 정보를 DB에서 얻어온다고 생각하자!!!
    public void loadKoreaDataFromDB(){
        name = "Korea";
        continent = "Asia";
        phone = +82;
    }
}

 

또 Country를 멤버로 갖는 Person 클래스가 있다.

@Data
@AllArgsConstructor
public class Person {
    private String name;
    private String address;
    private int age;
    private Country country;
}

 

우리가 홍길동이라는 이름을 가진 객체 korean을 생성하기 위해선 Country 객체를 생성하고, loadKoreaFromDB을 호출해 인스턴스를 구성하는 작업이 선행돼야 한국인을 나타내는 객체를 생성할 수 있다.

public class App {
    public static void main(String[] args) {
        Country korea = new Country();
        korea.loadKoreaDataFromDB();

        Person korean = new Person("홍길동", "seoul", 17, korea);
        System.out.println(korean);
    }
}

 

이후에 한국인을 표현하는 다른 객체를 생성해야 한다면 또다시 Country 객체를 생성하고 loadKoreaFromDB을 호출하는 선행 작업을 거쳐야 한다.

Country korea = new Country();
korea.loadKoreaDataFromDB();

Person korean2 = new Person("Kangworld", "seoul", 20, korea);
System.out.println(korean);

 

이 문제에 대해선 이렇게 반문할 수 있다. 객체 korea를 어딘가에 잘 저장했다가 재사용하면 해결되지 않는가?

틀린 말은 아니다. 앞선 문제가 어느 정도 해결되겠지만, 만약 한국인을 표현하는 여러 객체를 만들어야 한다면 생성자를 호출하고 매개변수에 값을 넘겨주는 매우 유사하고 반복적인 코드는 피할 수 없을 것이다.

예를 들어, 과장을 좀 보태서 홍길동의 같은 반 친구들의 객체를 만들어야 한다면 사실상 이름을 제외하고 모든 속성은 동일할 텐데 홍길동을 만들었을 때처럼 Country 객체를 생성하고 일련의 값들을 생성자에 넘겨주는 것보단 홍길동의 복사본을 만들고 이름만 변경해 주는 것이 더 합리적인 객체 생성 방법일 것이다.

Person korean = new Person("홍길동", "seoul", 17, korea);
Person korean2 = new Person("페이커", "seoul", 17, korea);
Person korean3 = new Person("도파", "seoul", 17, korea);

 

앞서 말한 복사본을 만든다는 개념이 프로토타입이 가진 정신으로 적용된 코드는 다음 포스팅에서 작성하겠읍니다.

 

 

 

 

인프런의 백기선님의 강의 코딩으로 학습하는 GoF의 디자인 패턴을 참고해서 작성했습니다.

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com