Post

๐ŸŽจ 01. ๋””์ž์ธ ํŒจํ„ด ์†Œ๊ฐœ์™€ ์ „๋žต ํŒจํ„ด

๐ŸŽจ 01. ๋””์ž์ธ ํŒจํ„ด ์†Œ๊ฐœ์™€ ์ „๋žต ํŒจํ„ด

๐Ÿฆ†ย ์˜ค๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒŒ์ž„

SimUDuck์ด๋ผ๋Š” ์˜ค๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒŒ์ž„์€ ํ—ค์—„๋„ ์น˜๊ณ , ๊ฝฅ๊ฝฅ ์†Œ๋ฆฌ๋„ ๋‚ด๋Š” ๋‹ค์–‘ํ•œ ์˜ค๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค. ์ด ์‹œ์Šคํ…œ์„ ์ฒ˜์Œ ๋””์ž์ธํ•œ ์‚ฌ๋žŒ์€ ํ‘œ์ค€ ๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด Duck์ด๋ผ๋Š” ์Šˆํผํด๋ž˜์Šค๋ฅผ ๋งŒ๋“  ๋‹ค์Œ, ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์˜ค๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

1
2
3
4
5
// Duck (์Šˆํผํด๋ž˜์Šค)

quack() // ๊ฝฅ๊ฝฅ ์†Œ๋ฆฌ๋ฅผ ๋ƒ„
swim() // ํ—ค์—„์„ ์น  ์ˆ˜ ์žˆ์Œ
display() // ๋ชจ๋“  ์˜ค๋ฆฌ์˜ ๋ชจ์–‘์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ

๊ทธ๋Ÿฐ๋ฐ ๊ฐ‘์ž๊ธฐ ์˜ค๋ฆฌ๋ฅผ ๋‚ ๊ฒŒ ํ•˜๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

1
2
3
4
5
6
// Duck (์Šˆํผํด๋ž˜์Šค)

quack() // ๊ฝฅ๊ฝฅ ์†Œ๋ฆฌ๋ฅผ ๋ƒ„
swim() // ํ—ค์—„์„ ์น  ์ˆ˜ ์žˆ์Œ
display() // ๋ชจ๋“  ์˜ค๋ฆฌ์˜ ๋ชจ์–‘์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ
fly() // ์ถ”๊ฐ€!!!

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

1
2
3
4
5
6
7
8
// RubberDuck

quack() // ๊ฝฅ๊ฝฅ ์†Œ๋ฆฌ๋ฅผ ๋ƒ„
swim() // ํ—ค์—„์„ ์น  ์ˆ˜ ์žˆ์Œ
display() // ๋ชจ๋“  ์˜ค๋ฆฌ์˜ ๋ชจ์–‘์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ
fly() {
// ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋“œ
}

๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ๊ณ ๋ฌด ์˜ค๋ฆฌ ํด๋ž˜์Šค์—์„œ๋Š” ๋‚ ์ง€ ์•Š๋„๋ก fly ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด ์ฃผ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž„์›์ง„์ด ์•ž์œผ๋กœ 6๊ฐœ์›”๋งˆ๋‹ค ์ œํ’ˆ์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ์•ž์œผ๋กœ ๊ทœ๊ฒฉ์ด ๊ณ„์† ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค๋ฉด? Duck์˜ ์„œ๋ธŒํด๋ž˜์Šค์ธ fly()์™€ quack() ๋ฉ”์†Œ๋“œ๋ฅผ ์ผ์ผ์ด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿฆ†ย ์ƒ์†์˜ ๋‹จ์ 

  • ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋œ๋‹ค.
  • ์‹คํ–‰ ์‹œ ํŠน์ง•์„ ๋ฐ”๊พธ๊ธฐ ํž˜๋“ค๋‹ค.
  • ๋ชจ๋“  ์˜ค๋ฆฌ์˜ ํ–‰๋™์„ ์•Œ๊ธฐ ํž˜๋“ค๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ์˜ค๋ฆฌ๋“ค์—๊ฒŒ ์›์น˜ ์•Š์€ ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฆ†ย ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ํ•˜๊ธฐ

fly()๋ฅผ Duck ์Šˆํผํด๋ž˜์Šค์—์„œ ๋นผ๊ณ  fly() ๋ฉ”์†Œ๋“œ๊ฐ€ ๋“ค์–ด์žˆ๋Š” Flyable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋‚  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฆฌ์—๊ฒŒ๋งŒ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ fly() ๋ฉ”์†Œ๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ Quackable์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ์˜ค๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Flyable, Quackable์„ ๊ตฌํ˜„ํ•ด ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์žˆ๊ฒ ์œผ๋‚˜, ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋“œ ๊ด€๋ฆฌ์— ์ปค๋‹ค๋ž€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

  • ๋‚  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฆฌ ์ค‘์—์„œ๋„ ๋‚ ์•„๋‹ค๋‹ˆ๋Š” ๋ฐฉ์‹์ด ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
  • ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ณ ์น  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ด๋ฉด์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด?

๐Ÿฆ†ย ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ

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

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

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

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

๐Ÿฆ†ย ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„ ๋ถ„๋ฆฌํ•˜๊ธฐ

Duck ํด๋ž˜์Šค๋Š” ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ž์ฃผ ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.

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

fly()์™€ quack()์€ Duck ํด๋ž˜์Šค์— ์žˆ๋Š” ์˜ค๋ฆฌ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์ด๋‹ค.

fly()์™€ quack()์„ Duck ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜๋ ค๋ฉด 2๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋‘ Duck ํด๋ž˜์Šค์—์„œ ๋„์ง‘์–ด๋‚ด์„œ ๊ฐ ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ผ ํด๋ž˜์Šค ์ง‘ํ•ฉ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๐Ÿฆ†ย ์˜ค๋ฆฌ์˜ ํ–‰๋™์„ ๋””์ž์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

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

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

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

โ€œ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค.โ€ ๋ผ๋Š” ๋ง์€ ์‚ฌ์‹ค โ€œ์ƒ์œ„ ํ˜•์‹์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค.โ€ ๋ผ๋Š” ๋ง์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ค‘์˜์  ์˜๋ฏธ๋กœ ์“ฐ์˜€๋‹ค.

  • ์ž๋ฐ”์˜ ๊ตฌ์กฐ
  • ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋… ์ง€์นญ

์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค. โ‡’ ์‹ค์ œ ์‹คํ–‰ ์‹œ์— ์“ฐ์ด๋Š” ๊ฐ์ฒด๊ฐ€ ์ฝ”๋“œ์— ๊ณ ์ •๋˜์ง€ ์•Š๋„๋ก ์ƒ์œ„ ํ˜•์‹์— ๋งž์ถฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์„œ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜๋ผ.

์ƒ์œ„ ํ˜•์‹์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค. โ‡’ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ๋ณดํ†ต ์ถ”์ƒ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ™์€ ์ƒ์œ„ ํ˜•์‹์œผ๋กœ ์„ ์–ธํ•˜๋ผ. โ‡’ ๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•  ๋•Œ ์ƒ์œ„ ํ˜•์‹์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ํ˜•์‹์ด๋ผ๋ฉด ์–ด๋–ค ๊ฐ์ฒด๋“  ๋„ฃ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

1
2
Dog d = new Dog();
d.bark();

๋ณ€์ˆ˜ d๋ฅผ Dog ํ˜•์‹์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ๋งž์ถฐ์„œ ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒ์œ„ ํ˜•์‹์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
Animal animal = new Dog();
animal.makeSound();

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

1
2
a = getAnimal();
a.makeSound();

Image

์šฐ๋ฆฐ animal์ด ์–ด๋–ค ํ•˜์œ„ ํด๋ž˜์Šค์ธ์ง€ ๋ชฐ๋ผ๋„ makeSound()๋ฅผ ๋™์ž‘ํ•˜๋Š” ๋ฐ์— ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

๐Ÿฆ†ย ์˜ค๋ฆฌ์˜ ํ–‰๋™์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

Image

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

๐Ÿฆ†ย ์˜ค๋ฆฌ ํ–‰๋™ ํ†ตํ•ฉํ•˜๊ธฐ

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

  1. ์šฐ์„  Duck ํด๋ž˜์Šค์— flyBehavior์™€ quackBehavior๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ฐ ์˜ค๋ฆฌ ๊ฐ์ฒด์—์„œ๋Š” ์‹คํ–‰ ์‹œ์— ์ด ๋ณ€์ˆ˜์— ํŠน์ • ํ–‰๋™ ํ˜•์‹์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹คํ˜•์ ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๋‚˜๋Š” ํ–‰๋™๊ณผ ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ํ–‰๋™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ–ˆ์œผ๋ฏ€๋กœ Duck ํด๋ž˜์Šค์™€ ๋ชจ๋“  ์„œ๋ธŒํด๋ž˜์Šค์—์„œ fly()์™€ quack() ๋ฉ”์†Œ๋“œ๋Š” ์ œ๊ฑฐํ•œ๋‹ค. Duck ํด๋ž˜์Šค์— fly()์™€ quack() ๋Œ€์‹  performFly()์™€ performQuack()๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 1. ๋‚ ๊ธฐ ํ–‰๋™์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
interface FlyBehavior {
    void fly();
}

// 2. ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ํ–‰๋™์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
interface QuackBehavior {
    void quack();
}

// 3. ์‹ค์ œ ๋‚ ๊ธฐ ํ–‰๋™๋“ค (์ „๋žต)
class FlyWithWings implements FlyBehavior {
    public void fly() {
        System.out.println("ํผ๋•ํผ๋•");
    }
}

class FlyNoWay implements FlyBehavior {
    public void fly() {
        System.out.println("์ƒˆ์žฅ ์•ˆ์— ๊ฐ‡ํžŒ ์ƒˆ");
    }
}

// 4. ์‹ค์ œ ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ํ–‰๋™๋“ค (์ „๋žต)
class Quack implements QuackBehavior {
    public void quack() {
        System.out.println("๊ฝฅ๊ฝฅ");
    }
}

class MuteQuack implements QuackBehavior {
    public void quack() {
        System.out.println("...");
    }
}

// 5. Duck ํด๋ž˜์Šค (ํ–‰๋™์„ ์บก์Аํ™”ํ•˜์—ฌ ์ฐธ์กฐ)
abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }

    public abstract void display();
}
  1. MallardDuck ํด๋ž˜์Šค ํ†ตํ•ด flyBehavior์™€ quackBehavior ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณด์ž.
    1. MallardDuck์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ์ƒ์„ฑ์ž๋Š” Duck์œผ๋กœ ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ quackBehavior ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— Quack ํ˜•์‹์˜ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค.
    2. MallardDuck์˜ ์ƒ์„ฑ์ž๋Š” flyBehavior ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— FlyWithWings ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋Œ€์ž…ํ•œ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
// 6. ํŠน์ • ์˜ค๋ฆฌ ํด๋ž˜์Šค (ํ–‰๋™์„ ๋™์ ์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅ)
class MallardDuck extends Duck {
    public MallardDuck() {
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }

    public void display() {
        System.out.println("๋‚˜๋Š” ๋ฌผ์˜ค๋ฆฌ");
    }
}

๐Ÿฆ†ย ๋‘ ํด๋ž˜์Šค๋ฅผ ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•

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

โ€œA์—๋Š” B๊ฐ€ ์žˆ๋‹ค.โ€

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

๐Ÿฆ†ย ์ „๋žต ํŒจํ„ด

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

This post is licensed under CC BY 4.0 by the author.