Ian's Archive 🏃🏻

Profile

Ian

Ian's Archive

Developer / React, SpringBoot ...

📍 Korea
Github Profile →
Categories
All PostsAlgorithm19Book1C1CI/CD2Cloud3DB1DesignPattern9ELK4Engineering1Front3Gatsby2Git2IDE1JAVA7JPA5Java1Linux8Nginx1PHP2Python1React9Security4SpatialData1Spring26
thumbnail

프로토타입 패턴 정리

DesignPattern
2025.10.31.

1. 프로토 타입 패턴

  • 기존 인스턴스를 복제하여 새로운 인스턴스를 만드는 패턴
  • 기존의 객체를 응용해 새로운 객체를 만들 때 유용
    • 기존 객체를 생성할 때 오래 걸리면 유용
    • ex) DB데이터 조회 및 네트워크 요청 후 HTTP통신을 거친 데이터를 이용해 객체를 생성해야 할 때 큰 리소스를 사용하기 때문
  • prototype인터페이스가 가지는 clone() 메소드를 이용해 객체를 복제해서 사용한다는 개념
  • Java의 경우 Object.class에 clone() 메소드가 구현되어 있다.

2. 프로토 타입 패턴 특징

  • 객체를 새롭게 생성하는데 큰 리소스가 드는 객체의 값을 모두 복제해 새로운 인스턴스를 만든는 것
  • 값을 복제하기에 2가지 특징을 만족해야 한다.
    • 다른 인스턴스가 새로 만들어지기 때문에 clone 한 객체는 기존 객체와 다른 객체여야 한다.
    • 값을 모두 동일하게 복제하기 때문에 equals() 는 true 여야 한다.

3. 프로토타입 패턴 구현하기

  • Objects.class clone( ) 
    • 기본적으로 자바가 제공하는 clone() 메소드를 이용해서 프로토타입 패턴을 구현
    • Object.class에서 제공하는 clone() protected 접근제어자로 정의가 되어있기 때문에 clone( ) 을 사용하고자하는 객체에서 재정의해서 사용해야 한다.
  • 먼저 clone() 을 사용할 객체에 Cloneable 인터페이스를 상속받아 clone 메소드를 구현해야 한다.
  • clone() 은 Object class 의 주석에도 나와있다 싶이 CloneNotSuppretedException 을 체크해야 한다.
복사
@Setter
@Getter
@EqualsAndHashCode
public class GithubIssue implements Cloneable {

    private int id;
    private String title;

    @Override
    public GithubIssue clone() {
        try {
            GithubIssue clone = (GithubIssue) super.clone();
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

Object.class를 반환해야할 clone() 메소드가 하위 클래스를 반환하는 공변 상태

-> 모든 객체는 Object.class 는 명시적으로 상속받고 있지않아도, 상속을 받음

추가로 clone()은 얕은 복사라 깊은 복사(deep copy)를 하고 싶다면, 자바에서 제공하는 clone( ) 메소드를 그대로 사용하지않고 새로 정의

4. 프로토타입 패턴 장점 및 단점

  • 장점
    • 복잡한 객체를 만드는 과정을 숨길 수 있다.
    • 기존 객체를 복제하는 과정이 새 인스턴스를 만드는 것보다 비용(시간 또는 메모리)적인 면에서 효율적일 수 있다.
    • 추상적인 타입을 리턴할 수 있다. (clone메소드를 커스텀하게 정의 가능해서)
  • 단점
    • 복제한 객체를 만드는 과정 자체가 복잡할 수 있다. (특히, 순환 참조가 있는 경우)

5. 실무에서 찾아보는 프로토타입 패턴

  • 자바 Object 클래스의 clone 메소드와 Cloneable 인터페이스
  • ModelMapper 라이브러리

Reference

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선

Previous Post
빌더 패턴 정리
Next Post
어댑터 패턴 정리
Thank You for Visiting My Blog, I hope you have an amazing day 😆
© 2023 Ian, Powered By Gatsby.