개발
프로토타입 패턴: 객체 ‘복붙’으로 인스턴스 생성 가속하기
스택큐힙리스트
2025. 7. 16. 07:25
반응형
내용
왜 프로토타입(Prototype)인가?
CLI Todo 앱에서 “매주 팀 회의”, “매일 운동”처럼 반복되는 Task를 만들 때마다 new Task()로 필드를 모두 채우면 지루하고 비효율적입니다. 프로토타입 패턴은 이미 준비된 객체를 복사 해서 새 인스턴스를 얻도록 해 주어, 클래스에 직접 의존하지 않고도 빠르게 객체를 만들 수 있게 합니다
언제 빛을 발할까?
- 생성 비용이 큰 객체: DB 쿼리나 네트워크 요청으로 초기화되는 무거운 객체를 여러 번 만들 때
- 템플릿·프리셋이 많은 도메인: 일정, 문서·메일 템플릿처럼 기본값이 대부분 같은 경우
- 런타임에 클래스가 확정되는 플러그인 구조: 클래스 정보를 모를 때도 복제가 가능
Todo 앱 적용 예시 (Java)
public class Task implements Cloneable {
private String title;
private LocalDate due;
private int priority;
private List<String> tags;
// 복사 생성자 이용
public Task(Task source) {
this.title = source.title;
this.due = source.due;
this.priority = source.priority;
this.tags = new ArrayList<>(source.tags); // 깊은 복사!
}
@Override
public Task clone() {
return new Task(this); // copy constructor 호출
}
}
// 템플릿 생성
Task standupTemplate = Task.builder("Daily Stand-up")
.priority(1)
.tags(List.of("meeting"))
.build();
// 오늘 회의 복제
Task todayStandup = standupTemplate.clone();
todayStandup.setDue(LocalDate.now());
위처럼 복사 후 일부 값만 수정하면, 일정 생성이 “한 줄”로 끝납니다.
얕은 복사 vs 깊은 복사
- 얕은 복사: 필드가 참조 타입이면 주소만 복제해 원본·사본이 같은 내부 객체를 가리킵니다. 작은 예제에선 편하지만, 태그 리스트를 수정하면 원본까지 바뀌는 사고가 납니다
- 깊은 복사: 참조 필드도 새로 만들어 완전히 독립시킵니다. 컬렉션은 new ArrayList<>(original)처럼 방어적 복사를 지켜야 합니다
✅ 팁: 불변(immutable) 값 객체를 사용하면 얕은 복사로도 안전해 메모리를 아낄 수 있습니다.
장점 한눈에
- 성능 최적화: 무거운 초기화 과정을 한 번만 실행
- 유연성: 클래스 정보 없이도 clone()만 있으면 복제 가능
- 템플릿화: 반복 업무를 코드 레벨에서 간편 자동화
주의할 점
- Cloneable 인터페이스만 구현하고 깊은 복사를 빼먹으면 버그의 온상이 됩니다.
- 복사 생성자나 정적 copyOf() 메서드로 명시적 복제를 구현하면 가독성과 안정성이 높아집니다.
정리
프로토타입 패턴은 “복사 → 부분 수정”이라는 단순한 아이디어로 생성 비용 절감과 코드 가독성을 동시에 챙깁니다. Todo 앱에 템플릿 Task를 도입해 보고, 매번 입력하던 반복 필드를 ‘복붙’으로 해결해 보세요.
반응형