minstudio

메멘토 패턴 (Memento)

메멘토 패턴(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 (저장소 객체)
class Memento {
    private 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; }
    public String getState() { return state; }
    
    public Memento saveStateToMemento() {
        return new Memento(state);
    }
    
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// Caretaker (Memento 관리자)
class CareTaker {
    private java.util.List<Memento> mementoList = new java.util.ArrayList<>();
    public void add(Memento state) { mementoList.add(state); }
    public Memento get(int index) { return mementoList.get(index); }
}

public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        
        originator.setState("상태 #1");
        originator.setState("상태 #2");
        careTaker.add(originator.saveStateToMemento()); // 2 저장
        
        originator.setState("상태 #3");
        careTaker.add(originator.saveStateToMemento()); // 3 저장
        
        originator.setState("상태 #4");
        
        System.out.println("현재 상태: " + originator.getState());
        
        originator.getStateFromMemento(careTaker.get(0)); // 2로 복구
        System.out.println("첫번째 복구 상태: " + originator.getState());
    }
}
메멘토 패턴 (Memento) | Minstudio