# Strategy Pattern

Assembled by GimunLee

# Goal

  • Strategy Pattern์˜ ๊ฐœ๋…์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • Strategy Pattern์˜ ์‚ฌ์šฉ ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Strategy Pattern์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# What is Strategy Pattern?

์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด(Strategy Pattern)์—์„œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ตฐ์„ ์ •์˜ํ•˜๊ณ  ๊ฐ๊ฐ์„ ์บก์Šํ™” ํ•˜์—ฌ ๊ตํ™˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด(Strategy Pattern)์„ ํ™œ์šฉํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์™€๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์ฃผ์–ด์ง„ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ Strategy Pattern์˜ ์‚ฌ์šฉ ์ด์ ๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


# ์š”๊ตฌ์‚ฌํ•ญ

๊ณ ๊ฐ A๊ฐ€ ์˜ค๋ฆฌ ์—ฐ๋ชป ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๊ณ  ์š”๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๊ฐ A : 'SimpleUDuck'์ด๋ผ๋Š” ์˜ค๋ฆฌ ์—ฐ๋ชป ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ์ด ๊ฒŒ์ž„์—์„œ๋Š” ํ—ค์—„๋„ ์น˜๊ณ  ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ์†Œ๋ฆฌ๋„ ๋‚ด๋Š” ๋งค์šฐ ๋‹ค์–‘ํ•œ ์˜ค๋ฆฌ ์ข…๋ฅ˜๋ฅผ ๋ณด์—ฌ์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด๋ผ๋ฉด 'SimpleUDuck' ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์‹ค ๊ฒƒ ๊ฐ™๋‚˜์š”?


# ํ‘œ์ค€์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ๋ฒ• ์‚ฌ์šฉํ•˜๊ธฐ

์ด ์˜๋ขฐ๋ฅผ ๋งก์€ ๊ฐœ๋ฐœ์ž๋ฅผ ์กฐ(Joe)๋ผ๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์กฐ๋Š” ํ‘œ์ค€์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ Duck์ด๋ผ๋Š” ์ˆ˜ํผํด๋ž˜์Šค๋ฅผ ๋งŒ๋“  ๋‹ค์Œ, ๊ทธ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์˜ค๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ๋ณด๊ธฐ์— ์–ด๋–ค๊ฐ€์š”? ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์ด์‹œ๋‚˜์š”? ์ด๋•Œ, ๊ณ ๊ฐ A๋Š” ์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๊ฐ A : ์˜ค๋ฆฌ๊ฐ€ ํ—ค์—„๋งŒ ์น˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋‚ ์•„๋‹ค๋…”์œผ๋ฉด ์ข‹๊ฒ ์–ด์š”!

๊ฐœ๋ฐœ์ž ์กฐ๋Š” Duck์ด๋ผ๋Š” ์ˆ˜ํผํด๋ž˜์Šค์— fly()๋ผ๋Š” ํ•จ์ˆ˜๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜์ง€! ๋ผ๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๊ณ ๊ฐ A๋Š” ํ™”๊ฐ€๋‚˜ ์กฐ์—๊ฒŒ ํ™”๋ฅผ ๋ƒˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐ๋ชจํ•  ๋•Œ, ๊ณ ๋ฌด ์žฅ๋‚œ๊ฐ ์˜ค๋ฆฌ๊ฐ€ ๋‚ ๋ผ๋‹ค๋…”๋‹ค๋ฉด์„œ ๋ง์ด์ฃ .

๋ฌธ์ œ๋Š” Duck์ด๋ผ๋Š” ์ˆ˜ํผํด๋ž˜์Šค์— fly()๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ ์ผ๋ถ€ ์„œ๋ธŒํด๋ž˜์Šค์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์€ ํ–‰๋™์ด ์ „๋ถ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์†์„ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์‹ค์ œ ์ฝ”๋“œ์—์„œ๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ„๊ณผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด RubberDuck ํด๋ž˜์Šค์— fly()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ด…๋‹ˆ๋‹ค.

์ด๋•Œ, ๋งŒ์•ฝ ์šธ์ง€๋„ ๋‚ ์ง€๋„ ๋ชปํ•˜๋Š” ๋‚˜๋ฌด๋กœ ๋œ ๊ฐ€์งœ ์˜ค๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? ์•„๋ž˜์™€ ๊ฐ™์ด quack()๊ณผ fly()์— ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด ๋ ๊นŒ์š”?

์œ„์™€ ๊ฐ™์ด ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด ์ˆ˜ํผํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”์—†๋Š” ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋•Œ ๋ถˆํ•„์š”ํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ์กฐ๋Š” ์ˆ˜ํผํด๋ž˜์Šค์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐฉ์‹์€ Flyable์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๋ฉด '๋‚  ์ˆ˜ ์žˆ๋Š”' ํ–‰๋™์— ๋Œ€ํ•œ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ์ „ํ˜€ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ, ์ฝ”๋“œ ๊ด€๋ฆฌ๋ฉด์—์„œ ์ปค๋‹ค๋ž€ ๋ฌธ์ œ์ ์ด ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋Š” ๊ตฌํ˜„์ฒด๋งŒ ๋งŒ๋“ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ฐœ๋ฐœ์ž ์กฐ๋Š” ์ƒ์†(ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ฆฌ ์„ฑ๊ณต์ ์ด์ง€ ๋ชปํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ด์ œ ํ™•์‹คํžˆ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒํด๋ž˜์Šค๋งˆ๋‹ค ์˜ค๋ฆฌ์˜ ํ–‰๋™์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š”๋ฐ๋„ ๋ชจ๋“  ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ํ•œ ํ–‰๋™์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์˜ฌ๋ฐ”๋ฅด์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฒ˜์Œ์—๋Š” ๊ดœ์ฐฎ์•„๋ณด์˜€์ง€๋งŒ, ์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๊ตฌํ˜„๋œ ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ํ–‰๋™์„ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ๊ทธ ํ–‰๋™์ด ์ •์˜๋˜์–ด ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ธŒํด๋ž˜์Šค๋“ค์„ ์ „๋ถ€ ์ฐพ์•„์„œ ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Strategy Pattern ์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ๊ฐ์ด ์˜ค๊ณ  ๊ณ„์‹ค๊ฒ๋‹ˆ๋‹ค. ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


# ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

์šฐ์„  Strategy Pattern์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡๊ฐ€์ง€ ๋””์ž์ธ ์›์น™์„ ์•Œ์•„์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ ์›์น™ 1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๊ณ , ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ถ€๋ถ„์œผ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ์‹œํ‚จ๋‹ค.

์ฆ‰, ์ฝ”๋“œ์— ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ํ–‰๋™์„ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ถ€๋ถ„์œผ๋กœ๋ถ€ํ„ฐ ๊ณจ๋ผ๋‚ด์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์›์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ๋ฝ‘์•„์„œ ์บก์Šํ™” ์‹œํ‚จ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚˜์ค‘์— ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ถ€๋ถ„์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์€ ์ฑ„๋กœ ๊ทธ ๋ถ€๋ถ„๋งŒ ๊ณ ์น˜๊ฑฐ๋‚˜ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ๊ฐœ๋…์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ๋””์ž์ธ ํŒจํ„ด์˜ ๊ธฐ๋ฐ˜์„ ์ด๋ฃจ๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.


# Strategy Pattern ์‚ฌ์šฉํ•˜๊ธฐ

# 1. ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„ ๋ถ„๋ฆฌํ•˜๊ธฐ

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ๋ฐ”๋กœ fly() ๋ฌธ์ œ๋ฅผ ์ œ์™ธํ•˜๋ฉด Duck ํด๋ž˜์Šค๋Š” ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ž์ฃผ ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ช‡๊ฐ€์ง€ ์ž์ž˜ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๋ฉด Duck ํด๋ž˜์Šค๋Š” ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ๋นฝ๋นฝ๊ฑฐ๋ฆฌ๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ์•„๋ฌด ์†Œ๋ฆฌ๋„ ๋‚ด์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ์‹์œผ๋กœ ๋ง์ž…๋‹ˆ๋‹ค.

**๊ทธ๋ ‡๋‹ค๋ฉด ๋‚˜๋Š” ํ–‰๋™๊ณผ ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ํ–‰๋™์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค ์ง‘ํ•ฉ์€ ์–ด๋–ป๊ฒŒ ๋””์ž์ธํ•ด์•ผํ• ๊นŒ์š”? **

์šฐ์„  ์ตœ๋Œ€ํ•œ ์œ ์—ฐํ•œ ํด๋ž˜์Šค ์ง‘ํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ์ด๋Ÿฐ ๋ฌธ์ œ์— ๋ง๋ ค๋“  ๊ฒŒ ์˜ค๋ฆฌ์˜ ํ–‰๋™๊ณผ ๊ด€๋ จ๋œ ์œ ์—ฐ์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, MallardDuck ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ํŠน์ • ํ˜•์‹์˜ ๋‚˜๋Š” ํ–‰๋™์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฆฌ์˜ ํ–‰๋™์„ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์œผ๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰ Duck ํด๋ž˜์Šค์— ํ–‰๋™๊ณผ ๊ด€๋ จ๋œ ์„ธํ„ฐ(setter) ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จ์‹œ์ผœ์„œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘์—๋„ MallardDuck์˜ ๋‚˜๋Š” ํ–‰๋™์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋‹จ ์ด๋ ‡๊ฒŒ ๋ชฉํ‘œ๋ฅผ ์ •ํ•ด๋†“์€ ๋‹ค์Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๋ฒˆ์งธ ๋””์ž์ธ ์›์น™์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


# 2. ๊ตฌํ˜„์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ

๋””์ž์ธ ์›์น™ 2. ๊ตฌํ˜„์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค.

๊ฐ ํ–‰๋™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ‘œํ˜„ํ•˜๊ณ  ํ–‰๋™์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‚˜๋Š” ํ–‰๋™์€ ์ด์ œ Duck ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ํŠน์ • ํ–‰๋™๋งŒ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ง‘ํ•ฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํ–‰๋™ ์ธํ„ฐํŽ˜์ด์Šค๋Š” Duck ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ, ๋ฐฉ๊ธˆ ์„ค๋ช…ํ•œ ํ–‰๋™ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด Duck์˜ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ‘œํ˜„๋˜๋Š” ํ–‰๋™์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ–‰๋™์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ Duck ์„œ๋ธŒํด๋ž˜์Šค์— ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๋””์ž์ธํ•˜๋ฉด ๋‹ค๋ฅธ ํ˜•์‹์˜ ๊ฐ์ฒด์—์„œ๋„ ๋‚˜๋Š” ํ–‰๋™์„ ์žฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์˜ ํ–‰๋™ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋‚ ์•„๋‹ค๋‹ˆ๋Š” ํ–‰๋™์„ ์‚ฌ์šฉํ•˜๋Š” Duck ํด๋ž˜์Šค๋ฅผ ์ „ํ˜€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ํ–‰๋™์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด์ œ Duck์—์„œ ๋‚˜๋Š” ํ–‰๋™์„ Duck ํด๋ž˜์Šค์—์„œ ์ •์˜ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์จ์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์œ„์ž„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


# 3. Duck ํด๋ž˜์Šค์— ๋‚˜๋Š” ํ–‰๋™ ํ†ตํ•ฉํ•˜๊ธฐ

  1. ์šฐ์„  Duck ํด๋ž˜์Šค์— flyBehavior๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ๊ฐ Duck ๊ฐ์ฒด์—์„œ๋Š” ์‹คํ–‰ ์‹œ์— ์ด ๋ณ€์ˆ˜์— ํŠน์ • ํ–‰๋™ ํ˜•์‹(FlyWithWings, FlyNoWay..)์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹คํ˜•์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ ๋‹ค์Œ performFly()๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    public class Duck {
        // FlyBehavior ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค
        FlyBehavior flyBehavior;
        
        // flyBehavior๋กœ ์ฐธ์กฐ๋˜๋Š” ๊ฐ์ฒด์— ๊ทธ ํ–‰๋™์„ ์œ„์ž„
        public void performFly(){
            flyBehavior.fly();
        }
    }
    

    ์ง€๊ธˆ ์ด ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ์ฒด์˜ ์ข…๋ฅ˜์—๋Š” ์ „ํ˜€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. fly()๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ค„ ์•ˆ๋‹ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

  3. flyBehavior ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” MallardDuck ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ด…๋‹ˆ๋‹ค.

public class MallardDuck extends Duck {
    public MallardDuck(){
        flyBehavior = new FlyWithWings();
    }
    public void display() {
        System.out.println("์ €๋Š” ๋ฌผ์˜ค๋ฆฌ์ž…๋‹ˆ๋‹ค.");
    }
}

MallardDuck ์ƒ์„ฑ์ž์—์„œ๋Š” flyBehavior ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— FlyWithWings ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์˜ค๋ฆฌ์—๋Š” FlyBehavior๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋‚˜๋Š” ํ–‰๋™์„ ์œ„์ž„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•ฉ์น˜๋Š” ๊ฒƒ์„ ๊ตฌ์„ฑ(Composition)์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‚˜์™€์žˆ๋Š” Duck ํด๋ž˜์Šค์—์„œ๋Š” ํ–‰๋™์„ ์ƒ์†๋ฐ›๋Š” ๋Œ€์‹ , ์˜ฌ๋ฐ”๋ฅธ ํ–‰๋™ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋จ์œผ๋กœ์จ ํ–‰๋™์„ ๋ถ€์—ฌ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


# 4. "A๋Š” B์ด๋‹ค" ๋ณด๋‹ค "A์—๋Š” B๊ฐ€ ์žˆ๋‹ค"๊ฐ€ ๋‚˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ ์›์น™ 3. ์ƒ์†๋ณด๋‹ค๋Š” ๊ตฌ์„ฑ์„ ํ™œ์šฉํ•œ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ด ์™”๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ๊ตฌ์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๋ฉด ์œ ์—ฐ์„ฑ์„ ์ฟ ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ตฐ์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ ๋ฟ ์•„๋‹ˆ๋ผ, ๊ตฌ์„ฑ์š”์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์—์„œ ์˜ฌ๋ฐ”๋ฅธ ํ–‰๋™ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‹คํ–‰์‹œ์— ํ•ด๋™์„ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.


# References

Last Updated: 8/12/2020, 1:33:42 PM