๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐ŸŒˆ Chapter 6: ๋ฉ”์‹œ์ง€์™€ ์ธํ„ฐํŽ˜์ด์Šค

  • ํ›Œ๋ฅญํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๋ฅผ ์ง€ํ–ฅํ•ด์•ผ ํ•œ๋‹ค. ์ข€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•ด์„œ ํ˜‘๋ ฅ ์•ˆ์—์„œ ๊ฐ์ฒด๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฑ…์ž„์— ์ดˆ์ ์„ ๋งž์ถฐ์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฑ…์ž„์ด ๊ฐ์ฒด๊ฐ€ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์‹œ์ง€์˜ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“š ํ˜‘๋ ฅ๊ณผ ๋ฉ”์‹œ์ง€โ€‹

๐ŸŽˆ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธโ€‹

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

๐ŸŽˆ ๋ฉ”์‹œ์ง€์™€ ๋ฉ”์‹œ์ง€ ์ „์†กโ€‹

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฐ์ฒด๋“ค์ด ํ˜‘๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์˜์‚ฌ์†Œํ†ต ์ˆ˜๋‹จ์ด๋‹ค.
  • ๋ฉ”์‹œ์ง€ ์ „์†ก(๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ)์€ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ฉ”์‹œ์ง€ ์ „์†ก์ž๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. (ํด๋ผ์ด์–ธํŠธ)
  • ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ž๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. (์„œ๋ฒ„)
  • ๋ฉ”์‹œ์ง€๋Š” ์˜คํผ๋ ˆ์ด์…˜๋ช…๊ณผ ์ธ์ž๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๋ฉ”์‹œ์ง€ ์ „์†ก์€ ์—ฌ๊ธฐ์— ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”์‹œ์ง€ ์ „์†ก์€ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ž, ์˜คํผ๋ ˆ์ด์…˜๋ช…, ์ธ์ž์˜ ์กฐํ•ฉ์ด๋‹ค.
  • ์•„๋ž˜๋Š” ์ž๋ฐ”์˜ ์˜ˆ์‹œ์ด๋‹ค.
//์ˆ˜์‹ ์ž.์˜คํผ๋ ˆ์ด์…˜๋ช…(์ธ์ž)
condition.isSatisfiedBy(screening);

๐ŸŽˆ ๋ฉ”์‹œ์ง€์™€ ๋ฉ”์„œ๋“œโ€‹

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

๐ŸŽˆ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์˜คํผ๋ ˆ์ด์…˜โ€‹

  • ์™ธ๋ถ€์˜ ๊ฐ์ฒด๋Š” ์˜ค์ง ๊ฐ์ฒด๊ฐ€ ๊ณต๊ฐœํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด๊ฐ€ ์˜์‚ฌ์†Œํ†ต์„ ์œ„ํ•ด ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜๋Š” ๋ฉ”์‹œ์ง€์˜ ์ง‘ํ•ฉ์„ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ด€์ ์—์„œ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์— ํฌํ•จ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์˜คํผ๋ ˆ์ด์…˜์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์˜คํผ๋ ˆ์ด์…˜์€ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•œ ์–ด๋–ค ํ–‰๋™์— ๋Œ€ํ•œ ์ถ”์ƒํ™”๋‹ค. (DiscountCondition์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ isSatisfiedBy๊ฐ€ ์˜คํผ๋ ˆ์ด์…˜์— ํ•ด๋‹นํ•œ๋‹ค.)
  • ๊ทธ์— ๋น„ํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ–ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋Š” ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. (SequenceCondition, PeriodCondition์— ์ •์˜๋œ ๊ฐ๊ฐ์˜ isSatisfiedBy๋Š” ์‹ค์ œ ๊ตฌํ˜„์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.)

๐ŸŽˆ ์‹œ๊ทธ๋‹ˆ์ฒ˜โ€‹

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

๐Ÿ“š ์ธํ„ฐํŽ˜์ด์Šคํ†ผ ์„ค๊ณ„ ํ’ˆ์งˆโ€‹

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

๐ŸŽˆ ๋””๋ฏธํ„ฐ ๋ฒ•์น™โ€‹

  • 4์žฅ์˜ ์ ˆ์ฐจ์ ์ธ ๋ฐฉ์‹์˜ ์˜ํ™” ์˜ˆ๋งค ์‹œ์Šคํ…œ ์ฝ”๋“œ ์ค‘ ํ• ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Movie movie = screening.getMovie();

boolean discountable = false;
// DiscountCondition์— ๋Œ€ํ•ด ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ํ• ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ
for (DiscountCondition condition : movie.getDiscountConditions()) {
if (condition.getType() == DiscountConditionType.PERIOD) {
// ๊ธฐ๊ฐ„ ์กฐ๊ฑด
} else {
discountable = condition.getSequence() == screening.getSequence();
}

if (discountable) {
break;
}
}

// ...
}
}
  • ์ด ์ฝ”๋“œ์—์„œ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ReservationAgency์™€ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ Screening ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’๊ธฐ ๋•Œ๋ฌธ์— Screening ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋งˆ๋‹ค ReservationAgency๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ด์ฒ˜๋Ÿผ ํ˜‘๋ ฅํ•˜๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์„ค๊ณ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆ๋œ ์›์น™์ด ๋””๋ฏธํ„ฐ ๋ฒ•์น™(Law of Demeter)์ด๋‹ค.
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š๋„๋ก ํ˜‘๋ ฅ ๊ฒฝ๋กœ๋ฅผ ์ œ์•ˆํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค. (๋‚ฏ์„  ์ž์—๊ฒŒ ๋งํ•˜์ง€ ๋ง๋ผ, ์˜ค์ง ์ธ์ ‘ํ•œ ์ด์›ƒํ•˜๊ณ ๋งŒ ๋งํ•˜๋ผ)
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋Œ€์ƒ์—๊ฒŒ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ชจ๋“  ํด๋ž˜์Šค C์™€ C์— ๊ตฌํ˜„๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ M์— ๋Œ€ํ•ด์„œ, M์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๋‹ค์Œ์— ์„œ์ˆ ๋œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—ฌ์•ผ ํ•œ๋‹ค. ์ด๋•Œ M์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋‚˜ M์ด ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด, ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ M์˜ ์ธ์ž๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
  • ๋‹ค์Œ์€ 4์žฅ์—์„œ ๊ฒฐํ•ฉ๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒจ๋ผ๊ธฐ ์œ„ํ•ด ์ˆ˜์ •ํ•œ ReservationAgency์˜ ์ตœ์ข… ์ฝ”๋“œ์ด๋‹ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Money fee = screening.calculateFee(audienceCount);
return new Reservation(customer, screening, fee, audienceCount);
}
}
  • ์ด ์ฝ”๋“œ์—์„œ ReservationAgency๋Š” ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ Screening ์ธ์Šคํ„ด์Šค์—๊ฒŒ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค. ReservationAgency๋Š” Screening ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์–ด๋–ค ์ •๋ณด๋„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ๋•Œ๋ฌธ์— Screening์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•ด๋„ ReservationAgency๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ๋””๋ฏธํ„ฐ์˜ ๋ฒ•์น™์„ ๋”ฐ๋ฅด๋ฉด ๋ถ€๋„๋Ÿผํƒ€๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ถ€๋„๋Ÿผํƒ€๋Š” ์ฝ”๋“œ๋ž€ ๋ถˆํ•„์š”ํ•œ ์–ด๋–ค ๊ฒƒ๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์œผ๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๊ตฌํ˜„์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•œ๋‹ค.
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ๋”ฐ๋ฅด๋Š” ์ฝ”๋“œ๋Š” ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ž์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์ „์†ก์ž์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฉ”์‹œ์ง€ ์ „์†ก์ž๋Š” ์ˆ˜์‹ ์ž์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๊ฒฐํ•ฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์Œ์€ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
screening.getMovie().getDiscountConditions();
  • ๋ฉ”์‹œ์ง€ ์ „์†ก์ž๊ฐ€ ์ˆ˜์‹ ์ž์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์š”์†Œ์— ๋Œ€ํ•ด ์—ฐ์‡„์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๊ธฐ์ฐจ ์ถฉ๋Œ(train wreck)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜์–ด ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ž์˜ ์บก์Šํ™”๋Š” ๋ฌด๋„ˆ์ง€๊ณ , ๋ฉ”์‹œ์ง€ ์ „์†ก์ž๊ฐ€ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ž์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
screening.calculateFee(audienceCount);
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ๊ฐ์ฒด๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ์ฑ…์ž„์ง€๋Š” ์ž์œจ์ ์ธ ์กด์žฌ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ•์กฐํ•œ๋‹ค.
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜์‹ ์ž์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‹œํ‚ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋” ์ข‹์€ ๋ฉ”์‹œ์ง€๋ผ๊ณ  ์†์‚ญ์ธ๋‹ค.

๐ŸŽˆ ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผโ€‹

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

๐ŸŽˆ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šคโ€‹

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋„๋ก ์ด๋ฆ„์„ ์ง“๋Š” ๊ฒƒ์€ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋“œ๋Ÿฌ๋‚ด์„œ ์ข‹์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
public class PeriodCondition {
public boolean isSatisfiedByPeriod(Screening screening) { }
}

public class SequenceCondition {
public boolean isSatisfiedBySequence(Screening screening) { }
}
  • ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ์ง“๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋ฅผ ๋“œ๋Ÿฌ๋‚ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ด๋ฆ„์„ ์ง€์œผ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ๋‚ณ๋Š”๋‹ค.
  • ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋„๋ก ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๊ด€์ ์—์„œ ํ˜‘๋ ฅ์„ ๋ฐ”๋ผ๋ด์•ผ ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๊ด€์ ์—์„œ์˜ ๋‘ ๋ฉ”์„œ๋“œ๋Š” ํ• ์ธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— isSatisfiedBy๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค.
public class PeriodCondition {
public boolean isSatisfiedBy(Screening screening) { }
}

public class SequenceCondition {
public boolean isSatisfiedBy(Screening screening) { }
}
  • ํด๋ผ์ด์–ธํŠธ์˜ ์ž…์žฅ์—์„œ ๋‘ ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋•Œ๋ฌธ์— DiscountCondition์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— isSatisfiedBy ์˜คํผ๋ ˆ์ด์…˜์„ ์ •์˜ํ•œ๋‹ค.
public interface DiscountCondition {
boolean isSatisfiedBy(Screening screening);
}
  • ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š๋ƒ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌด์—‡์„ ํ•˜๋Š๋ƒ์— ์ดˆ์ ์„ ๋งž์ถ”๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ๊ด€์ ์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ํ•˜๋‚˜์˜ ํƒ€์ž… ๊ณ„์ธต์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง„๋‹ค. ์ด์ฒ˜๋Ÿผ ์ด๋ฆ„์„ ์ง“๋Š” ํŒจํ„ด์„ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์„ ํƒ์ž(Intention Revealing Selector)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๐ŸŽˆ ํ•จ๊ป˜ ๋ชจ์œผ๊ธฐโ€‹

  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™, ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผ ์Šคํƒ€์ผ, ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์ด ์›์น™์„ ์œ„๋ฐ˜ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.
  • 1์žฅ์˜ ํ‹ฐ์ผ“ ํŒ๋งค ๋„๋ฉ”์ธ์ด ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๋‹ค.

๐Ÿถ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ํ‹ฐ์ผ“ ํŒ๋งค ๋„๋ฉ”์ธโ€‹

public class Theater {
private TicketSeller ticketSeller;

public Theater(TicketSeller ticketSeller) {
this.ticketSeller = ticketSeller;
}

public void enter(Audience audience) {
if (audience.getBag().hasInvitation()) { // ์ดˆ๋Œ€์žฅ์ด ์žˆ์œผ๋ฉด
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().setTicket(ticket); // ํŒ๋งค์›์ด ํ‹ฐ์ผ“์„ ์ค€๋‹ค.
} else { // ์ดˆ๋Œ€์žฅ์ด ์—†์œผ๋ฉด
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().minusAmount(ticket.getFee()); // ๊ด€๋žŒ๊ฐ์ด ๋ˆ์„ ์ง€๋ถˆํ•œ๋‹ค.
ticketSeller.getTicketOffice().plusAmount(ticket.getFee()); // ํŒ๋งค์›์ด ๋ˆ์„ ๋ฐ›๋Š”๋‹ค.
audience.getBag().setTicket(ticket); // ํ‹ฐ์ผ“์„ ์ค€๋‹ค.
}
}
}
  • ์œ„ Theater๋Š” ์ธ์ž๋กœ ์ „๋‹ฌ๋œ audience์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์ธ ticketSeller์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ audience์™€ ticketSeller ๋‚ด๋ถ€์— ํฌํ•จ๋œ ๊ฐ์ฒด์—๋„ ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค.
audience.getBag().minusAmount(ticket.getFee());
  • ๊ทผ๋ณธ์ ์œผ๋กœ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ์„ค๊ณ„๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ ์›์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค.
  • ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ๊ตฌํ˜„์— ํ•ด๋‹นํ•œ๋‹ค. Audience๊ฐ€ Bag์„ ํฌํ•œํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ Audience์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ์†ํ•œ๋‹ค.
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ Audience์™€ TicketSeller์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ฌป๋Š” ๋Œ€์‹  Audience์™€ TicketSeller๊ฐ€ ์ง์ ‘ ์ž์‹ ์˜ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿถ ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผโ€‹

  • 1์žฅ์˜ ๊ตฌํ˜„ ๋‚ด์šฉ๊ณผ ๋น„์Šท. ์ฑ… ์ฐธ๊ณ 
public class Theater {
public void enter(Audience audience) {
ticketSeller.setTicket(audience);
}
}

public class TicketSeller {
public void setTicket(Audience audience) {
ticketOffice.plusAmount(
audience.setTicket(ticketOffice.getTicket());
)
}
}

public class Audience {
public Long setTicket(Ticket ticket) {
return bag.setTicket(ticket);
}
}
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™๊ณผ ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž์œจ์ ์ธ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋œ ์œ ์—ฐํ•œ ํ˜‘๋ ฅ์„ ์–ป๊ฒŒ ๋œ๋‹ค.
  • ๊ตฌํ˜„์ด ๊ฐ์ฒด์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์— ๋…ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์•„์ง„๋‹ค. ์‘์ง‘๋„ ์—ญ์‹œ ๋†’์•„์ง„๋‹ค.

๐Ÿถ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด์žโ€‹

  • ํ˜„์žฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด์ง€ ๋ชปํ•œ๋‹ค. TicketSeller์˜ setTicket?? Audience์˜ setTicket??
  • ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ํ™•๋ฅ ์ด ๋†’๋‹ค. ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค.
public class TicketSeller {
public void sellTo(Audience audience) {}
}

public class Audience {
public Long buy(Ticket ticket) {}
}

public class Bag {
public Long hold(Ticket ticket) {}
}
  • ์˜คํผ๋ ˆ์ด์…˜์˜ ์ด๋ฆ„์€ ํ˜‘๋ ฅ์ด๋ผ๋Š” ๋ฌธ๋งฅ์„ ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค. ์˜คํผ๋ ˆ์ด์…˜์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ์ฒด์—๊ฒŒ ๋ฌด์—‡์„ ์›ํ•˜๋Š”์ง€ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ๊ฐ์ฒด ์ž์‹ ์ด ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์˜ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ๊ฐ์ฒด ๊ฐ„์˜ ํ˜‘๋ ฅ์„ ์„ค๊ณ„ํ•  ๋•Œ ์บก์Šํ™”๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ œํ•œํ•œ๋‹ค.
  • ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผ ์›์น™์€ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์ค€์ˆ˜ํ•˜๋Š” ํ˜‘๋ ฅ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์Šคํƒ€์ผ์„ ์ œ์‹œํ•œ๋‹ค.
  • ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์›์น™์€ ๊ฐ์ฒด์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์— ์–ด๋–ค ์ด๋ฆ„์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๐Ÿ“š ์›์น™์˜ ํ•จ์ •โ€‹

  • ์ด ์„ธ ๊ฐ€์ง€ ์›์น™์€ ๊ฐ์ฒด์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊น”๋”ํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ์„ค๊ณ„ ์›์น™์ด์ง€๋งŒ ์ ˆ๋Œ€์ ์ธ ๋ฒ•์น™์€ ์•„๋‹ˆ๋‹ค.
  • ์›์น™์ด ํ˜„์žฌ ์ƒํ™ฉ์— ๋ถ€์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋œ๋‹ค๋ฉด ๊ณผ๊ฐํ•˜๊ฒŒ ์›์น™์„ ๋ฌด์‹œํ•˜๋ผ. ์›์น™์„ ์•„๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ๊ฒƒ์ด ์–ธ์ œ ์›์น™์ด ์œ ์šฉํ•˜๊ณ  ์–ธ์ œ ์œ ์šฉํ•˜์ง€ ์•Š์€์ง€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.

๐ŸŽˆ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ํ•˜๋‚˜์˜ ๋„ํŠธ(.)๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ทœ์น™์ด ์•„๋‹ˆ๋‹คโ€‹

  • ์•„๋ž˜์˜ ์ฝ”๋“œ๊ฐ€ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
IntStream.of(1, 15, 20, 3, 9).filter(x -> x > 10).distinct().count();
  • ํ•˜์ง€๋งŒ ์œ„ ์ฝ”๋“œ์—์„œ of, filter, distinct ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ IntStream์ด๋ผ๋Š” ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰, IntStream์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋˜ ๋‹ค๋ฅธ IntStream์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ด ์ฝ”๋“œ๋Š” ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์™ธ ์ฝ”๋“œ๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ง€ ๋‹ค๋ฅธ IntStream์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋ฟ, ๊ฐ์ฒด๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ๋Š” ์บก์Š์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค.

๐ŸŽˆ ๊ฒฐํ•ฉ๋„์™€ ์‘์ง‘๋„์˜ ์ถฉ๋Œโ€‹

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ฌผ์–ด๋ณธ ํ›„ ๋ฐ˜ํ™˜๋œ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ์ •์— ๋”ฐ๋ผ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผ ์Šคํƒ€์ผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผ์™€ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋กœ๋งŒ ๊ท€๊ฒฐ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋งน๋ชฉ์ ์œผ๋กœ ์œ„์ž„ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฐ™์€ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค ์•ˆ์— ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š” ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๊ณต์กดํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์•„์ง„๋‹ค.
  • ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ ์›์ธ๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ๋””๋ฏธํ„ฐ ๋ฒ•์น™์˜ ์œ„๋ฐ˜ ์—ฌ๋ถ€๋Š” ๋ฌป๋Š” ๋Œ€์ƒ์ด ๊ฐ์ฒด์ธ์ง€, ์ž๋ฃŒ ๊ตฌ์กฐ์ธ์ง€์— ๋‹ฌ๋ ค์žˆ๋‹ค. ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•˜๋ฏ€๋กœ ๋””๋ฏธํ„ฐ ๋ฒ•์น˜์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ ์ž๋ฃŒ ๊ตฌ์กฐ๋ผ๋ฉด ๋‹น์—ฐํžˆ ๋‚ด๋ถ€๋ฅผ ๋…ธ์ถœํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์ ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๐Ÿ“š ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™โ€‹

  • ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™์€ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜คํผ๋ ˆ์ด์…˜์„ ์ •์˜ํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์นจ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ฃจํ‹ด(routine)์ด๋ž€ ์–ด๋–ค ์ ˆ์ฐจ๋ฅผ ๋ฌถ์–ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ด๋ฆ„์„ ๋ถ€์—ฌํ•œ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด๋‹ค.
  • ๋ฃจํ‹ด์€ ํ”„๋กœ์‹œ์ €์™€ ํ•จ์ˆ˜๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœ์‹œ์ €์™€ ํ•จ์ˆ˜์˜ ๊ตฌ๋ถ„์€ ๋ถ€์ˆ˜ํšจ๊ณผ์™€ ๋ฐ˜ํ™˜๊ฐ’์˜ ์œ ๋ฌด๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
  • ํ”„๋กœ์‹œ์ €๋Š” ์ •ํ•ด์ง„ ์ ˆ์ฐจ์— ๋”ฐ๋ผ ๋‚ด๋ถ€์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฃจํ‹ด์˜ ํ•œ ์ข…๋ฅ˜๋‹ค.
  • ํ•จ์ˆ˜๋Š” ์–ด๋–ค ์ ˆ์ฐจ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฃจํ‹ด์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค.

ํ”„๋กœ์‹œ์ €๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค.
ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.

  • ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ๋Š” ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ธก๋ฉด์—์„œ ํ”„๋กœ์‹œ์ €์™€ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋Š” ๋˜ ๋‹ค๋ฅธ ์ด๋ฆ„์ด๋‹ค.
  • ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜์„ ๋ช…๋ น์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜์„ ์ฟผ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™์˜ ์š”์ง€๋Š” ์˜คํผ๋ ˆ์ด์…˜์€ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ช…๋ น์ด๊ฑฐ๋‚˜ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์–ด๋–ค ์˜คํผ๋ ˆ์ด์…˜๋„ ๋ช…๋ น์ธ ๋™์‹œ์— ์ฟผ๋ฆฌ์—ฌ์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์€ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

  • ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๋Š” ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™์— ๋”ฐ๋ผ ์ž‘์„ฑ๋œ ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…๋ น-์ฟผ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๐ŸŽˆ ๋ฐ˜๋ณต ์ผ์ •์˜ ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ ๋ถ„๋ฆฌํ•˜๊ธฐโ€‹

  • ๋‹ค์Œ์€ Event ํด๋ž˜์Šค์ด๋‹ค.
public class Event {
private String subject; // ์ฃผ์ œ
private LocalDateTime from; // ์‹œ์ž‘ ์ผ์‹œ
private Duration duration; // ์†Œ์š” ์‹œ๊ฐ„

public Event(String subject, LocalDateTime from, Duration duration) {
this.subject = subject;
this.from = from;
this.duration = duration;
}
}
  • ๋งŒ์•ฝ 2019๋…„ 5์›” 8์ผ ์ˆ˜์š”์ผ 10์‹œ 30๋ถ„๋ถ€ํ„ฐ 11์‹œ๊นŒ์ง€ ์—ด๋ฆฌ๋Š” ํšŒ์˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” Event์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
Event meeting = new Event("ํšŒ์˜",
LocalDateTime.of(2019, 5, 8, 10, 30),
Duration.ofMinutes(30));
  • ๋ฐ˜๋ณต ์ผ์ •์€ RecurringSchedule ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
public class RecurringSchedule {
private String subject; // ์ฃผ์ œ
private DayOfWeek dayOfWeek; // ๋ฐ˜๋ณต๋  ์š”์ผ
private LocalTime from; // ์‹œ์ž‘ ์‹œ๊ฐ„
private Duration duration; // ๊ธฐ๊ฐ„

public RecurringSchedule(String subject, DayOfWeek dayOfWeek, LocalTime from, Duration duration) {
this.subject = subject;
this.dayOfWeek = dayOfWeek;
this.from = from;
this.duration = duration;
}

public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}

public LocalTime getFrom() {
return from;
}

public Duration getDuration() {
return duration;
}
}
  • ๋‹ค์Œ์€ ๋งค์ฃผ ์ˆ˜์š”์ผ 10์‹œ 30๋ถ„๋ถ€ํ„ฐ 30๋ถ„ ๋™์•ˆ ์—ด๋ฆฌ๋Š” ํšŒ์˜์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ์ฝ”๋“œ์ด๋‹ค.
RecurringSchedule schedule = new RecurringSchedule("ํšŒ์˜", DayOfWeek.WEDNESDAY,
LocalTime.of(10, 30), Duration.ofMinutes(30));
  • Event ํด๋ž˜์Šค๋Š” ํ˜„์žฌ ์ด๋ฒคํŠธ๊ฐ€ RecurringSchedule์ด ์ •์˜ํ•œ ๋ฐ˜๋ณต ์ผ์ • ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” isSatisfied ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
RecurringSchedule schedule = new RecurringSchedule("ํšŒ์˜", DayOfWeek.WEDNESDAY,
LocalTime.of(10, 30), Duration.ofMinutes(30));

Event meeting = new Event("ํšŒ์˜",
LocalDateTime.of(2019, 5, 9, 10, 30),
Duration.ofMinutes(30));

assert meeting.isSatisfied(schedule) == false;
assert meeting.isSatisfied(schedule) == true;
  • ํ•˜์ง€๋งŒ isSatisfied ์•ˆ์— ๋ฒ„๊ทธ๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ๋‹ค.
  • Event์ธ์Šคํ„ด์Šค์ธ meeting์€ 2019๋…„ 5์›” 9์ผ 10์‹œ 30๋ถ„๋ถ€ํ„ฐ 30๋ถ„ ๋™์•ˆ ์ง„ํ–‰๋˜๋Š” ํšŒ์˜์ด๋‹ค. ๋•Œ๋ฌธ์— isSatisfied ์กฐ๊ฑด์— ๋งŒ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ isSatisfied ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋‹ค์Œ์€ isSatisfied ๋ฉ”์„œ๋“œ์ด๋‹ค.
public class Event {
public boolean isSatisfied(RecurringSchedule schedule) {
if (from.getDayOfWeek() != schedule.getDayOfWeek() ||
!from.toLocalTime().equals(schedule.getFrom()) ||
!duration.equals(schedule.getDuration())) {
reschedule(schedule); // reschedule ๋ฉ”์„œ๋“œ๋Š” Event ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค!
return false;
}

return true;
}
}
  • reschedule๋Š” ๋ฐ˜ํ™”์ „์— Event ๊ฐ์ฒด๋ฅผ ์ˆ˜์ • ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ค์› ๋˜ ์ด์œ ๋Š” isSatisfied๊ฐ€ ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ์˜ ๋‘ ๊ฐ€์ง€ ์—ญํ• ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ๋’ค์„ž์œผ๋ฉด ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ด๋ผ.
public class Event {
public boolean isSatisfied(RecurringSchedule schedule) {
if (from.getDayOfWeek() != schedule.getDayOfWeek() ||
!from.toLocalTime().equals(schedule.getFrom()) ||
!duration.equals(schedule.getDuration())) {
return false;
}

return true;
}

public void reschedule(RecurringSchedule schedule) {
from = LocalDateTime.of(from.toLocalDate().plusDays(daysDistance(schedule))
schedule.getFrom());
duration = schedule.getDuration();
}
}
  • ์ด์ œ Event๋ฅผ ๋ณด๋ฉด ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ›‘์–ด๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ isSatisfied๊ฐ€ ์ฟผ๋ฆฌ๊ณ , reschedule ๋ฉ”์„œ๋“œ๊ฐ€ ๋ช…๋ น์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ ๋ช…๋ น์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๐ŸŽˆ ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ์™€ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑโ€‹

  • ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๋ช…๋ นํ˜• ์–ธ์–ด์˜ ํ‹€ ์•ˆ์—์„œ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์˜ ์žฅ์ ์„ ์ œํ•œ์ ์ด๋‚˜๋งˆ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋‘ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ๋ฒ•์€ ๋Œ€์ž…๋ฌธ๊ณผ ํ•จ์ˆ˜๋‹ค.
  • ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋งํ•  ๋•Œ ๋น ์งˆ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์ธ๋ฐ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์ด๋ž€ ์–ด๋–ค ํฌํ˜„์‹ e๊ฐ€ ์žˆ์„ ๋•Œ e์˜ ๊ฐ’์œผ๋กœ e๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ๋“  ์œ„์น˜๋ฅผ ๊ต์ฒดํ•˜๋”๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํŠน์„ฑ์ด๋‹ค.
  • ์ˆ˜ํ•™์€ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์ฒด๊ณ„์ด๋‹ค. ์–ด๋–ค ํ•จ์ˆ˜ f(n)์ด ์กด์žฌํ•  ๋•Œ n์˜ ๊ฐ’์œผ๋กœ 1์„ ๋Œ€์ž…ํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ 3์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฆ‰, f(1) = 3์ด๋‹ค.
f(1) + f(1) = 6
f(1) * 2 = 6
f(1) - 1 = 2
  • ์ด์ œ f(1)์„ ๊ฒฐ๊ด๊ฐ’์ธ 3์œผ๋กœ ๋ฐ”๊ฟ” ๋ณธ๋‹ค. 3์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
3 + 3 = 6
3 * 2 = 6
3 - 1 = 2
  • ์ด๊ฒƒ์ด ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์ด๋‹ค. f(n)์ด ์–ด๋””์— ์กด์žฌํ•˜๋˜ n์˜ ๊ฐ’์ด 1์ด๋ผ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š” 3์ด๋‹ค. ๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • f(1)์ด 3์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” f(1)๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์„ฑ์งˆ์„ ๋ถˆ๋ณ€์„ฑ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋ถˆ๋ณ€ํ•˜๋‹ค๋Š” ๋ง์€ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง๊ณผ ๋™์ผํ•˜๋‹ค.
  • ๋ถˆ๋ณ€์„ฑ์€ ๋ถ€์ˆ˜ํšจ๊ณผ์˜ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค. ๋˜ํ•œ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.
f(1) - 1 = 2
f(1) * 2 = 6
f(1) + f(1) = 6
  • ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ฒฐ๊ด๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹์„ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“  ๊ณณ์—์„œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ด๊ฐ’์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๊ฐ ์‹์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์ด๋ผ๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์€ ์˜ˆ์™ธ์— ๊ฐ€๊น๋‹ค. ํ•˜์ง€๋งŒ ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™์€ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๊ฐ€์ง€๋Š” ๋ช…๋ น์œผ๋กœ๋ถ€ํ„ฐ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋ช…๋ฐฑํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ œํ•œ์ ์ด๋‚˜๋งˆ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์˜ ํ˜œํƒ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๐ŸŽˆ ์ฑ…์ž„์— ์ดˆ์ ์„ ๋งž์ถฐ๋ผโ€‹

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