[디자인 패턴] - 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
볼빵빵오춘기