Hello

[디자인 패턴] - Memento

by 볼빵빵오춘기

Memento

객체의 이전 상태를 저장해 두었다가, 필요할 때 그 상태로 복원(rollback) 할 수 있도록 해주는 디자인 패턴이다.

 

예시 코드

// 상태를 저장할 Memento 클래스
class Memento {
private final String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
// 상태를 가지고 있는 Originator 클래스
class Originator {
private String state;
public void setState(String state) {
this.state = state;
System.out.println("현재 상태: " + state);
}
public Memento saveToMemento() {
return new Memento(state);
}
public void restoreFromMemento(Memento memento) {
this.state = memento.getState();
System.out.println("상태 복원됨: " + state);
}
}
// Memento를 관리하는 Caretaker 클래스
class Caretaker {
private List<Memento> history = new ArrayList<>();
public void save(Memento memento) {
history.add(memento);
}
public Memento undo() {
if (history.size() == 0) return null;
Memento m = history.remove(history.size() - 1);
return m;
}
}
// 사용 예시
public class MementoExample {
public static void main(String[] args) {
Originator editor = new Originator();
Caretaker history = new Caretaker();
editor.setState("초안");
history.save(editor.saveToMemento());
editor.setState("중간 저장");
history.save(editor.saveToMemento());
editor.setState("최종본");
// Undo
editor.restoreFromMemento(history.undo()); // 중간 저장
editor.restoreFromMemento(history.undo()); // 초안
}
}

 

Memento 패턴의 장점

Undo/Redo 기능 구현 가능

상태를 저장해뒀다가 언제든 복원할 수 있다.

 

캡슐화 유지

내부 상태를 Memento 객체에 저장하되 외부에 노출을 안한다.

 

복잡한 상태 저장 가능

여러 속성을 가진 객체의 상태를 통째로 저장할 수 있다.

 

Memento 패턴의 단점 

메모리 사용 증가

저장하는 상태가 많거나 클 경우, Memento가 쌓여 메모리 낭비 우려가 있다.

 

객체가 많아짐

Originator, Memento, Caretaker 객체들이 늘어나 구조가 복잡해질 수 있다.

 

불변성 유지 어려움

Memento의 상태가 변경되면 캡슐화 원칙이 깨질 수 있다.

 

Memento 패턴은언제 사용하나?

Undo / Redo 기능 구현 시

텍스트 에디터, 이미지 편집기 등

 

게임 저장 기능 구현 시

게임의 진행 상태를 저장하고 복원할 수 있게 할 때

 

복잡한 객체 상태 저장 필요 시

트랜잭션 처리, 워크플로우 엔진 등에서 복구 기능 구현

 

정리하자면  

객체의 상태를 저장하고 복원할 수 있도록 하여, 되돌리기/롤백 기능을 구현할 때 사용한다.

블로그의 프로필 사진

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기