IT/JAVA

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

밥알이 2025. 5. 30. 23:00

✅ 목적

새로운 객체를 생성할 때, 기존 객체를 복사(clone) 해서 만드는 패턴입니다.

✅ 특징

  • new 키워드를 쓰지 않고 객체를 복사해서 성능 최적화
  • 복잡한 초기화 과정을 피할 수 있음

📌 2. 언제 쓰나요?

  • 객체 생성 비용이 클 때 (예: 복잡한 계산이나 DB 접근이 필요한 초기화)
  • 동일한 구조를 가진 객체를 여러 개 만들고 싶을 때
  • 기존 객체와 거의 비슷한 객체를 빠르게 생성하고 싶을 때

🎯 예시 시나리오

회사에서 여러 유형의 문서(Document) 를 관리하는데,
사용자가 기존 문서를 복사해서 새 문서를 만들고 싶어해요.
이때 복사 기능을 쉽게 만들고 싶습니다.


🧪 3. 자바에서는 어떻게 구현하나요?

자바는 Cloneable 인터페이스와 clone() 메서드를 사용해서
얕은 복사(shallow copy) 또는 깊은 복사(deep copy) 를 구현할 수 있습니다.


 

🔧 4. 실무형 예제 코드

📁 1) 프로토타입 인터페이스

public interface Document extends Cloneable {
    Document clone();  // 복사 메서드
    void print();
}

📁 2) 실제 구현 클래스

public class Report implements Document {
    private String title;
    private String content;

    public Report(String title, String content) {
        this.title = title;
        this.content = content;
    }

    @Override
    public Report clone() {
        // 얕은 복사: 단순 필드 복사
        return new Report(this.title, this.content);
    }

    @Override
    public void print() {
        System.out.println("제목: " + title);
        System.out.println("내용: " + content);
    }

    // setter (복사 후 내용 변경에 사용)
    public void setTitle(String title) {
        this.title = title;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

📁 3) 클라이언트 코드

public class Main {
    public static void main(String[] args) {
        Report original = new Report("2025년 보고서", "매출 증가 분석");

        System.out.println("📄 원본 문서:");
        original.print();

        // 복제
        Report copy = original.clone();
        copy.setTitle("2025년 보고서 - 복사본");
        copy.setContent("매출 감소 분석");

        System.out.println("\n📄 복사한 문서:");
        copy.print();

        System.out.println("\n📄 원본 문서 다시 확인:");
        original.print();  // 원본은 그대로
    }
}

✅ 실행 결과

📄 원본 문서:
제목: 2025년 보고서
내용: 매출 증가 분석

📄 복사한 문서:
제목: 2025년 보고서 - 복사본
내용: 매출 감소 분석

📄 원본 문서 다시 확인:
제목: 2025년 보고서
내용: 매출 증가 분석

🎯 실무에서의 사용 예

  • 게임에서 캐릭터/아이템 템플릿을 복사
  • Excel, Word 같은 앱에서 문서 복제
  • Spring Bean 설정에서의 scope="prototype"

✅ 프로토타입 vs new

구분new 사용프로토타입 패턴
성능 느릴 수 있음 빠름 (복사)
초기화 매번 새로 이미 된 상태 복사
목적 완전 새 객체 비슷한 객체 복사
 

💡 확장 팁

  • 복사가 깊이 있는 구조(내부 리스트 등)를 포함하면 deep copy 가 필요해요.
  • 이 경우 clone() 대신 JSON 직렬화-역직렬화, copy constructor 등을 쓰는 것도 방법입니다.