๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์Šคํ„ฐ๋””/์˜ค๋ธŒ์ ํŠธ

[์˜ค๋ธŒ์ ํŠธ] 5์žฅ '์ฑ…์ž„ ํ• ๋‹นํ•˜๊ธฐ'

by moon101 2022. 11. 11.

 

 

5์žฅ์€ GRASP ์ฑ…์ž„ํ• ๋‹นํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ณ ,

์ฑ…์ž„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์บก์Šํ™”, ์‘์ง‘๋„, ๊ฒฐํ•ฉ๋„ ๊ด€์ ์—์„œ ์„ค๊ณ„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

 

 

๊ฐ์ฒด ๋””์ž์ธ์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฒƒ ์ค‘์˜ ํ•˜๋‚˜๋Š” ์ฑ…์ž„์„ ์–ด๋””์— ๋‘˜ ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‚˜๋Š” ์‹ญ๋…„ ์ด์ƒ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์ผํ–ˆ์ง€๋งŒ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์—ฌ์ „ํžˆ ์ ๋‹นํ•œ ์œ„์น˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค. ๋Š˜ ์ด๋Ÿฐ ์ ์ด ๋‚˜๋ฅผ ๊ดด๋กญํ˜”์ง€๋งŒ, ์ด์ œ๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ๋ฆฌํŒฉํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค [Fowler 1999a](p.166).

 

 

GRASP

"General Responsibility Assignment Software Pattern

(์ผ๋ฐ˜์ ์ธ ์ฑ…์ž„ ํ• ๋‹น์„ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ„ด)"

 

 

INFORMATION EXPERT(์ •๋ณด ์ „๋ฌธ๊ฐ€) ํŒจํ„ด

- ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•  ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„ ํ• ๋‹น

- ์ฃผ์˜ํ•  ์ ์€ ์ •๋ณด๋Š” ๋ฐ์ดํ„ฐ์™€ ๋‹ค๋ฅด๋‹ค. ์ฆ‰, ์ •๋ณด ์ „๋ฌธ๊ฐ€๋Š” ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๊ทธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์„ ํ•„์š”๋Š” ์—†๋‹ค. 

 

CREATOR(์ฐฝ์กฐ์ž) ํŒจํ„ด

- ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ฑ…์ž„์„ ์–ด๋–ค ๊ฐ์ฒด์—๊ฒŒ ํ• ๋‹นํ• ์ง€์— ๋Œ€ํ•œ ์ง€์นจ ์ œ๊ณต

- ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ํ™” ์˜ˆ๋งค ํ˜‘๋ ฅ์˜ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์€ Reservation ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ธ๋ฐ Reservation์„ ์ž˜ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜, ๊ธด๋ฐ€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ดˆ๊ธฐํ™”์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ธ๊ฐ€? ์™€ ๊ฐ™์€ ์งˆ๋ฌธ์„ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ฑ…์ž„์„ ํ• ๋‹นํ•œ๋‹ค. 

 

POLYMORPHISM(๋‹คํ˜•์„ฑ) ํŒจํ„ด

- ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๋กœ์ง์ด ์žˆ์„ ๋•Œ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ๊ฐ ํƒ€์ž…์— ๋‹คํ˜•์ ์œผ๋กœ ํ–‰๋™ํ•˜๋Š” ์ฑ…์ž„ ํ• ๋‹น

- ํด๋ž˜์Šค ๋ถ„ํ•ด -> ์ฑ…์ž„ ๋ถ„์‚ฐ

 

PROTECTED VARIATIONS(๋ณ€๊ฒฝ ๋ณดํ˜ธ) ํŒจํ„ด

- ๋ณ€ํ™”๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๋ถˆ์•ˆ์ •ํ•œ ์ง€์ ๋“ค์„ ์‹๋ณ„ํ•˜๊ณ  ๊ทธ ์ฃผ์œ„์— ์•ˆ์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜•์„ฑํ•˜๋„๋ก ์ฑ…์ž„ ํ• ๋‹น 

- ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ์„ ์บก์Šํ™”

 

 

 

์„ค๊ณ„๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋‚ฎ์€ ์‘์ง‘๋„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ์˜ ์ด์œ ์— ๋”ฐ๋ผ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. 

์™œ๋ƒํ•˜๋ฉด ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

๊ทธ๋Ÿผ ๋ณ€๊ฒฝ์˜ ์ด์œ ๋Š” ์–ด๋–ป๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

์ฒซ๋ฒˆ์งธ๋กœ๋Š”, ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ์‹œ์ ์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. 

์‘์ง‘๋„๊ฐ€ ๋†’์€ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋“  ์†์„ฑ์„ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

-> ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”๋˜๋Š” ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ ๋ถ„๋ฆฌ

 

๋‘ ๋ฒˆ์งธ๋กœ๋Š”, ๋ฉ”์„œ๋“œ๋“ค์ด ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. 

๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํด๋ž˜์Šค์˜ ์‘์ง‘๋„๋Š” ๋†’๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค 

->  ์†์„ฑ ๊ทธ๋ฃน๊ณผ ํ•ด๋‹น ๊ทธ๋ฃน์— ์ ‘๊ทผํ•˜๋Š” ๋ฉ”์„œ๋“œ ๊ทธ๋ฃน์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ ๋ถ„๋ฆฌ

 

 

 

 

4์žฅ๊นŒ์ง€ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋ฉด์„œ ๋งŽ์ด ์ดํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋งค๋ฒˆ ์ƒˆ๋กญ๋‹ค. 

์ฑ…์ž„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์™€ ๋†’์€ ์‘์ง‘๋„๋ฅผ ๊ณ ๋ คํ•˜๊ณ ,

๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์บก์Šํ™”ํ•˜์—ฌ ๋ณ€๊ฒฝ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ.

๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๋‚ด๊ฐ€ ๊ณ„์† ๊ณ ๋ฏผํ•ด ๋ณด๊ณ  ์ถ”๊ตฌํ•ด์•ผ ํ•˜๋Š” ๋ฐฉํ–ฅ์ด๋‹ค.

๊ฐœ๋…์€ ๊ณ„์† ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณต๋ถ€ํ•˜๋‹ˆ๊นŒ ์ด์ œ ์ž˜ ์ดํ•ด๊ฐ€ ๋˜๋Š”๋ฐ 

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

 

 

๋จผ์ € ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•œ ๋‹ค์Œ์— ์ฑ…์ž„์„ ์ด๋™์‹œํ‚ค๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด ๋ณด๋Š” ๊ฑฐ๋‹ค. 

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ์— ๋ฆฌํŒฉํ„ฐ๋งํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. 

 

 


 

 

 

์ž๋ฐ” ๋ฌธ๋ฒ•(์ž๋ฐ”์˜ ์ •์„ ์ฑ•ํ„ฐ 14 ์ฐธ๊ณ )

 

๋žŒ๋‹ค์™€ Stream

Stream์€

  • ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ์ •์˜ํ•ด ๋†“์Œ
  • ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ
  • ์ผํšŒ์šฉ์ž„
  • ์ž‘์—…์„ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์œผ๋กœ ์ฒ˜๋ฆฌ(๋ฐ˜๋ณต๋ฌธ์„ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์ˆจ๊น€)
  • ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ
    • ์ค‘๊ฐ„์—ฐ์‚ฐ/์ตœ์ข…์—ฐ์‚ฐ์œผ๋กœ ๋ถ„๋ฅ˜
private boolean checkSequenceConditions(Screening screening) {
	return sequenceConditions.stream()
    			.anyMatch(condition -> condition.isSatisfiedBy(Screening));
}

sequenceConditions๋Š” List <>์ธ๋ฐ ์ด ๊ฐ’์„ ๋ฐ›์•„์„œ stream์˜ ์ตœ์ข…์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜์ธ boolean anyMatch (Predicate <T> p)๋ฅผ ํ™œ์šฉํ•ด isSatisfiedBy ์กฐ๊ฑด์„ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•จ.

 

 


// TODO 

๋žŒ๋‹ค/์ŠคํŠธ๋ฆผ ๋‹ค์‹œ ๊ณต๋ถ€. 

Predicate <T>๋Š” ๋ญ˜๊นŒ..?

 

๋žŒ๋‹ค์™€ ์ŠคํŠธ๋ฆผ ์ •๋ฆฌํ•œ ๋‚ด์šฉ

 

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://docs.oracle.com/javase/tutorial/extra/generics/morefun.html

https://stackoverflow.com/questions/2827585/what-is-super-t-syntax

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

๋Œ“๊ธ€