JAVA/JAVA Design Pattern

JAVA - 프로토타입(Prototype) 패턴

임베디드 친구 2024. 12. 23. 08:57
반응형

1. 프로토타입 패턴이란?

프로토타입 패턴(Prototype Pattern)은 객체를 생성할 때 비용이 많이 들거나 복잡한 과정을 거치는 경우 기존 객체를 복제하여 새로운 객체를 생성하는 방식입니다. 이 패턴은 클론(복제) 메서드를 사용해 객체를 복사합니다.

객체를 복제하는 방식으로 객체를 생성하면 다음과 같은 장점이 있습니다:

  • 객체 생성 비용 절감: 복잡한 초기화 과정을 반복할 필요 없이 기존 객체를 복제해 재사용할 수 있습니다.
  • 유연성: 런타임에 객체의 구체적인 클래스를 몰라도 복제할 수 있습니다.

2. 객체 복사와 클론 메서드

자바에서 객체를 복사할 때 주로 clone() 메서드를 사용합니다. clone() 메서드는 java.lang.Cloneable 인터페이스를 구현한 클래스에서 사용할 수 있습니다.

기본 구조:

  1. 클래스가 Cloneable 인터페이스를 구현해야 합니다.
  2. clone() 메서드를 오버라이드해서 객체의 복제 기능을 정의합니다.

3. 깊은 복사와 얕은 복사의 차이

얕은 복사(Shallow Copy)

  • 객체의 참조값만 복사됩니다.
  • 복제된 객체와 원본 객체가 같은 내부 객체를 참조합니다.

깊은 복사(Deep Copy)

  • 객체의 모든 값을 복제하며 내부 객체도 별도로 복사됩니다.
  • 복제된 객체와 원본 객체는 완전히 독립적인 상태가 됩니다.
구분 얕은 복사 깊은 복사
특징 참조값만 복사 새로운 객체를 복사
결과 원본 객체와 내부 객체 공유 원본 객체와 완전히 분리된 상태

4. 프로토타입 패턴의 클래스 다이어그램

+--------------------+
|   Prototype        |
|--------------------|
| + clone() : Object |
+--------------------+
          ^
          |
+--------------------+
|   ConcretePrototype|
|--------------------|
| + clone() : Object |
+--------------------+
  • Prototype: 복제 메서드를 정의하는 인터페이스 혹은 추상 클래스입니다.
  • ConcretePrototype: Prototype을 구현하며 복제 메서드를 실제로 구현하는 클래스입니다.

5. 예제 코드: 프로토타입 패턴 구현

클래스 구조

// Prototype 인터페이스
interface Prototype extends Cloneable {
    Prototype clone();
}

// ConcretePrototype 구현 클래스
class Book implements Prototype {
    private String title;
    private Author author;

    public Book(String title, String authorName) {
        this.title = title;
        this.author = new Author(authorName);
    }

    @Override
    public Prototype clone() {
        try {
            // 얕은 복사
            Book copy = (Book) super.clone();
            // 깊은 복사: 내부 객체도 복제
            copy.author = new Author(this.author.getName());
            return copy;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    public void setTitle(String title) { this.title = title; }
    public void setAuthorName(String name) { this.author.setName(name); }
    public void showInfo() {
        System.out.println("Title: " + title + ", Author: " + author.getName());
    }
}

class Author {
    private String name;
    public Author(String name) { this.name = name; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

// 사용 예시
public class PrototypePatternExample {
    public static void main(String[] args) {
        // 원본 객체 생성
        Book originalBook = new Book("Design Patterns", "Erich Gamma");
        System.out.println("=== Original Book ===");
        originalBook.showInfo();

        // 복제된 객체
        Book clonedBook = (Book) originalBook.clone();
        clonedBook.setTitle("Prototype Pattern");
        clonedBook.setAuthorName("John Doe");

        System.out.println("\n=== Cloned Book ===");
        clonedBook.showInfo();

        System.out.println("\n=== Original Book (After Cloning) ===");
        originalBook.showInfo();
    }
}

실행 결과

=== Original Book ===
Title: Design Patterns, Author: Erich Gamma

=== Cloned Book ===
Title: Prototype Pattern, Author: John Doe

=== Original Book (After Cloning) ===
Title: Design Patterns, Author: Erich Gamma

6. 프로토타입 패턴의 장단점

장점

  • 객체 생성 비용 절감: 복잡한 초기화 작업 없이 객체를 복제하여 생성합니다.
  • 유연성: 런타임에 객체를 복제하여 다양하게 활용할 수 있습니다.
  • 코드 재사용성: 클론 메서드를 활용하여 객체 생성 로직을 재사용합니다.

단점

  • 깊은 복사 구현의 어려움: 깊은 복사를 구현하려면 객체의 모든 참조를 복사해야 합니다.
  • Cloneable 인터페이스의 사용: 자바의 clone() 메서드와 Cloneable은 다소 사용하기 불편합니다.

7. 결론

프로토타입 패턴은 객체를 복제하여 비용을 절감하고 객체 생성을 유연하게 할 수 있는 강력한 디자인 패턴입니다. 하지만 깊은 복사를 구현할 때 주의가 필요하며 clone() 메서드를 올바르게 구현하는 것이 중요합니다.

반응형