일반적으로 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
실행결과

원리 설명
- 작업 수행 시
- 텍스트가 변경되기 전 상태를 undo 스택에 저장합니다.
- 작업을 수행하고 나면 redo 스택은 초기화됩니다.
- Undo
- undo 스택에서 마지막 상태를 꺼내 현재 상태를 복원합니다.
- 복원 전의 상태는 redo 스택에 저장하여, 나중에 다시 적용(redo)할 수 있게 합니다.
- Redo
- redo 스택에서 마지막 상태를 꺼내 현재 상태에 적용합니다.
- 이때, 복원 전의 상태는 다시 undo 스택에 저장됩니다.
이와 같이 두 개의 스택을 이용하여 사용자가 단계별로 변경 사항을 되돌리거나 다시 적용할 수 있습니다.
반응형
'프로그래밍(Programming) > Python' 카테고리의 다른 글
global 키워 (0) | 2025.03.12 |
---|---|
OpneAI API 키를 cmd, terminal 에 설정하기 (0) | 2025.03.10 |
설치 중 실패하는 패키지를 건너뛰고 설치 : `pip` 명령어에 `--no-deps` (0) | 2025.02.25 |
How to resolve "normal site-packages is not writable" in Python (0) | 2023.12.22 |
Python : 내장함수 (0) | 2018.05.16 |