본문 바로가기

JAVA/디자인 패턴

[Design Pattern] Memento(메멘토) 패턴이란?

반응형
행위 패턴(Behavioral Pattern)


메멘토 패턴(Memento Pattern)은 소프트웨어 디자인 패턴 중 하나로, 객체의 상태를 저장하고 나중에 복원할 수 있는 메커니즘을 제공합니다.

이 패턴은 보통 다음과 같은 상황에서 사용됩니다. 어떤 객체의 상태를 변경하고, 이 변경 내용을 이후에 취소하거나 이전 상태로 복원하려고 할 때, 상태를 저장하고 복원하는 과정을 간편하게 처리할 수 있습니다.

메멘토 패턴은 세 가지 주요 구성 요소로 이루어져 있습니다. 첫째, Originator는 상태를 저장하고 복원하려는 객체입니다. 둘째, Memento(메멘토)는 상태를 저장하는 객체입니다. 셋째, Caretaker는 Memento를 저장하고 관리하는 객체입니다.

이 패턴을 사용하면, Originator 객체의 상태를 Memento에 저장하고, 이후에 복원할 수 있습니다. Memento 객체는 Originator 객체 외부에서 직접적으로 접근할 수 없으며, Caretaker 객체를 통해서만 접근할 수 있습니다. 따라서, 상태를 안전하게 보호하면서도 필요한 경우에만 복원할 수 있습니다.

이 패턴은 복잡한 상태를 가진 객체에서 매우 유용합니다. 예를 들어, 텍스트 편집기에서 사용자가 작성한 문서의 상태를 저장하고 이전 상태로 복원하는 경우, 메멘토 패턴을 사용할 수 있습니다. 또한, 게임에서 플레이어의 게임 상태를 저장하고 이전 상태로 복원하는 경우에도 이 패턴을 사용할 수 있습니다.

 

Memento 패턴 예제

Diagrams


이 예제에서는 텍스트 에디터의 상태를 저장하고 복원하는 기능을 구현할 것입니다.

먼저, Originator 클래스를 만들어보겠습니다. 이 클래스는 상태를 저장하고 복원할 객체입니다.

public class TextEditor {
    private String text;
    
    public TextEditor() {
        this.text = "";
    }
    
    public void write(String text) {
        this.text += text;
    }
    
    public void print() {
        System.out.println(this.text);
    }
    
    public Memento save() {
        return new Memento(this.text);
    }
    
    public void restore(Memento memento) {
        this.text = memento.getState();
    }
}



다음으로, Memento 클래스를 만들어보겠습니다. 이 클래스는 상태를 저장하는 객체입니다.

public class Memento {
    private String state;
    
    public Memento(String state) {
        this.state = state;
    }
    
    public String getState() {
        return this.state;
    }
}



마지막으로, Caretaker 클래스를 만들어보겠습니다. 이 클래스는 Memento를 저장하고 관리하는 객체입니다.

public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();
    
    public void addMemento(Memento memento) {
        this.mementos.add(memento);
    }
    
    public Memento getMemento(int index) {
        return this.mementos.get(index);
    }
}



이제 이를 활용해 텍스트 에디터의 상태를 저장하고 복원하는 예제를 만들어보겠습니다.

public class Main {
    public static void main(String[] args) {
        TextEditor editor = new TextEditor();
        Caretaker caretaker = new Caretaker();

        editor.write("Hello, ");
        caretaker.addMemento(editor.save()); // 현재 상태 저장

        editor.write("world!");
        caretaker.addMemento(editor.save()); // 현재 상태 저장

        editor.write(" Goodbye!");
        editor.print(); // Hello, world! Goodbye!

        editor.restore(caretaker.getMemento(1)); // 이전 상태로 복원
        editor.print(); // Hello, world!
    }
}



이 예제에서는 TextEditor 클래스가 Originator 역할을 하고, Memento 클래스가 Memento 역할을 합니다. 또한, Caretaker 클래스가 Memento를 저장하고 관리하는 역할을 합니다.

이 예제를 실행하면, "Hello, world! Goodbye!" 라는 문자열이 출력되고, 이전 상태로 복원하면 "Hello, world!" 라는 문자열이 출력됩니다. 이를 통해 메멘토 패턴이 어떻게 동작하는지 이해할 수 있습니다.

반응형