일반적으로 Undo/Redo 기능은 두 개의 스택(undo 스택과 redo 스택)을 사용하여 구현됩니다.

  • 작업 기록 (Command Pattern):
    사용자가 편집할 때마다 그 변경 작업(예: 텍스트 삽입, 삭제 등)을 하나의 “명령(커맨드)”으로 기록합니다. 각 명령은 자신을 실행한 결과를 되돌릴 수 있는 방법(undo 연산)과 다시 적용하는 방법(redo 연산)을 알고 있습니다.
  • Undo 스택:
    새로운 작업이 발생하면, 그 작업의 정보를 undo 스택에 저장합니다. 사용자가 Undo를 실행하면, 스택의 맨 위에 있는 작업을 꺼내어 그 작업의 undo 연산을 수행하고, 그 작업을 redo 스택에 저장합니다.
  • Redo 스택:
    사용자가 Undo 후에 Redo를 실행하면, redo 스택의 맨 위에 있는 작업을 꺼내어 다시 적용(redo 연산)하고, 그 작업을 undo 스택으로 되돌립니다.
    단, 새로운 작업이 수행되면 redo 스택은 보통 초기화됩니다.

 

 

이런 방식으로 작업의 이력(history)을 관리하여 사용자가 단계별로 이전 상태로 되돌리거나 다시 적용할 수 있게 됩니다.

 

 

 

class Editor:
    def __init__(self):
        self.text = ""
        self.undo_stack = []
        self.redo_stack = []

    def insert(self, s):
        # 현재 상태를 undo 스택에 저장
        self.undo_stack.append(self.text)
        # 새로운 텍스트 삽입
        self.text += s
        # 새 작업이 발생하면 redo 스택은 초기화
        self.redo_stack.clear()

    def delete_last(self, n):
        # 현재 상태를 undo 스택에 저장
        self.undo_stack.append(self.text)
        # 마지막 n 글자 삭제
        self.text = self.text[:-n]
        self.redo_stack.clear()

    def undo(self):
        if self.undo_stack:
            # 현재 상태를 redo 스택에 저장
            self.redo_stack.append(self.text)
            # undo 스택에서 이전 상태를 꺼내어 복원
            self.text = self.undo_stack.pop()
        else:
            print("Nothing to undo")

    def redo(self):
        if self.redo_stack:
            # 현재 상태를 undo 스택에 저장
            self.undo_stack.append(self.text)
            # redo 스택에서 상태를 꺼내어 다시 적용
            self.text = self.redo_stack.pop()
        else:
            print("Nothing to redo")

# 예시 사용법
editor = Editor()
editor.insert("Hello")
editor.insert(" World")
print("현재 텍스트:", editor.text)   # 출력: Hello World
editor.undo()
print("Undo 후:", editor.text)       # 출력: Hello
editor.redo()
print("Redo 후:", editor.text)       # 출력: Hello World

 

 

실행결과

 

원리 설명

  1. 작업 수행 시
    • 텍스트가 변경되기 전 상태를 undo 스택에 저장합니다.
    • 작업을 수행하고 나면 redo 스택은 초기화됩니다.
  2. Undo
    • undo 스택에서 마지막 상태를 꺼내 현재 상태를 복원합니다.
    • 복원 전의 상태는 redo 스택에 저장하여, 나중에 다시 적용(redo)할 수 있게 합니다.
  3. Redo
    • redo 스택에서 마지막 상태를 꺼내 현재 상태에 적용합니다.
    • 이때, 복원 전의 상태는 다시 undo 스택에 저장됩니다.

이와 같이 두 개의 스택을 이용하여 사용자가 단계별로 변경 사항을 되돌리거나 다시 적용할 수 있습니다.

 

 

 

 

 

반응형

+ Recent posts