컴퓨터과학/0 + 소프트웨어 아키텍처(디자인 패턴)

[소프트웨어 아키텍처] 13. 프로토타입 패턴(Prototype Pattern -java)

힘들면힘을내는쿼카 2022. 12. 7. 10:10
728x90
반응형

프로토타입 패턴(Prototype Pattern)

출처: https://www.youtube.com/watch?v=gsqv23fKzp0

 

클래스의 인스턴스를 생성할 때 자원과 시간이 많이 들거나 복잡하다면 프로토타입 패턴을 사용하면 됩니다.
프로토타입 패턴을 사용하면 기존 인스턴스를 복사하기만 해도 새로운 인스턴스를 만들 수 있습니다.(java 에서는 clone() 메소드를 사용하거나 역직렬화를 하면 됩니다.^^)

본래의 객체를 새로운 객체에 복사하여 우리의 필요에 따라 수정하는 메커니즘을 제공합니다.

프로토타입 패턴을 가장 큰 특징은 클라이언트에서 어떤 클래스의 인스턴스를 만드는지 전혀 모르는 상태에서도 새로운 인스턴스를 만들 수 있다는 점 입니다.

728x90

프로토 타입 패턴 구조

깊은 복사, 얇은 복사

깊은 복사와 얇은 복사에 대해서 들어본적이 있으신가요?

먼저, 우리는 모든 데이터 타입은 값 타입(primitive type), 참조 타입(reference type)을 가진다는 것을 인지하고 있어야 합니다. Java의 데이터 타입의 분류(기본 타입, 참조 타입)와 메모리 영역

  • 기본 타입
    • 실제 데이터 값을 저장 하는 타입
  • 참조 타입
    • 객체의 주소를 저장하는 타입

프로토타입 패턴 그리고 깊은 복사, 얇은 복사

Employees

public class Employees implements Cloneable {
    private List<String> empList;

    public Employees() {
        this.empList = new ArrayList<>();
    }

    public Employees(List<String> list) {
        this.empList = list;
    }

    public void loadData() {
        empList.add("Kim");
        empList.add("Park");
        empList.add("Jang");
    }

    public List<String> getEmpList() {
        return empList;
    }

    public void add(String str) {
        System.out.println(str+" 추가");
        empList.add(str);
    }

    /**
     * 깊은 복사
     * 객체의 실제 값을 복사한다.(참조를 공유하지 않는다.)
     * clone() 메소드를 재정의하기 위해 Cloneable 인터페이스를 구현
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        List<String> temp = new ArrayList<>();
        for (String s : empList) {
            temp.add(s);
        }
        return new Employees(temp);
    }
}

Client

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        Employees emps = new Employees();
        emps.loadData();

        Employees deepCopy = (Employees) emps.clone(); //깊은 복사
        Employees shallowCopy = emps; //얇은 복사

        System.out.println("original = "+emps.getEmpList()+", "+emps);
        deepCopy.add("깊은 밍밍이");
        shallowCopy.add("얇은 싱싱이");

        System.out.println("original = "+emps.getEmpList()+", "+emps);
        System.out.println("deepCopy = "+deepCopy.getEmpList()+", "+deepCopy);
        System.out.println("shallowCopy = "+shallowCopy.getEmpList()+", "+shallowCopy);
    }
}

결과

original = [Kim, Park, Jang], kr.ac.uos.designpattern.practice.prototype.Employees@6c629d6e
깊은 밍밍이 추가
얇은 싱싱이 추가
original = [Kim, Park, Jang, 얇은 싱싱이], kr.ac.uos.designpattern.practice.prototype.Employees@6c629d6e
deepCopy = [Kim, Park, Jang, 깊은 밍밍이], kr.ac.uos.designpattern.practice.prototype.Employees@b065c63
shallowCopy = [Kim, Park, Jang, 얇은 싱싱이], kr.ac.uos.designpattern.practice.prototype.Employees@6c629d6e

얇은 복사는 주소 값이 동일한 것을 알수 있고, 깊은 복사는 인스턴스가 새로 생성됨을 알 수 있다.

반응형

프로토타입 패턴의 장단점

장점

  • 클라이언트는 새로운 인스턴스를 만드는 과정을 몰라도 됩니다.!
  • 클라이언트는 구체적인 형식을 몰라도 객체를 생성할 수 있습니다.
  • 상황에 따라서 객체를 생성하는 것보다 복사하는것이 효율적일 수 있습니다.
  • 시스템에서 복잡한 클래스 계층구조에 있는 다양한 형식의 객체 인스턴스를 새로 만들어야 할 때 유용하게 사용 가능합니다.^^

단점

  • 객체의 복사본을 만드는 작업이 매우 복잡할 수도 있습니다.

 

 

728x90
반응형