개요
앞선 패턴들은 인터페이스와 관련된 패턴들이었다. 이제는 객체 구축과 관련된 여러가지 패턴을 알아보자. 객체 구축과 관련된 패턴으로는 메멘토 패턴, 프로토타입 패턴, 빌더 패턴 등 여러 패턴이 있는데, 이번 포스팅에서는 복사하여 인스턴스를 만드는 프로토타입 패턴에 대해서 알아보자.
프로토타입 패턴
Java 언어에서는 new를 이용해 인스턴스를 만들고, 이 경우에 다음과 같이 클래스 이름을 반드시 지정해야만 한다. new Somethine(). 하지만 클래스 이름을 지정하지 않고 인스턴스를 생성해야 하는 경우도 존재한다.
1) 취급 오브젝트가 너무 많아 클래스로 정리할 수 없는 경우
2) 클래스로부터 인스턴스 생성이 어려운 경우
3) 프레임워크와 생성하는 인스턴스를 분리하고 싶은 경우
1)의 경우는 직관적으로 어느 상태인지 알 수 있다. 하나하나 다른 클래스로 만들면 소스 파일을 너무 많이 작성해야 하는 경우이다.
2)의 경우는 생성하려는 인스턴스가 복잡한 과정을 거쳐 만들어지는 것으로, 클래스로부터 만들기 어려운 경우이다.
3)은 인스턴스를 생성하는 프레임워크를 특정 클래스에 의존하지 않게 하려는 경우이다. 이때는 미리 원형이 될 인스턴스를 등록하고, 등록된 인스턴스를 복사하여 인스턴스를 생성하는 방식이다.
위와 같은 경우 new를 이용하지 않고 기존 인스턴스를 복사하는 방법으로 인스턴스를 생성할 수 있는데, 이때 프로토타입 패턴을 이용할 수 있다. 먼저 프로토타입 패턴의 구성 요소부터 알아보자.
Prototype (원형)
인스턴스를 복사해 새로운 인스턴스를 만들기 위한 메소드를 결정
ConcretePrototype (구체적인 원형)
인스턴스를 복사해 새로운 인스턴스를 만드는 메소드를 상세히 구현
Client (이용자)
인스턴스를 복사하여 새로운 인스턴스를 만드는 메소드를 이용해 새로운 인스턴스를 만듦
구성 요소만 본다면 이게 뭔지.. 잘 감이 잡히지 않을 것이니 아래 예시 코드를 통해 더 자세히 알아보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
// 프로토타입 인터페이스 (Java에서는 Cloneable 사용)
class Monster implements Cloneable {
private String type;
private int hp;
private int attack;
public Monster(String type, int hp, int attack) {
this.type = type;
this.hp = hp;
this.attack = attack;
}
public void setHp(int hp) {
this.hp = hp;
}
public void display() {
System.out.println("[" + type + "] HP: " + hp + ", Attack: " + attack);
}
// clone 메서드 오버라이딩
@Override
public Monster clone() {
try {
return (Monster) super.clone(); // 얕은 복사
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // 절대 발생하지 않음
}
}
}
public class Main {
public static void main(String[] args) {
Monster goblin = new Monster("Goblin", 100, 15);
Monster goblinClone = goblin.clone(); // 복제
goblinClone.setHp(80); // 복제본 수정
System.out.print("원본: ");
goblin.display();
System.out.print("복제본: ");
goblinClone.display();
}
}
|
cs |
위 코드는 Monster 인스턴스를 복사하여 사용할 수 있도록 프로토타입 패턴이 적용된 코드이다. 원형이 될 인스턴스는 Monster 클래스이며, 구체적인 원형 역시 Monster 클래스이다. Main은 클라이언트로 Monster 클래스를 clone 메서드를 이용해 복사하여 인스턴스를 new를 사용하지 않고 생성하고 있다.
유의사항
clone은 얕은 복사를 수행한다. 즉, 필드가 가리키는 인스턴스의 내용까지는 고려하지 않는데, 필드에 배열이 있으면 clone을 통해 복사한 경우 배열 요소가 복사되지는 않는다는 점이다. clone은 생성자를 호출하는 것이 아닌 복사만 한다는 점에 유의해야 하며, 인스턴스 생성 시 초기화가 필요한 클래스에서는 clone 메서드 내에서 별도 처리가 필요하므로, 자세한 내용은 Java의 Cloneable 인터페이스를 참고하여 알아보자..
'CS > 객체지향설계 & 패턴' 카테고리의 다른 글
[객체지향설계 & 패턴] 템플릿 메소드 패턴 (1) | 2025.05.21 |
---|---|
[객체지향설계 & 패턴] 메멘토 패턴 (0) | 2025.05.10 |
[객체지향설계 & 패턴] 브리지 패턴 (0) | 2025.04.06 |
[객체지향설계 & 패턴] 퍼사드 패턴 (1) | 2025.04.06 |
[객체지향설계 & 패턴] 어댑터 패턴 (0) | 2025.04.06 |