디자인 패턴은 소프트웨어 개발에서 반복적으로 나타나는 문제들을 효과적으로 해결할 수 있는 해법입니다. 오늘은 그 중에서 객체의 상태를 저장하고 이전 상태로 복원할 수 있는 Memento 패턴에 대해 알아보겠습니다.
Memento 패턴은 객체의 상태 정보를 저장하고 필요할 때 해당 상태로 복원할 수 있게 하는 디자인 패턴입니다.
객체의 상태를 임시 저장하고 나중에 그 상태로 되돌리는 기능이 필요할 때 사용됩니다.
현재 상태를 저장하고 복원할 수 있는 객체
Originator 객체의 상태를 저장하는 객체
Memento 객체를 저장하고 복원하는 객체
Originator는 자신의 상태를 Memento 객체에 저장합니다. Caretaker는 이 Memento 객체를 보관하게 됩니다. 필요할 때 Caretaker는 Memento 객체를 통해 Originator의 상태를 복원할 수 있습니다.
텍스트 에디터의 '뒤로 가기' 기능: 작성 중인 텍스트의 이전 상태로 되돌리기
게임 내의 '저장 및 불러오기' 기능: 게임의 특정 시점에서의 상태를 저장하고 나중에 불러오기
// Memento 클래스
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
// Originator 클래스
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
// Caretaker 클래스
public class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
// 메인 클래스
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("상태 #1");
caretaker.setMemento(originator.saveStateToMemento());
originator.setState("상태 #2");
System.out.println("현재 상태: " + originator.getState());
originator.getStateFromMemento(caretaker.getMemento());
System.out.println("복원된 상태: " + originator.getState());
}
}
위의 Java 예제에서 Originator는 상태를 가지며, 이 상태를 Memento에 저장하거나 복원할 수 있습니다. Caretaker는 Memento 객체를 보관하며 필요할 때 Originator에게 제공합니다.
실행 결과는 다음과 같습니다:
현재 상태: 상태 #2
복원된 상태: 상태 #1
이처럼 Memento 패턴을 통해 객체의 상태를 저장하고, 필요할 때 이 상태를 복원할 수 있습니다.
객체의 상태를 쉽게 복원할 수 있습니다.
객체의 내부 상태에 직접 접근하지 않고도 상태를 저장 및 복원할 수 있습니다.
메모리 사용량이 증가할 수 있습니다.
복잡한 객체 상태를 저장하게 되면 성능 문제가 발생할 수 있습니다.