반응형
1. 프로토타입 패턴이란?
프로토타입 패턴(Prototype Pattern)은 객체를 생성할 때 비용이 많이 들거나 복잡한 과정을 거치는 경우 기존 객체를 복제하여 새로운 객체를 생성하는 방식입니다. 이 패턴은 클론(복제) 메서드를 사용해 객체를 복사합니다.
객체를 복제하는 방식으로 객체를 생성하면 다음과 같은 장점이 있습니다:
- 객체 생성 비용 절감: 복잡한 초기화 과정을 반복할 필요 없이 기존 객체를 복제해 재사용할 수 있습니다.
- 유연성: 런타임에 객체의 구체적인 클래스를 몰라도 복제할 수 있습니다.
2. 객체 복사와 클론 메서드
자바에서 객체를 복사할 때 주로 clone()
메서드를 사용합니다. clone()
메서드는 java.lang.Cloneable
인터페이스를 구현한 클래스에서 사용할 수 있습니다.
기본 구조:
- 클래스가
Cloneable
인터페이스를 구현해야 합니다. 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()
메서드를 올바르게 구현하는 것이 중요합니다.
반응형
'JAVA > JAVA Design Pattern' 카테고리의 다른 글
JAVA 데코레이터(Decorator) 패턴 (0) | 2024.12.25 |
---|---|
JAVA 어댑터(Adapter) 패턴 (0) | 2024.12.24 |
빌더(Builder) 패턴 (0) | 2024.12.22 |
추상 팩토리 (Abstract Factory) 패턴 (0) | 2024.12.21 |
팩토리 메서드(Factory Method) 패턴 (0) | 2024.12.20 |