Justin의 개발 로그
article thumbnail

프로그램 코드를 작성하다보면 기존에 만들어진 인스턴스의 내용을 일부 수정하여 사용하고 싶을 때가 있다. 그런 경우 객체를 새로 생성할 때는 사용하는 new Object() 메서드보다 [그림 5-31]처럼 clone() 메서드를 이용해 기존의 것을 복사하여 일부만 바꿔 인스턴스를 생성할 수 있다. 이런 개념을 확장하여 처음부터 일반적인 prototype(원형)을 만들어놓고, 그것을 복사한 후 필요한 부분만 수정하면 new Object() 메서드로 객체를 생성하는 것보다 편리하다.

 

prototype 패턴은 이처럼 인스턴스를 복제하여 사용하는 구조이다. 따라서 생성할 객체의 원형을 제공하는 프로토타입 인스턴스로부터 생성할 객체들의 타입이 결정되도록 한다. 이 패턴은 객체를 생성할 때 갖추어야 할 기본 형태가 있을 때 사용된다.

 

// 프로토타입을 사용하기 위해서는 Cloneable 인터페이스를 상속받아야 한다.
class Node implements Cloneable {
  // 맴버 변수
  private int data;
  
  // 생성자
  public Node(int data) {
    // 맴버 변수에 값 설정
    this.data = data;
  }
  
  public void setData(int data) { 
    this.data = data;
  }
  
  // 출력 함수
  public void print() {
    // 콘솔 출력
    System.out.println("data = " + data);
  }
  
  // 프로토타입(prototype)의 메모리 복사
  public Node clone() {
    try {
      // 메모리 복사한다.
      return (Node) super.clone();
    } catch (CloneNotSupportedException e) {
      // Cloneable 인터페이스를 상속 받지 않으면 에러가 발생한다.
      return null;
    }
  }
}
 
public class Program {
  // 실행 함수
  public static void main(String[] args) {
    // 인스턴스 생성
    var node = new Node(1);
    // 인스턴스 복사
    var nodeClone = node.clone();
    nodeClone.setData(2);
    
    // 출력 함수 호출
    node.print();
    nodeClone.print();
    // 메모리 주소 출력
    System.out.println(node.hashCode());
    System.out.println(nodeClone.hashCode());
  }
}


/*
>>
data = 1
data = 2
16612341
78912444

*/
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!