반응형
1. 프로토타입 패턴 (Prototype Pattern)
1. 정의
프로토타입 패턴은 기존 객체를 복제(clone)하여 새로운 객체를 생성하는 방식의 디자인 패턴입니다. 이 패턴은 새 객체를 생성하는 대신, 미리 정의된 객체의 복사본을 사용하여 새로운 객체를 얻는 것이 핵심입니다. 이를 통해 객체를 생성하는 데 드는 비용을 절감하고, 복잡한 객체 생성 과정을 단순화할 수 있습니다.
2. 목적
- 객체를 새로 생성하는 비용이 클 경우, 프로토타입을 사용해 빠르고 효율적으로 객체를 생성할 수 있습니다.
- 객체의 복사본을 생성할 때, 새로운 객체와 원본 객체가 동일한 상태를 유지하도록 하고 싶을 때 유용합니다.
- 복제된 객체는 기존 객체의 상태를 공유하거나 초기화하지 않고 별도의 객체로 사용될 수 있습니다.
3. 사용 예시
복제(clone) 기능이 필요한 이유는 다음과 같은 경우에서 유용할 수 있습니다:
- 성능 최적화: 복잡한 객체를 직접 생성하는 비용을 줄이기 위해 복제본을 사용합니다.
- 상황에 따른 객체 변형: 기존 객체에서 일부 속성만 다른 객체를 생성할 때 유용합니다.
- 상태가 동일한 여러 객체가 필요한 경우: 객체의 상태가 동일하지만, 새로운 객체를 생성할 때의 복잡성을 피하려고 할 때 사용합니다.
4. 구현 방법
자바에서 프로토타입 패턴은 보통 Cloneable
인터페이스를 구현하고, clone()
메서드를 재정의하여 구현됩니다. 기본적으로 자바의 Object
클래스는 clone()
메서드를 제공합니다. 이를 통해 객체의 얕은 복사(Shallow Copy)가 가능합니다.
// 프로토타입 패턴을 구현한 예시
class Prototype implements Cloneable {
private String name;
private int age;
public Prototype(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void showInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
// Cloneable 인터페이스를 구현하여 복제 메서드 제공
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 얕은 복사(Shallow Copy) 구현
}
}
public class PrototypePatternDemo {
public static void main(String[] args) {
try {
// 원본 객체 생성
Prototype original = new Prototype("John", 25);
original.showInfo();
// 원본 객체 복제
Prototype clone = (Prototype) original.clone();
clone.showInfo();
// 복제 객체의 상태 변경
clone.setName("Doe");
clone.setAge(30);
clone.showInfo(); // 복제된 객체의 변경 사항 확인
// 원본 객체의 상태는 그대로 유지됨
original.showInfo();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
5. 장점
- 복잡한 객체 생성 비용 절감: 복잡한 초기화 과정을 거치지 않고, 기존 객체를 복제하여 효율적으로 객체를 생성할 수 있습니다.
- 객체의 구조 및 속성 유지: 복제된 객체는 원본 객체의 구조와 속성을 그대로 유지하며, 필요한 경우 일부 속성만 변경할 수 있습니다.
6. 단점
- 깊은 복사 문제: 기본적으로
clone()
메서드는 얕은 복사를 수행하므로, 객체의 내부에 참조하는 다른 객체가 있을 경우 원본과 복제본이 동일한 참조를 가리킬 수 있어 문제가 발생할 수 있습니다. 이를 해결하기 위해서는 깊은 복사(Deep Copy)를 구현해야 합니다. - 복제 가능한 객체의 제한: 복제 가능한 객체는
Cloneable
인터페이스를 구현해야 하며, 이는 모든 객체에 적용할 수는 없습니다.
7. 깊은 복사(Deep Copy)
깊은 복사는 객체의 필드뿐만 아니라 그 필드가 참조하는 객체들도 모두 복사하는 방식입니다. 자바에서는 깊은 복사를 수동으로 구현하거나 Serializable
인터페이스를 활용할 수 있습니다.
프로토타입 패턴은 복잡한 객체의 생성 비용을 줄이고, 동일한 구조의 객체를 반복해서 사용해야 할 때 매우 유용합니다.
반응형
'언어 > Java' 카테고리의 다른 글
[ Java ] Decoration Pattern - 데코레이션 패턴 알아보기 (0) | 2024.10.03 |
---|---|
[ Java ] Builder Pattern - 빌더 패턴 알아보기 (1) | 2024.10.03 |
[ Java ] coding pattern - 자바 대표 코딩 패턴 알아보기 (1) | 2024.10.03 |
[ Java ] Adapter Pattern 어댑터 패턴이란? (0) | 2024.10.03 |
[ Java ] Factory Pattern 팩토리 패턴이란? (0) | 2024.10.02 |