메멘토 패턴(Memento Pattern) 은 객체의 캡슐화를 파괴하지 않고 객체의 내부 상태를 추출하여 저장(Snapshot)해 두었다가, 나중에 객체를 그 상태로 복구(Restore)할 수 있게 해주는 행위 패턴입니다.
우리가 에디터에서 자주 쓰는 Ctrl+Z (실행 취소) 가 정확히 메멘토 패턴입니다. 게임의 '세이브/로드' 시스템도 마찬가지입니다. 상태를 저장하는 객체(Originator)가 자신의 상태를 담은 암호 상자(Memento)를 만들어 관리인(Caretaker)에게 맡겨두고, 필요할 때 상자를 돌려받아 과거로 회귀합니다.
⏱️ Memento: 과거로 돌아가는 타임머신 (Ctrl+Z)
Originator (게임 캐릭)
Level = 50, HP = 10%
save(): Memento 반환
restore(m): 복구
스냅샷 생성
Memento
Level 50, HP 10%
보관 위임
Caretaker (관리자)
Stack<Memento>
최근 세이브 파일
보스전 사망 시 복구 요청 (Ctrl+Z)
📐 Memento Pattern UML
Originator
- state
+ save(): Memento, + restore()
Memento
- state
+ getState()
Caretaker
- history: List<Memento>
creates
stores
메멘토 패턴은 객체의 캡슐화를 파괴하지 않고 객체의 내부 상태를 저장하고 복원할 수 있게 합니다.
JavaScript TypeScript Java C# Kotlin Python
Copyclass Memento {
constructor(state) { this.state = state; }
getState() { return this.state; }
}
class Originator {
setState(state) { this.state = state; }
getState() { return this.state; }
save() { return new Memento(this.state); }
restore(memento) { this.state = memento.getState(); }
}
class Caretaker {
constructor() { this.mementos = []; }
add(memento) { this.mementos.push(memento); }
get(index) { return this.mementos[index]; }
}
const originator = new Originator();
const caretaker = new Caretaker();
originator.setState("상태 1");
originator.setState("상태 2");
caretaker.add(originator.save());
originator.setState("상태 3");
caretaker.add(originator.save());
originator.setState("상태 4");
console.log("현재 상태:", originator.getState());
originator.restore(caretaker.get(0));
console.log("복원된 상태 (1번째 저장점):", originator.getState());