반응형

 

 

안녕하세요 취업길잡이 Coy입니다

오늘은 프로토타입패턴에 대해서 알아보도록 하겠습니다

프로토타입 패턴이란?

프로토타입 패턴은 객체 생성을 간소화하고 비용을 줄이기 위해 기존 객체를 복제하여 새로운 객체를 생성하는 디자인 패턴입니다. 이 패턴은 복잡한 객체 생성 과정을 피하고 유사한 객체를 효율적으로 생성할 수 있는 장점이 있습니다.

자바에서는 Cloneable 인터페이스를 구현하고 clone() 메서드를 오버라이드하여 이를 구현합니다. 이 패턴은 객체를 복제함으로써 새로운 객체를 생성하므로, 메모리 사용량이 늘어날 수 있고, 객체 상태를 공유할 경우 부작용이 발생할 수 있습니다. 따라서 복사 방법을 신중히 선택하여 이러한 부작용을 고려해야 합니다.

 

사용하는 목적

  1. 객체 복제의 복잡성 해소: 프로토타입 패턴은 객체 복제를 간단화하여 복잡한 복제 프로세스를 처리할 수 있습니다. 이는 객체들 간의 복잡한 상속 구조나 비공개 필드를 포함한 경우에 특히 유용합니다.
  2. 객체 생성 비용 및 시간 절약: 이미 생성된 프로토타입 객체를 복제하여 새로운 객체를 생성함으로써 객체 생성 비용과 시간을 절약할 수 있습니다.
  3. 클라이언트 코드의 유연성 확보: 프로토타입 패턴은 클라이언트 코드가 구체적인 객체 구현에 의존하지 않고도 객체를 복제할 수 있도록 합니다. 이는 코드의 유연성을 높여 써드파티 코드와의 상호작용이나 객체 생성 로직 변경에 유리합니다.
  4. 프로토타입 레지스트리 활용: 프로토타입 패턴을 사용하면 프로토타입 객체들을 레지스트리에 저장하여 언제든지 필요할 때 복제하여 사용할 수 있습니다. 이를 통해 복잡한 설정이나 자주 사용되는 객체를 효율적으로 관리할 수 있습니다.
  5. 서브클래스 수 줄이기: 객체를 초기화하는 방식만 다를 뿐이라면 서브클래스의 수를 줄이고자 할 때 프로토타입 패턴을 사용할 수 있습니다. 이는 코드의 가독성을 높이고 유지보수를 간편하게 할 수 있습니다.

 

구조

 

 

 

 

예제코드

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

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기