본문 바로가기

언어/Java

[ Java ] Prototype Pattern - 프로토타입 패턴 알아보기

반응형

1. 프로토타입 패턴 (Prototype Pattern)

1. 정의
프로토타입 패턴은 기존 객체를 복제(clone)하여 새로운 객체를 생성하는 방식의 디자인 패턴입니다. 이 패턴은 새 객체를 생성하는 대신, 미리 정의된 객체의 복사본을 사용하여 새로운 객체를 얻는 것이 핵심입니다. 이를 통해 객체를 생성하는 데 드는 비용을 절감하고, 복잡한 객체 생성 과정을 단순화할 수 있습니다.

2. 목적

  • 객체를 새로 생성하는 비용이 클 경우, 프로토타입을 사용해 빠르고 효율적으로 객체를 생성할 수 있습니다.
  • 객체의 복사본을 생성할 때, 새로운 객체와 원본 객체가 동일한 상태를 유지하도록 하고 싶을 때 유용합니다.
  • 복제된 객체는 기존 객체의 상태를 공유하거나 초기화하지 않고 별도의 객체로 사용될 수 있습니다.

3. 사용 예시
복제(clone) 기능이 필요한 이유는 다음과 같은 경우에서 유용할 수 있습니다:

  • 성능 최적화: 복잡한 객체를 직접 생성하는 비용을 줄이기 위해 복제본을 사용합니다.
  • 상황에 따른 객체 변형: 기존 객체에서 일부 속성만 다른 객체를 생성할 때 유용합니다.
  • 상태가 동일한 여러 객체가 필요한 경우: 객체의 상태가 동일하지만, 새로운 객체를 생성할 때의 복잡성을 피하려고 할 때 사용합니다.

4. 구현 방법
자바에서 프로토타입 패턴은 보통 Cloneable 인터페이스를 구현하고, clone() 메서드를 재정의하여 구현됩니다. 기본적으로 자바의 Object 클래스는 clone() 메서드를 제공합니다. 이를 통해 객체의 얕은 복사(Shallow Copy)가 가능합니다.

// 프로토타입 패턴을 구현한 예시

class Prototype implements Cloneable {
    private String name;
    private int age;

    public Prototype(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void showInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }

    // Cloneable 인터페이스를 구현하여 복제 메서드 제공
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();  // 얕은 복사(Shallow Copy) 구현
    }
}

public class PrototypePatternDemo {
    public static void main(String[] args) {
        try {
            // 원본 객체 생성
            Prototype original = new Prototype("John", 25);
            original.showInfo();

            // 원본 객체 복제
            Prototype clone = (Prototype) original.clone();
            clone.showInfo();

            // 복제 객체의 상태 변경
            clone.setName("Doe");
            clone.setAge(30);
            clone.showInfo();  // 복제된 객체의 변경 사항 확인

            // 원본 객체의 상태는 그대로 유지됨
            original.showInfo();

        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

5. 장점

  • 복잡한 객체 생성 비용 절감: 복잡한 초기화 과정을 거치지 않고, 기존 객체를 복제하여 효율적으로 객체를 생성할 수 있습니다.
  • 객체의 구조 및 속성 유지: 복제된 객체는 원본 객체의 구조와 속성을 그대로 유지하며, 필요한 경우 일부 속성만 변경할 수 있습니다.

6. 단점

  • 깊은 복사 문제: 기본적으로 clone() 메서드는 얕은 복사를 수행하므로, 객체의 내부에 참조하는 다른 객체가 있을 경우 원본과 복제본이 동일한 참조를 가리킬 수 있어 문제가 발생할 수 있습니다. 이를 해결하기 위해서는 깊은 복사(Deep Copy)를 구현해야 합니다.
  • 복제 가능한 객체의 제한: 복제 가능한 객체는 Cloneable 인터페이스를 구현해야 하며, 이는 모든 객체에 적용할 수는 없습니다.

7. 깊은 복사(Deep Copy)
깊은 복사는 객체의 필드뿐만 아니라 그 필드가 참조하는 객체들도 모두 복사하는 방식입니다. 자바에서는 깊은 복사를 수동으로 구현하거나 Serializable 인터페이스를 활용할 수 있습니다.

프로토타입 패턴은 복잡한 객체의 생성 비용을 줄이고, 동일한 구조의 객체를 반복해서 사용해야 할 때 매우 유용합니다.

반응형