Search

์ƒํƒœ ํŒจํ„ด

์ƒํƒœ ํŒจํ„ด (State Pattern)

๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๊ฐ์ฒด์˜ ํ–‰๋™์ด ๋ฐ”๋€Œ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐ ์ƒํƒœ๋ฅผ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ์บก์Šํ™”ํ•˜๊ณ , ์ƒํƒœ์— ๋”ฐ๋ฅธ ํ–‰๋™์„ ๊ฐ ์ƒํƒœ ํด๋ž˜์Šค์— ์œ„์ž„ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™ํ•˜๋Š” ๋กœ์ง์„ ๊ฐ๊ฐ์˜ ์ƒํƒœ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ
โ€ข
์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ํ™•์žฅ ๊ฐ€๋Šฅ
โ€ข
์ƒํƒœ ์ „ํ™˜ ๋กœ์ง์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ ๋ณต์žก์„ฑ ๊ฐ์†Œ

ํŠน์ง•

โ€ข
๊ฐ ์ƒํƒœ๋ฅผ ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„
โ€ข
์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๊ฐ€ ํ˜„์žฌ ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
โ€ข
์ƒํƒœ ์ „ํ™˜์ด ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๋ช…ํ™•ํ•จ
โ€ข
์กฐ๊ฑด๋ฌธ(if-else) ์‚ฌ์šฉ์„ ์ค„์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

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

// State ์ธํ„ฐํŽ˜์ด์Šค interface State { void handle(); } // ๊ตฌ์ฒด์ ์ธ ์ƒํƒœ ํด๋ž˜์Šค๋“ค class StateA implements State { public void handle() { System.out.println("์ƒํƒœ A ์ฒ˜๋ฆฌ"); } } class StateB implements State { public void handle() { System.out.println("์ƒํƒœ B ์ฒ˜๋ฆฌ"); } } // ์ปจํ…์ŠคํŠธ ํด๋ž˜์Šค class Context { private State state; public void setState(State state) { this.state = state; } public void request() { state.handle(); } }
Java
๋ณต์‚ฌ

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

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ์ƒํƒœ ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:
โ€ข
State ์ธํ„ฐํŽ˜์ด์Šค: ๋ชจ๋“  ์ƒํƒœ๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. handle() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ณ„ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๊ตฌ์ฒด์ ์ธ ์ƒํƒœ ํด๋ž˜์Šค (StateA, StateB): State ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ ์ƒํƒœ์— ํŠนํ™”๋œ ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํด๋ž˜์Šค๋Š” ํŠน์ • ์ƒํƒœ์—์„œ์˜ ํ–‰๋™์„ ์บก์Šํ™”ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Context ํด๋ž˜์Šค: ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” State ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ํ˜„์žฌ ์ƒํƒœ ๊ฐ์ฒด์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ์ƒํƒœ ํด๋ž˜์Šค๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ๋งŒ์กฑ์‹œํ‚ต๋‹ˆ๋‹ค.

ํ™œ์šฉ ์‚ฌ๋ก€

โ€ข
์žํŒ๊ธฐ์˜ ๋™์ž‘ ์ƒํƒœ ๊ด€๋ฆฌ (๋™์ „ ํˆฌ์ž…, ์ œํ’ˆ ์„ ํƒ, ์ œํ’ˆ ๋ฐฐ์ถœ ๋“ฑ)
โ€ข
๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ ๊ด€๋ฆฌ (๋Œ€๊ธฐ, ๊ฑท๊ธฐ, ๋‹ฌ๋ฆฌ๊ธฐ, ์ ํ”„ ๋“ฑ)
โ€ข
์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ ๊ด€๋ฆฌ (์ฃผ๋ฌธ ์ ‘์ˆ˜, ์ฒ˜๋ฆฌ ์ค‘, ๋ฐฐ์†ก ์ค‘, ์™„๋ฃŒ ๋“ฑ)