์šฐ๊ทœ์ด์ธ์šฐ์œค
Eager To Learn ๐ŸŒŒ
์šฐ๊ทœ์ด์ธ์šฐ์œค
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿก ํ™ˆ
  • ๐Ÿš€ ๊นƒํ—ˆ๋ธŒ
  • โ›… ํƒœ๊ทธ ํด๋ผ์šฐ๋“œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (217)
    • ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm ๊ธฐ๋ฒ• (1)
      • ๋ฐ”ํ‚น๋… (21)
    • ๋ธ”๋กœ๊ทธ ์ด์‚ฌ (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • ์ž๋ฃŒ๊ตฌ์กฐ (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • ๊ฐœ๋ฐœ์„œ์  (15)
      • ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ (1)
      • ์˜ค๋ธŒ์ ํŠธ - ์กฐ์˜ํ˜ธ (7)
      • ์นœ์ ˆํ•œ SQL ํŠœ๋‹ (7)
    • ํšŒ๊ณ  (2)
hELLO ยท Designed By ์ •์ƒ์šฐ.
์šฐ๊ทœ์ด์ธ์šฐ์œค

Eager To Learn ๐ŸŒŒ

๊ฐœ๋ฐœ์„œ์ /์˜ค๋ธŒ์ ํŠธ - ์กฐ์˜ํ˜ธ

Chapter 5. ์ฑ…์ž„ ํ• ๋‹นํ•˜๊ธฐ

2023. 10. 14. 17:52

์กฐ์˜ํ˜ธ๋‹˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฝ๊ณ  ์ œ ๋จธ๋ฆฟ์†์— ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ์ •๋ฆฌํ•˜๋ฉฐ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.


์ฑ…์ž„ ์ฃผ๋„ ์„ค๊ณ„

 

๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ฒŒ๋˜๋ฉด ์œ ์—ฐํ•œ ์„ค๊ณ„๋ฅผ ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

 

์• ์ดˆ์—, '๋ฐ์ดํ„ฐ' ๋ผ๋Š” ๊ฒƒ์€ ๊ฐ์ฒด์˜ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด์ด๊ณ , ์ด๋Š” ๊ตฌํ˜„์— ํ•ด๋‹นํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ, ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์  ์„ค๊ณ„๋Š” ๊ฐ์ฒด์˜ ๊ตฌํ˜„๋ถ€์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์„ค๊ณ„ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์ ์œผ๋กœ ๊ฐ์ฒด ๊ฐ„ ํ˜‘๋ ฅ์„ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜๋ฉด ์™ธ๋ถ€ ๊ฐ์ฒด์—๊ฒŒ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์บก์Аํ™”๋ฅผ ๋ฐฉํ•ดํ•˜๊ฒŒ๋œ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ตฌํ˜„์„ ์ค‘์ ์œผ๋กœํ•œ ์„ค๊ณ„๋Š” ์บก์Аํ™”๋ฅผ ์ €ํ•ดํ•˜๊ณ  ์‘์ง‘๋„๋Š” ๋‚ฎ์ถ”๊ณ  ๊ฒฐํ•ฉ๋„๋Š” ๋†’์ž„์œผ๋กœ์„œ ๋ณ€ํ™”์— ์ทจ์•ฝํ•œ ์„ค๊ณ„๊ฐ€ ๋œ๋‹ค.

 

๐Ÿ’ก ๋”ฐ๋ผ์„œ, ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์ธ ํ˜‘๋ ฅ, ์ฑ…์ž„, ์—ญํ•  ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฑ…์ž„ ์„ ์ค‘์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์œ ์—ฐํ•œ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

 

[ ๊ฐ์ฒด๊ฐ€ ํฌํ•จํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€ → ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜‘๋ ฅ์€ ๋ฌด์—‡์ธ๊ฐ€] ๋ฅผ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ

 

[ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ํ–‰๋™์€ ๋ฌด์—‡์ธ๊ฐ€ → ๊ทธ ํ–‰๋™์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€] ๋ฅผ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค.

 

 

์ฑ…์ž„ ํ• ๋‹น์„ ์œ„ํ•œ GRASP ํŒจํ„ด

 

GRASP (General Responsibility Assignment Software Pattern)์€ ์ฑ…์ž„์„ ํ• ๋‹นํ•  ๋–„ ์ง€์นจ์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ๋Š” ์›์น™๋“ค์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.

 

1๏ธโƒฃ Information Expert ํŒจํ„ด

๐Ÿ’ก ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•  ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

 

์˜ํ™” ์˜ˆ๋งค ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,

 

์˜ํ™”๋ฅผ ์˜ˆ๋งคํ•ด๋ผ ๋ผ๋Š” ์ฑ…์ž„์€ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์ ์ ˆํ• ๊นŒ? ๊ณ ๋ฏผํ•˜๊ณ  ์ฑ…์ž„์„ ๋ถ€์—ฌํ•œ๋‹ค.

 

์˜ํ™” ์ƒ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ํšŒ์ฐจ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๋Š” '์ƒ์˜' ๊ฐ์ฒด๊ฐ€ ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

์˜ํ™” ์˜ˆ๋งค๋ฅผ ์œ„ํ•ด ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋Š”๋ฐ,  ์˜ํ™” ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•˜๋ผ ๋ผ๋Š” ์ฑ…์ž„์€ ๋˜ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์ ์ ˆํ• ๊นŒ? ๊ณ ๋ฏผํ•˜๊ณ  ์ฑ…์ž„์„ ๋ถ€์—ฌํ•œ๋‹ค.

 

์˜ํ™” ๊ฐ€๊ฒฉ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” '์˜ํ™”' ๊ฐ์ฒด๊ฐ€ ์˜ํ™”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

์ด์ฒ˜๋Ÿผ, ์–ด๋–ค ์ฑ…์ž„์„ ์ •ํ•˜๊ณ , ๊ทธ ์ฑ…์ž„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์•Œ๊ณ  ์žˆ์–ด์„œ ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์ฑ…์ž„์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

2๏ธโƒฃ Low Coupling ํŒจํ„ด

 ๐Ÿ’ก ์„ค๊ณ„์˜ ์ „์ฒด์ ์ธ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๊ฒŒ ์œ ์ง€๋˜๋„๋ก ์ฑ…์ž„์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

 

'์ƒ์˜' ์€ '์˜ํ™”' ๋ฅผ ์•Œ๊ณ  ์žˆ๊ณ  '์˜ํ™”' ๋Š” 'ํ• ์ธ์กฐ๊ฑด' ์„ ์•Œ๊ณ ์žˆ๋‹ค.

 

์ด๋•Œ, '์ƒ์˜' ์ด '์˜ํ™”' ์—๊ฒŒ [์˜ํ™” ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•ด๋ผ] ๋ผ๋Š” ์ฑ…์ž„์„ ์š”์ฒญํ•˜๋ฉด, '์˜ํ™”' ๋Š” 'ํ• ์ธ์กฐ๊ฑด' ๊ณผ ํ˜‘๋ ฅํ•˜์—ฌ ํ• ์ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•œ ๋’ค ์‘๋‹ตํ•œ๋‹ค.

 

'์ƒ์˜' ์ด 'ํ• ์ธ์กฐ๊ฑด' ๊ณผ ์ง์ ‘ ํ˜‘๋ ฅํ•˜์—ฌ ํ• ์ธ ์ •๋ณด๋ฅผ ๊ตฌํ•œ ๋’ค, '์˜ํ™”' ์—๊ฒŒ ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•˜๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ

 

์ด ๊ฒฝ์šฐ, '์ƒ์˜'๊ณผ 'ํ• ์ธ์กฐ๊ฑด' ์˜ ๊ฒฐํ•ฉ ๊ด€๊ณ„๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ, ์ด๋ฏธ '์˜ํ™”' ์™€ 'ํ• ์ธ์กฐ๊ฑด' ์€ ๊ฒฐํ•ฉ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐํ•ฉ ๊ด€๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์ง€ํ–ฅํ•˜๋ฉด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

 

3๏ธโƒฃ High Cohesion ํŒจํ„ด

๐Ÿ’ก ๋†’์€ ์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฑ…์ž„์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

 

 '์ƒ์˜'๊ณผ 'ํ• ์ธ์กฐ๊ฑด' ์ด ํ˜‘๋ ฅํ•˜๊ณ  ์žˆ๋Š” ๊ด€๊ณ„๋ผ๋ฉด

 

'ํ• ์ธ์กฐ๊ฑด' ์— ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ '์˜ํ™”' ์™€ '์ƒ์˜' ๋‘˜ ๋‹ค ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

 

4๏ธโƒฃ Creator ํŒจํ„ด

์˜ํ™” ์˜ˆ๋งค ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ

 

์ตœ์ข…์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ฐ์ฒด๋Š” ์˜ˆ๋งค ์ •๋ณด๋ฅผ ๋‹ด์€ '์˜ˆ๋งค' ๊ฐ์ฒด์ด๋‹ค.

 

'์˜ˆ๋งค' ๊ฐ์ฒด๋ฅผ ๊ฐ€์žฅ ์ž˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด(์ฐฝ์กฐ์ž)๋ฅผ ์ฐพ๊ณ  ๊ทธ ๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

'์˜ํ™”' ๊ฐ€ '์˜ˆ๋งค' ๊ฐ์ฒด๋ฅผ ๊ฐ€์žฅ ์ž˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

'์˜ํ™”' ๋Š” ์ƒ์˜ ์ •๋ณด๊ฐ€ ์ „ํ˜€ ์—†๋‹ค.

 

'ํ• ์ธ์กฐ๊ฑด' ์˜ ๊ฒฝ์šฐ๋Š” ์˜ํ™” ์ •๋ณด๋„ ๋ชจ๋ฅด๊ณ  ์ƒ์˜ ์ •๋ณด๋„ ๋ชจ๋ฅธ๋‹ค.

 

ํ•˜์ง€๋งŒ, '์ƒ์˜' ์€ ์ƒ์˜ ์ •๋ณด์™€ ์˜ํ™” ์ •๋ณด ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ฒฉ์— ๋Œ€ํ•œ ์ •๋ณด๊นŒ์ง€ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ '์˜ˆ๋งค' ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ์ฒด์ด๋‹ค.

 

 

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ์›์น™์„ ์œ ๋…ํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

 

1๏ธโƒฃ ์˜ํ™”๋ฅผ '์˜ˆ๋งค' ํ•ด๋ผ. '์˜ˆ๋งค' ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ผ๊นŒ?

creator ํŒจํ„ด์œผ๋กœ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ์ƒ์˜ ์‹œ๊ฐ„, ์˜ํ™” ์ •๋ณด, ๊ฐ€๊ฒฉ ๋“ฑ์„ ๋‹ค ์•Œ ์ˆ˜ ์žˆ๋Š” '์ƒ์˜' ๊ฐ์ฒด๊ฐ€ ์ด ์ฑ…์ž„์„ ๋งก๋Š” ๊ฒƒ์ด ํ•ฉ๋‹นํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋ฉด, '์ƒ์˜' ํด๋ž˜์Šค๋Š” ์˜ˆ๋งคํ•ด๋ผ ๋ผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ '์˜ˆ๋งค' ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค.
public class Screening {
    public Reservation reserve(Customer customer, int audienceCount) {

    }
}

 

2๏ธโƒฃ ์ฑ…์ž„์„ ๋ถ€์—ฌํ–ˆ์œผ๋ฏ€๋กœ, ๊ทธ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค.

์ƒ์˜ ์‹œ๊ฐ„๊ณผ ํšŒ์ฐจ, ๊ทธ๋ฆฌ๊ณ  ์˜ํ™” ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ์˜ˆ๋งค ์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
public class Screening {

    private Movie movie;
    private int sequence;
    private LocalDateTime whenScreened; 
    
    public Reservation reserve(Customer customer, int audienceCount) {

    }
}

 

3๏ธโƒฃ ์˜ˆ๋งค๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์˜ํ™” ๊ฐ€๊ฒฉ์„ ์•Œ์•„์•ผํ•œ๋‹ค.

์˜ํ™” ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•ด๋ผ ๋ผ๋Š” ์ƒˆ๋กœ์šด ์ฑ…์ž„์ด ์ƒ๊ฒผ๋‹ค.

์ด ์ฑ…์ž„๋„ '์ƒ์˜' ์ด ๋งก๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

'์ƒ์˜' ์ด '์˜ํ™”' ๊ฐ์ฒด ์•ˆ์— ์žˆ๋Š” ๊ฐ€๊ฒฉ์„ ๋‹ค๋ฃจ๊ธฐ ๋ณด๋‹ค๋Š”

'์˜ํ™”' ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๊ฐ์ฒด์˜ ์ž์œจ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํŒ๋‹จ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

ํ˜น์‹œ๋‚˜, ์ƒ์˜ ์‹œ๊ฐ„์ด๋ผ๋˜์ง€ ์ƒ์˜ ํšŒ์ฐจ์— ๋”ฐ๋ผ ํ• ์ธ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ 

'์˜ํ™”' ์—๊ฒŒ ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•˜๋ผ๊ณ  ์š”์ฒญํ•  ๋•Œ, '์ƒ์˜' ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜๊ณ  ์˜ˆ๋งค ์ธ์›์ˆ˜๋„ ์ „๋‹ฌํ•ด์ค€๋‹ค.
public class Screening {

    private Movie movie;
    private int sequence;
    private LocalDateTime whenScreened;
    
    public Reservation reserve(Customer customer, int audienceCount) {
        return new Reservation(customer, this, calculateFee(audienceCount), audienceCount);
    }

    private Money calculateFee(int audienceCount) {
        return movie.calculateFee(this).times(audienceCount);
    }
}

 

public class Movie {
    public Money calculateMovieFee(Screening screening) {

    }
}

 

5๏ธโƒฃ ์ด์ œ '์˜ํ™”'๋Š” ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•˜๋ผ๋Š” ์ฑ…์ž„์„ ํ• ๋‹น๋ฐ›์•˜์œผ๋ฏ€๋กœ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ–‰๋™์„ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค.

๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•˜๋ผ ๋ผ๋Š” ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค.

'์˜ํ™”'๋Š” 'ํ• ์ธ์กฐ๊ฑด'์„ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•˜๊ณ  ๊ธฐ๋ณธ ๊ฐ€๊ฒฉ์„ ์•Œ๊ณ ์žˆ์–ด์•ผํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์˜ํ™”๊ฐ€ ์–ด๋–ค ํ• ์ธ ์ •์ฑ…์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„์•ผํ•œ๋‹ค.
public class Movie {
    private String title;
    private Duration runningTime;
    private Money fee;
    private List<DiscountCondition> discountConditions;

    private MovieType movieType;
    private Money discountAmount;
    private double discountPercent;
    
    public Money calculateMovieFee(Screening screening) {
        if (isDisCountable(screening)) {
            return fee.minus(calculateDiscountAmount());
        }

        return fee;
    }

    private boolean isDisCountable(Screening screening) {
        return discountConditions.stream()
                .anyMatch(condition -> condition.isSatisfiedBy(screening));
    }
    
    private Money calculateDiscountAmount(){
    	// ํ•ด๋‹น ์˜ํ™”์˜ ํ• ์ธ ์ •์ฑ… (movieType)์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ํ• ์ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ„์‚ฐํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.
    }
    
    
}

 

 

6๏ธโƒฃ ์ƒ์˜ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ์ƒ์˜ ์ •๋ณด๊ฐ€ ํ• ์ธ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š”์ง€ isSatisfiedBy ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•œ๋‹ค.
public class DiscountCondition {
    private DiscountConditionType type;
    private int sequence;
    private DayOfWeek dayOfWeek;
    private LocalTime startTime;
    private LocalTime endTime;

    public boolean isSatisfiedBy(Screening screening) {
        // ์˜ํ™” ํ• ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€ ํšŒ์ฐจ๋ฉด screening ์˜ ํšŒ์ฐจ ํ™•์ธ
        // ํ• ์ธ ์กฐ๊ฑด ๊ฐ€์ง„ sequence์™€ ๋น„๊ต
        
        // ์˜ํ™” ํ• ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€ ์‹œ๊ฐ„๋Œ€๋ฉด screening์˜ ์‹œ์ž‘ ์‹œ๊ฐ„ ํ™•์ธ
        // ํ• ์ธ ์กฐ๊ฑด์ด ๊ฐ€์ง„ startTime์™€ endTime๊ณผ ๋น„๊ต
    }
    
}

 

๐Ÿšจ ์—ฌ๊ธฐ์„œ ์„ค๊ณ„๋ฅผ ์ž˜ํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‚ดํŽด๋ณด๋ฉด ๋ฌธ์ œ์ ์ด ๋ณด์ธ๋‹ค.

 

๋งŒ์•ฝ, DiscountCondition์˜ ํ• ์ธ ์กฐ๊ฑด๊ณผ ๊ด€๋ จ๋œ ํšŒ์ฐจ ๊ธฐ์ค€์ด ๋ฐ”๋€Œ๋ฉด, isSatisfiedBy ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ• ์ธ ์กฐ๊ฑด๊ณผ ๊ด€๋ จ๋œ ์ƒ์˜ ์‹œ์ž‘๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„ ๊ธฐ์ค€์ด ๋ฐ”๋€Œ์–ด๋„ isSatisfiedBy ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

๋‹ค์‹œ ๋งํ•˜๋ฉด, isSatisfiedBy ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ์‹œ์ ์ด ํ•œ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

 

๋”ฐ๋ผ์„œ, ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ํšŒ์ฐจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ• ์ธ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ํด๋ž˜์Šค์™€ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ํ• ์ธ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ ํด๋ž˜์Šค์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋”ฐ๋ผ์„œ, ํ• ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋Š” isSatisfiedBy ๋ฉ”์„œ๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ ์ •์˜ํ•˜๊ณ 

 

๊ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํšŒ์ฐจ๊ธฐ์ค€ ํ• ์ธ ์กฐ๊ฑด ํด๋ž˜์Šค์™€ ์ƒ์˜ ์‹œ๊ฐ„ ๊ธฐ์ค€ ํ• ์ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

 

disCountCondition ํด๋ž˜์Šค๋Š” ์‚ฌ์‹ค ๊ธฐ๊ฐ„์„ ๋น„๊ตํ•˜๋Š” ์ฑ…์ž„ 1๊ฐœ์™€ ํšŒ์ฐจ๋ฅผ ๋น„๊ตํ•˜๋Š” ์ฑ…์ž„ 1๊ฐœ๋ฅผ ๊ฐ๊ฐ ๊ฐ–๊ณ  ์žˆ๋˜ ์…ˆ์ด์—ˆ๋‹ค.

 

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

 

discountCondition์€ sequence๋„ ๊ฐ–๊ณ  startTime๋„ ๊ฐ–์ง€๋งŒ, isSatisfiedByPeriod() ๋ฉ”์„œ๋“œ์—์„œ๋Š” sequence๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ 

 

isSatisfiedBySequence() ๋ฉ”์„œ๋“œ์—์„œ๋Š” startTime์™€ endTime์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

 

๋”ฐ๋ผ์„œ, ์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ ์‹œ์ผœ์ฃผ๋ฉด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ–๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ์—์„œ, ํšŒ์ฐจ๋‚˜ ์‹œ๊ฐ„์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํ• ์ธ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜์–ด๋„ discountCondition ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์„œ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

 

Movie ํด๋ž˜์Šค ์—ญ์‹œ, discountAmount์™€ discountPercent ๊ณผ ๊ฐ™์€ ๊ตฌ์ฒด์ ์ธ ํ• ์ธ ๊ณ„์‚ฐ ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๋ จ๋œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ, ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ํ• ์ธ๊ฐ€๋ฅผ ๊ตฌํ•ด๋ผ ๋ผ๋Š” ์—ญํ• ๋กœ ์ถ”์ƒํ™”์‹œ์ผœ ๋ถ„๋ฆฌํ•˜๊ณ 

 

๊ตฌ์ฒด์ ์ธ ํ• ์ธ๊ฐ€ ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์€ ์ฑ…์ž„์œผ๋กœ์„œ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ๋” ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

    '๊ฐœ๋ฐœ์„œ์ /์˜ค๋ธŒ์ ํŠธ - ์กฐ์˜ํ˜ธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • Chapter 7. ๊ฐ์ฒด ๋ถ„ํ•ด
    • Chapter 6. ๋ฉ”์‹œ์ง€์™€ ์ธํ„ฐํŽ˜์ด์Šค
    • Chapter 4. ์„ค๊ณ„ ํ’ˆ์งˆ๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
    • Chapter 3. ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ
    ์šฐ๊ทœ์ด์ธ์šฐ์œค
    ์šฐ๊ทœ์ด์ธ์šฐ์œค
    ๊ฐœ๋ฐœ์ž ๊ฟˆ๋‚˜๋ฌด

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”