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 등을 쓰는 것도 방법입니다.