프로그램 코드를 작성하다보면 기존에 만들어진 인스턴스의 내용을 일부 수정하여 사용하고 싶을 때가 있다. 그런 경우 객체를 새로 생성할 때는 사용하는 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
*/
'프로그래밍 > OOP_Pattern_TDD' 카테고리의 다른 글
TDD 맛보기 - 일단 실습을 통해 TDD를 경험해 본다. (0) | 2022.08.03 |
---|---|
IntelliJ에서 TDD 개발 환경 준비 (0) | 2022.08.03 |
디자인패턴 메멘토 패턴(memento pattern) (0) | 2022.08.02 |
디자인패턴 중재자 패턴 (Mediator Pattern) (0) | 2022.08.01 |
디자인패터 플라이웨이트 패턴 (Flyweight pattern) (0) | 2022.08.01 |