Search

๋ฉ”๋ฉ˜ํ†  ํŒจํ„ด

๋ฉ”๋ฉ˜ํ†  ํŒจํ„ด (Memento Pattern)

๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์บก์Šํ™”ํ•˜์—ฌ ์ €์žฅํ•˜๊ณ , ๋‚˜์ค‘์— ํ•ด๋‹น ์ƒํƒœ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ–‰์œ„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ์ด์ „ ์ƒํƒœ๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋ณต๊ตฌํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ(์‹คํ–‰ ์ทจ์†Œ, ๋ณต๊ตฌ, ๋กค๋ฐฑ ๋“ฑ)์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
๊ฐ์ฒด์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต
โ€ข
์บก์Šํ™”๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ฐ์ฒด ์ƒํƒœ ์ €์žฅ
โ€ข
์‹คํ–‰ ์ทจ์†Œ(Undo) ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ํ™œ์šฉ

ํŠน์ง•

โ€ข
๊ตฌ์„ฑ์š”์†Œ
โ—ฆ
Originator: ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•  ๊ฐ์ฒด
โ—ฆ
Memento: ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด
โ—ฆ
Caretaker: Memento๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด

์˜ˆ์‹œ ์ฝ”๋“œ

// Memento ํด๋ž˜์Šค class EditorMemento { private final String content; public EditorMemento(String content) { this.content = content; } public String getContent() { return content; } } // Originator ํด๋ž˜์Šค class Editor { private String content; public void setContent(String content) { this.content = content; } public EditorMemento save() { return new EditorMemento(content); } public void restore(EditorMemento memento) { content = memento.getContent(); } } // Caretaker ํด๋ž˜์Šค class History { private List<EditorMemento> states = new ArrayList<>(); public void push(EditorMemento state) { states.add(state); } public EditorMemento pop() { return states.remove(states.size() - 1); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ํ…์ŠคํŠธ ์—๋””ํ„ฐ์˜ ์‹คํ–‰ ์ทจ์†Œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ํด๋ž˜์Šค์˜ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1. EditorMemento ํด๋ž˜์Šค (Memento)

โ€ข
์—๋””ํ„ฐ์˜ ์ƒํƒœ(content)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ถˆ๋ณ€ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
โ€ข
์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , getter๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Editor ํด๋ž˜์Šค (Originator)

โ€ข
์‹ค์ œ ์—๋””ํ„ฐ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
โ€ข
ํ˜„์žฌ ์ƒํƒœ๋ฅผ Memento ๊ฐ์ฒด๋กœ ์ €์žฅ(save)ํ•˜๊ฑฐ๋‚˜ ๋ณต์›(restore)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. History ํด๋ž˜์Šค (Caretaker)

โ€ข
Memento ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
โ€ข
List๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋“ค์„ ์ €์žฅํ•˜๊ณ , push์™€ pop ๋ฉ”์„œ๋“œ๋กœ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์—๋””ํ„ฐ์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋…ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹คํ–‰ ์ทจ์†Œ ๊ธฐ๋Šฅ์„ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ํŒจํ„ด vs ๋ฉ”๋ฉ˜ํ†  ํŒจํ„ด

ํŠน์„ฑ
์ƒํƒœ ํŒจํ„ด (State Pattern)
๋ฉ”๋ฉ˜ํ†  ํŒจํ„ด (Memento Pattern)
๋ชฉ์ 
๊ฐ์ฒด๊ฐ€ ์ƒํƒœ์— ๋”ฐ๋ผ ํ–‰๋™์„ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ
๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ๊ฒƒ
๊ตฌ์„ฑ ์š”์†Œ
Context, State, ConcreteState
Memento, Originator, Caretaker
์ƒํƒœ ๊ด€๋ฆฌ
๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ–‰๋™์ด ๋‹ฌ๋ผ์ง
์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— ๋ณต์› ๊ฐ€๋Šฅ
์ƒํƒœ ๋ณ€ํ™˜
์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ๋™์ž‘์ด ๋ณ€ํ•จ
์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ 
์‚ฌ์šฉ ์˜ˆ์‹œ
๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ(๊ณต๊ฒฉ, ๋ฐฉ์–ด, ํœด์‹ ๋“ฑ)
๋ฌธ์„œ ํŽธ์ง‘๊ธฐ์—์„œ ์ž‘์—…์˜ Undo/Redo, ๊ฒŒ์ž„ ์ €์žฅ/๋ณต์› ๋“ฑ

๊ฒฐ๋ก 

โ€ข
์ƒํƒœ ํŒจํ„ด์€ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋™์ž‘ ๋ณ€ํ™”์— ์ดˆ์ ์„ ๋งž์ถ”๋ฉฐ, ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ๋•Œ ๊ทธ์— ๋งž๋Š” ๋™์ž‘์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋ฉ”๋ฉ˜ํ†  ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”๋ฉฐ, ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.