반응형
안녕하세요 취업길잡이 Coy입니다
오늘은 프로토타입패턴에 대해서 알아보도록 하겠습니다
프로토타입 패턴이란?
프로토타입 패턴은 객체 생성을 간소화하고 비용을 줄이기 위해 기존 객체를 복제하여 새로운 객체를 생성하는 디자인 패턴입니다. 이 패턴은 복잡한 객체 생성 과정을 피하고 유사한 객체를 효율적으로 생성할 수 있는 장점이 있습니다.
자바에서는 Cloneable 인터페이스를 구현하고 clone() 메서드를 오버라이드하여 이를 구현합니다. 이 패턴은 객체를 복제함으로써 새로운 객체를 생성하므로, 메모리 사용량이 늘어날 수 있고, 객체 상태를 공유할 경우 부작용이 발생할 수 있습니다. 따라서 복사 방법을 신중히 선택하여 이러한 부작용을 고려해야 합니다.
사용하는 목적
- 객체 복제의 복잡성 해소: 프로토타입 패턴은 객체 복제를 간단화하여 복잡한 복제 프로세스를 처리할 수 있습니다. 이는 객체들 간의 복잡한 상속 구조나 비공개 필드를 포함한 경우에 특히 유용합니다.
- 객체 생성 비용 및 시간 절약: 이미 생성된 프로토타입 객체를 복제하여 새로운 객체를 생성함으로써 객체 생성 비용과 시간을 절약할 수 있습니다.
- 클라이언트 코드의 유연성 확보: 프로토타입 패턴은 클라이언트 코드가 구체적인 객체 구현에 의존하지 않고도 객체를 복제할 수 있도록 합니다. 이는 코드의 유연성을 높여 써드파티 코드와의 상호작용이나 객체 생성 로직 변경에 유리합니다.
- 프로토타입 레지스트리 활용: 프로토타입 패턴을 사용하면 프로토타입 객체들을 레지스트리에 저장하여 언제든지 필요할 때 복제하여 사용할 수 있습니다. 이를 통해 복잡한 설정이나 자주 사용되는 객체를 효율적으로 관리할 수 있습니다.
- 서브클래스 수 줄이기: 객체를 초기화하는 방식만 다를 뿐이라면 서브클래스의 수를 줄이고자 할 때 프로토타입 패턴을 사용할 수 있습니다. 이는 코드의 가독성을 높이고 유지보수를 간편하게 할 수 있습니다.
구조
예제코드
public abstract class Animal implements Cloneable {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
// clone 메서드를 재정의하여 복제 기능을 구현
@Override
public Animal clone() throws CloneNotSupportedException {
return (Animal) super.clone();
}
// 추상 메서드로 동물의 울음 소리를 출력
public abstract void makeSound();
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(getName() + "가 왈왈 짖습니다.");
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(getName() + "가 야옹 소리를 냅니다.");
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
// 원본 동물 객체 생성
Dog originalDog = new Dog("멍멍이");
// 원본을 복제하여 새로운 동물 객체 생성
Dog clonedDog = originalDog.clone();
clonedDog.makeSound(); // 복제된 동물 객체의 울음 소리 출력
// 또 다른 원본 동물 객체 생성
Cat originalCat = new Cat("야옹이");
// 원본을 복제하여 새로운 동물 객체 생성
Cat clonedCat = originalCat.clone();
clonedCat.makeSound(); // 복제된 동물 객체의 울음 소리 출력
}
}
Animal 클래스:
- 복제 기능을 제공하기 위해 Cloneable 인터페이스를 구현하고, 추상 메서드인 clone()을 재정의합니다.
- 추상 메서드인 makeSound()를 선언하여 각 동물의 울음 소리를 출력하는 기능을 구현할 하위 클래스에서 오버라이드할 수 있도록 합니다.
Dog 클래스:
- Animal 클래스를 상속받아 구현되었으며, 개를 나타냅니다.
- makeSound() 메서드를 오버라이드하여 개의 울음 소리를 출력하도록 구현되어 있습니다.
Cat 클래스:
- Animal 클래스를 상속받아 구현되었으며, 고양이를 나타냅니다.
- makeSound() 메서드를 오버라이드하여 고양이의 울음 소리를 출력하도록 구현되어 있습니다.
Main 클래스:
- 프로그램의 시작점으로, 복제된 동물 객체를 생성하고 울음 소리를 출력하는 기능을 담당합니다.
- Dog와 Cat 객체를 각각 생성하고, 각 객체를 복제하여 새로운 동물 객체를 생성하고 이를 이용하여 울음 소리를 출력합니다
장단점
장점
1. 구체 클래스에 직접 연결하지 않고 객체를 복사할 수 있습니다:
이는 코드를 유연하게 만들어줍니다. 클라이언트 코드가 구체적인 클래스에 직접적으로 의존하지 않고도 객체를 복사할 수 있어서, 코드의 변경이나 유지보수에 용이합니다.
2. 중복되는 초기화 코드를 제거할 수 있습니다:
프로토타입이 미리 정의되어 있기 때문에, 이를 복제하여 객체를 생성할 때 중복되는 초기화 코드를 제거할 수 있습니다. 이는 코드의 가독성과 유지보수성을 향상시킵니다.
3. 복잡한 객체를 더 쉽게 생성할 수 있습니다:
복잡한 객체의 생성 과정을 단순화하여 쉽게 생성할 수 있습니다. 이는 객체 생성을 추상화하고 클라이언트에게 쉽게 사용할 수 있는 인터페이스를 제공함으로써 개발 과정을 효율화합니다.
단점
1. 객체를 복제하는 과정이 복잡할 수 있습니다:
특히 순환 참조가 있는 복잡한 객체를 복제하는 것은 까다로울 수 있습니다. 복제 과정에서 재귀적으로 객체를 복사하면서 순환 참조를 처리해야 하기 때문에 이를 처리하는 것이 어려울 수 있습니다.
2. 복잡한 객체를 복제하는 과정이 비용이 들 수 있습니다:
복제 과정은 객체를 새로 생성하는 것보다 비용이 많이 들 수 있습니다. 특히 복제할 객체가 매우 크거나 복잡한 경우, 복제 과정에서 많은 시간과 자원이 소모될 수 있습니다.
3. 객체를 복제하는 과정이 복잡한 경우 디버깅이 어려울 수 있습니다:
복제 과정이 복잡하고 코드가 깊게 중첩된 경우, 이를 디버깅하기 어려울 수 있습니다. 특히 clone() 메서드를 구현하는 과정이 복잡하고 버그를 발견하기 어려울 수 있습니다.
컬럼으로 다루어 주면 좋겠다 싶은 주제가 있으면 댓글로 알려주세요
도움이 필요하시면 사연을 메일로 보내주세요
jek300300@gmail.com
도움이 되셨다면 공감과 구독 부탁드립니다
읽어주셔서 감사합니다
당신의 취업이 성공할 때까지 같이 하겠습니다! by 취업길잡이 Coy
반응형
'[2단계] CS 개념 지식 모음집 > 디자인 패턴' 카테고리의 다른 글
[Design Pattern] 추상 팩토리 패턴(Abstract Factory Pattern) (0) | 2024.03.10 |
---|---|
[Design Pattern] 프록시 패턴(Proxy Pattern) (0) | 2024.02.18 |
[Design Pattern] 어댑터 패턴(Adapter Pattern) (0) | 2024.02.11 |
[Design Pattern] 빌더 패턴(Builder Pattern) (0) | 2024.02.04 |
[Design Pattern] 상태 패턴(State Pattern) (0) | 2024.01.26 |