프로토타입 Prototype
🙊

프로토타입 Prototype

Created
Apr 21, 2024 03:22 AM
Last edited time
Last updated April 21, 2024
Tags
CS
Language
URL

Intro::

디자인패턴 중 생성 패턴이 프로토타입에 대해 알아봅시다.
 

프로토타입이란?

💡
프로토타입(Prototype) 패턴은 객체 지향 프로그래밍에서 많이 사용되는 디자인 패턴 중 하나입니다. 이 패턴의 주요 목적은 객체를 생성하는 비용이 크거나 복잡할 때, 기존 객체를 복사해서 새로운 객체를 만들어내는 방법을 제공하는 것입니다.
 

구성 요소

  1. 프로토타입(Prototype) 인터페이스: 이 인터페이스는 자기 자신의 복사본을 만들 수 있는 clone() 메소드를 정의합니다.
  1. 구체적인 프로토타입(Concrete Prototype): 프로토타입 인터페이스를 구현하고 자신의 복사본을 생성하는 구체적인 클래스입니다.
  1. 클라이언트(Client): 프로토타입 인터페이스를 사용하여 새로운 객체를 생성합니다.
 

장점

  • 초기화 시간 절약: 이미 생성된 객체를 복사하기 때문에 초기화에 드는 시간을 절약할 수 있습니다.
  • 동적 클래스 로딩: 실행 시간에 새로운 클래스를 동적으로 로딩하여 객체를 생성할 수 있습니다.
  • 복잡한 객체의 편리한 생성: 객체의 복잡한 설정이 필요한 경우, 이 설정을 반복하지 않고 기존 설정을 복사해서 사용할 수 있습니다.
 

단점

  • 깊은 복사와 얕은 복사의 복잡성: 객체를 복제할 때 '얕은 복사(shallow copy)'와 '깊은 복사(deep copy)'의 차이를 이해하고 적절히 처리해야 합니다. 얕은 복사는 객체의 참조만을 복사하므로 원본 객체의 참조형 필드가 변경되면 복제된 객체도 영향을 받습니다. 반면, 깊은 복사는 객체에 포함된 모든 필드를 완전히 새로 복사하기 때문에 원본 객체와 완전히 독립적입니다. 깊은 복사를 올바르게 구현하는 것은 복잡하고 오류가 발생하기 쉽습니다.
  • 복제된 객체의 관리: 복제 과정에서 객체의 모든 속성을 정확히 복사해야 합니다. 만약 객체에 외부 자원에 대한 참조나 복잡한 연결이 포함되어 있다면, 이를 적절히 처리하지 못하면 실행 시 예상치 못한 문제가 발생할 수 있습니다.
  • 성능 이슈: 프로토타입 패턴이 객체 생성 시간을 줄여준다고는 하지만, 실제 복제 과정에서 발생하는 오버헤드가 클 경우 성능 저하를 초래할 수 있습니다. 특히, 객체의 크기가 크거나 복사해야 할 데이터가 많은 경우 성능 저하가 더욱 심해질 수 있습니다.
  • 클래스 변경의 어려움: 프로토타입 객체를 사용하는 시스템에서는 클래스를 변경하기가 어려울 수 있습니다. 클래스의 구조가 변경되면 모든 프로토타입의 복제 로직도 함께 변경해야 하기 때문에, 유지보수가 더 복잡해질 수 있습니다.
public class Sheep implements Cloneable { private String name; public Sheep(String name) { this.name = name; } public Sheep clone() { try { return (Sheep) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError(); } } }

References::

Loading Comments...