364
๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด Copyright ยฉ 2009 Nextree Soft, All rights reserved Korea Software Technology Association ์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„ ๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด (GoF & POSA) ๊ธฐ๊ฐ„: 2009.02.23 ~ 2009.02.27 ๊ฐ•์‚ฌ๋ช… : ์ดํฌ๋‘

(GoF & POSA) - Tistory

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

Korea

Software

Technology

Association

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

(GoF & POSA)

๊ธฐ๊ฐ„: 2009.02.23 ~ 2009.02.27

๊ฐ•์‚ฌ๋ช… : ์ดํฌ๋‘

Page 2: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ณผ์ • ๊ฐœ์š”

๊ต์œก ๋ชฉํ‘œ

๋†’์€ ์ˆ˜์ค€์˜ ์„ค๊ณ„ ์—ญ๋Ÿ‰ ํ™•๋ณด

๋Œ€ํ‘œ์ ์ธ ๋‘ ๊ฐ€์ง€ ํŒจํ„ด(GoF, POSA) ์ˆ™๋‹ฌ

์‹ค๋ฌด ์˜ˆ์ œ๋ฅผ ํ†ตํ•œ ์„ค๊ณ„ ์—ญ๋Ÿ‰์˜ ๋‚ด์ œํ™”

์•„ํ‚คํ…ํŠธ๋กœ์„œ์˜ ๊ธฐ๋ณธ ์ž์งˆ ํ™•๋ณด

๊ต์œก ํŠน์ง•

๊ฐ•์˜์™€ ์‹ค์Šต์„ ๋ณ‘ํ–‰ํ•˜์—ฌ ์ˆ˜๊ฐ•์ƒ์˜ ๋ช…ํ™•ํ•œ ์ดํ•ด๋ฅผ ๋„๋ชจํ•จ

์ˆ™๋‹ฌ ๋ฐ ๊นŠ์€ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์‹ค์Šต ์ˆ˜ํ–‰

ํ˜„์žฅ ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ๊ฐ•์‚ฌ์ง„์œผ๋กœ ๊ตฌ์„ฑ

์ถฉ๋ถ„ํ•œ ํ† ์˜๋ฅผ ํ†ตํ•œ ์ง€์‹ ๋ฐ ๊ฒฝํ—˜ ๊ณต์œ 

- 2 -

Page 3: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

- 3 -

๊ต์œก ์ผ์ •ํ‘œ

1์ผ์ฐจ

(์›”์š”์ผ)ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ

2์›” 23์ผ 2์›” 24์ผ 2์›” 25์ผ 2์›” 26์ผ 2์›” 27์ผ

ํŒจํ„ด ๊ฐœ์š” GoF ํŒจํ„ด โ… 

- Creational Patterns

- Structural Patterns

GoF ํŒจํ„ด โ…ก

- Behavioral Patterns

๋ณตํ•ฉํŒจํ„ด

- Role Object

- AOM

POSAํŒจํ„ด

- Basic Patterns

Page 4: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

1. ํŒจํ„ด ๊ฐœ์š”

1.1 ๊ฐ์ฒด-์ง€ํ–ฅ ๊ฐœ๋…

1.2 ๊ฐ์ฒด-์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™

1.3 ๋””์ž์ธ ํŒจํ„ด ์ •์˜

1.4 ๋””์ž์ธ ํŒจํ„ด ๋ถ„๋ฅ˜

1.5 ๋””์ž์ธ ํŒจํ„ด ์‚ฌ๋ก€์—ฐ๊ตฌ

- 4 -

Page 5: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

1.1 ๊ฐ์ฒด-์ง€ํ–ฅ ๊ฐœ๋…

๊ฐ์ฒด-์ง€ํ–ฅ ์ •์˜

ํŒจ๋Ÿฌ๋‹ค์ž„ ์ฐจ์ด(gap)

๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ์ˆ ์˜ ์žฅ์ 

๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค

์ถ”์ƒํ™” (Abstraction)

์บก์Šํ™” (Encapsulation)

๋ชจ๋“ˆํ™” (Modularity)

๊ณ„์ธตํ™” (Hierarchy)

๋‹คํ˜•์„ฑ (Polymorphism)

- 5 -

Page 6: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

6

๊ฐ์ฒด-์ง€ํ–ฅ(Object-Oriented) ์ •์˜(1/2)

๊ฐ์ฒด (Object)

๋ฌผ๋ฆฌ์ ์ธ ๊ฐœ์ฒด

๊ฐœ๋…์ ์ธ ๊ฐœ์ฒด

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์ฒด

์ง€ํ–ฅ (Oriented)

๊ฐ์ฒด ์ค‘์‹ฌ

๊ธฐ๋ณธ ์„ค๊ณ„ ๋‹จ์œ„๋ฅผ ๊ฐ์ฒด๋กœ ํ•จ

์‹ค์„ธ๊ณ„ ๋งคํ•‘

์‹ค์„ธ๊ณ„ ๋ชจ๋ฐฉ

์‹ค์„ธ๊ณ„(real world)๋Š” ๊ณง ๊ฐ์ฒด-์ง€ํ–ฅ ์„ธ๊ณ„

O-O์˜ ๊ทผ๋ณธ ์ทจ์ง€๋Š” ์‹ค์„ธ๊ณ„์˜ ์ธ๊ฐ„์˜ ํ–‰๋™ ์–‘์‹์„ ๋ชจ๋ธ๋ง ์„ธ๊ณ„์—๋„ ์ ์šฉํ•จ์œผ๋กœ์จ ์ถ”์ƒ์ ์ด๊ณ  ๊ฐœ๋…์ ์ธ ๋ชจ๋ธ๋ง ์„ธ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•จ

Page 7: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ฐ์ฒด-์ง€ํ–ฅ(Object-Oriented) ์ •์˜(2/2)

๊ฐ์ฒด-์ง€ํ–ฅ์— ๋‚ดํฌํ•œ ๋‹ค๋ฅธ ์˜๋ฏธ

์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฐœ์ฒด๋Š” ๊ณ ์œ ์˜ Identity๋ฅผ ๊ฐ€์ง„๋‹ค.

๋ชจ๋“  ๊ฐœ์ฒด๋Š” ์กด์žฌ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค.

์กด์žฌ ๊ฐ€์น˜๋Š” ์ž์‹ ์˜ ์ฃผ์–ด์ง„ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฆ‰, ์—ญํ• ์ˆ˜ํ–‰์„ ํ†ตํ•ด ์ฆ๋ช…๋œ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ์ฒด๋Š” ์ฑ…์ž„์ด ๋„ˆ๋ฌด ํฌ๋ฉด ๋ถˆํ‰์„ ํ•œ๋‹ค.

๋ถˆํ‰์ด ์žˆ์„ ๊ฒฝ์šฐ, ์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฑ…์ž„ ์กฐ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด-์ง€ํ–ฅ ์„ธ๊ณ„์—์„œ,

๋ชจ๋“  ๊ฐœ์ฒด๋Š” ์ž์‹ ์˜ ์กด์žฌ๋ฅผ ์ฆ๋ช…ํ•  ์ •๋„์˜ ์ฑ…์ž„์„ ๊ฐ€์ง„๋‹ค.

๊ณ ์œ ์˜ Identity๊ฐ€ ์žˆ๋“ฏ์ด ๊ณ ์œ ์˜ ์ฑ…์ž„์ด ์กด์žฌํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ „๋ฌธ๊ฐ€ ๊ฐœ์ฒด๋กœ ์ธ์‹๋œ๋‹ค.

๊ฐœ์ฒด์— ์ ์ ˆํ•œ ์ฑ…์ž„์„ ๋ถ€์—ฌํ•˜๊ณ , ๊ฐ ๊ฐœ์ฒด ๊ฐ„์— ์ž‘์—…์„ ์กฐ์ •ํ•จ์œผ๋กœ์จ ์ผ์ด ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋˜๋„๋ก ํ•œ๋‹ค.

๊ฐœ์ฒด์—๊ฒŒ ๋‹ค์Œ์˜ ์งˆ๋ฌธ์„ ํ–ˆ์„ ๋•Œ, โ€œYesโ€์—ฌ์•ผ ํ•œ๋‹ค.

์ž์‹ ์˜ ์—ญํ• ์— ๋งŒ์กฑํ•˜๋‚˜์š”?

์ž์‹ ์˜ ์ฑ…์ž„์ด ์ ์ ˆํ•œ๊ฐ€์š”?

๋ˆ„๊ตฌ์™€ ํ•จ๊ป˜ ์ผ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ๋‚˜์š”?

- 7 -

Page 8: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

8

ํŒจ๋Ÿฌ๋‹ค์ž„ ์ฐจ์ด(gap)

๋…ธ์ด๋งŒ ๋กœ์ง๊ณผ ์‹ค์„ธ๊ณ„

์‚ฌ๋žŒ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ง„์ •ํ•œ ํž˜์€ ์–ด๋””์— ์žˆ๋Š”๊ฐ€?

์‚ฌ๋žŒ์ด ์‚ฌ๋žŒ๋‹ต๊ฒŒ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€?

์‹ค์„ธ๊ณ„ ์™œ๊ณก๊ณผ ์‹ค์„ธ๊ณ„ ๋งคํ•‘

CPU

์ผ ์ผ์ผ ์ผ

์ผ ์ผ ์ผ ์ผ ์ผ ์ผ ์ผ ์ผ

Brain

์ผ

์ผ

์ผ

์ผ ์ผ ์ผ

์ผ ์ผ ์ผ

์ผ ์ผ ์ผ์ผ ์ผ์ผ

Page 9: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

9

๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ์ˆ ์˜ ์žฅ์ 

๋‹จ์ผ ํŒจ๋Ÿฌ๋‹ค์ž„

๋ถ„์„ ํด๋ž˜์Šค(Employee)๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค(Employee.java)๊นŒ์ง€ ์ƒ์กดํ•จ

์ฆ‰, ์‹œ์Šคํ…œ ๋ถ„์„์—์„œ ๊ตฌํ˜„์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋‹จ์ผ ๊ฐœ๋…(๊ฐ์ฒด)์„ ์‚ฌ์šฉํ•จ

์ถ”์ƒํ™”์˜ ํž˜

๋‹ค์–‘ํ•œ ๊ฐœ์ฒด๋ฅผ ํ•จ๊ป˜, ๋˜๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ

์žฌ์‚ฌ์šฉ์„ฑ

์ฝ”๋“œ๋‹จ์œ„ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•จ

์‰ฝ๊ณ  ์ •ํ™•ํ•œ ๋ชจ๋ธ

์‹ค์„ธ๊ณ„๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Œ

์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ์‹ค์„ธ๊ณ„์˜ ์‚ฌ๊ณ ๋ฅผ ๋ชจ๋ธ๋ง ์„ธ๊ณ„๋กœ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€๋ฉด ๋จ

์ •๋ณด์€ํ๋ฅผ ํ†ตํ•œ ์•ˆ์ •์„ฑ

์‹œ์Šคํ…œ์˜ ํŠน์ • ๊ฐ์ฒด์˜ ๋ณ€ํ™”๋Š” ๊ทธ ๊ฐ์ฒด ์•ˆ์—์„œ๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นจ

๊ฐ์ฒด ์Šค์Šค๋กœ ์ž์‹ ์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

๋‹คํ˜•์„ฑ์„ ํ†ตํ•œ ๋ณ€ํ™” ์ ์‘์„ฑ

๋ณ€๊ฒฝ ๋ฐ ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ์— ์‰ฝ๊ณ  ๋นจ๋ฆฌ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์Œ

Page 10: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ์ˆ ์˜ ์žฅ์ 

๋‹จ์ผ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์˜์‚ฌ์†Œํ†ต์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ

- 10 -http://www.agiledeveloper.com/blog/content/binary/3260585819-project_management.jpg10

Page 11: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

11

๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค

์ถ”์ƒํ™” (Abstraction)

์บก์Šํ™” (Encapsulation)

๋ชจ๋“ˆํ™” (Modularity)

๊ณ„์ธตํ™” (Hierarchy)

๋‹คํ˜•์„ฑ (Polymorphism)

Page 12: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

12

์ถ”์ƒํ™” (Abstraction) (1/2)

๊ตญ์–ด ์‚ฌ์ „

์‚ฌ๋ฌผ์ด๋‚˜ ๋Œ€์ƒ์œผ๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ์„ฑ์งˆ์ด๋‚˜ ๊ณตํ†ต์„ฑ์ด๋‚˜ ๋ณธ์งˆ์„ ์ถ”์ถœํ•˜์—ฌ ํŒŒ์•…ํ•˜๋Š” ์‚ฌ๊ณ  ์ž‘์šฉ

๊ฐ€์„ ์„œ๋ฆฌ(???)

์ผ๋ฐ˜์ ์ธ ์˜๋ฏธ

ํ•œ ๊ฐœ์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋กœ๋ถ€ํ„ฐ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์„ ์ถ”์ถœํ•˜๋Š” ํ–‰์œ„

Page 13: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ถ”์ƒํ™”(abstraction) (2/2)

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ก  โ€“ ์ถ”์ƒํ™”(from wikipedia)

์‹œ์Šคํ…œ ์•ˆ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•˜๊ณ , ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์˜์‚ฌ์†Œํ†ต ํ•˜๋Š” ์ถ”์ƒ์ ์ธ โ€œ์ž‘์—…์žโ€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜๊ฐ€ ์ถ”์ƒํ™”์ด๋‹ค.

์บก์Šํ™”๋Š” ์„ธ๋ถ€ ์ƒํƒœ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ๊ฐœ๋…์„ ํ–‰์œ„์™€ ์—ฐ๊ณ„ํ•˜๋„๋ก ํ™•์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋Š” ๋ฐฉ์‹์„ ํ‘œ์ค€ํ™” ํ•˜๋Š” ๊ฒƒ์ด ์ถ”์ƒํ™”(abstraction)์˜ ์ฒซ๊ฑธ์Œ์ด๋‹ค.

์ถ”์ƒํ™”๋ฅผ ์ •์˜๋œ ์˜คํผ๋ ˆ์ด์…˜์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด, ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ์ฒด๋“ค์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋‹คํ˜•์„ฑ(polymorphism)์ด๋‹ค.

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

- 13 -

Page 14: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

14

์บก์Šํ™”(Encapsulation=information hiding) (1/2)

๋ณต์žกํ•œ ๊ฒƒ์„ ์ˆจ๊ธด๋‹ค = ์ •๋ณด๋ฅผ ์ˆจ๊ธด๋‹ค.

๊ผญ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ์„ ์™ธ๋ถ€์— ๋…ธ์ถœํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด๋ถ€๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์œ ์ผํ•œ ํ†ต๋กœ์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•

๋‹จ์ˆœํ•จ

๋ณ€๊ฒฝ์ด ์—†์–ด์•ผ ํ•จ

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ์ •๋ณด์€ํ๋ฅผ ํ†ตํ•ด ์œ ์—ฐ์„ฑ์„ ํ™•๋ณด

๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

Page 15: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์บก์Šํ™”(Encapsulation=information hiding) (2/2)

์šฉ์–ด์ •์˜ (from wikipedia)

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

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

โ€œ๋””์ž์ธ ํŒจํ„ดโ€์˜ ์ €์ž๋“ค์€ ์ƒ์†๊ณผ ์บก์Šํ™” ๊ฐ„์˜ ๊ธด์žฅ์— ๋Œ€ํ•ด์„œ ๊ธธ๊ฒŒ ํ† ์˜ํ•˜๊ณ  ๋‚œ ํ›„, ๊ทธ๋“ค์˜ ๊ฒฝํ—˜์— ์˜ํ•˜๋ฉด ์„ค๊ณ„์ž๋“ค์ด ๋Œ€์ฒด๋กœ ์ƒ์†์„ ๋‚จ์šฉํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋‹ค. ์ƒ์†์˜ ์œ„ํ—˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•˜์˜€๋‹ค. โ€œ

์ƒ์†์€ ํ•˜์œ„ํด๋ž˜์Šค์—๊ฒŒ ๋ถ€๋ชจํด๋ž˜์Šค์˜ ์„ธ๋ถ€๊ตฌํ˜„์„ ๋…ธ์ถœํ•˜๋ฏ€๋กœ, ์ƒ์†์€ ์บก์Šํ™”๋ฅผ ๊นฌ๋‹ค๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค(GoF 1995:19)

- 15 -

Page 16: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

16

๋ชจ๋“ˆํ™”(Modularity) (1/2)

๋ณต์žกํ•œ ๊ฐœ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๋Š” ๊ฒƒ

๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ํ•„์ˆ˜์ ์ด๋‹ค.

๋ชจ๋“ˆ ๋‹จ์œ„์˜ ์žฌ์‚ฌ์šฉ์„ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค.

Page 17: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋ชจ๋“ˆํ™”(Modularity) (2/2)

์šฉ์–ด(from wikipedia)

๋ชจ๋“ˆ์€ ๋‹ค์–‘ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด๋‹ค ํฐ ์‹œ์Šคํ…œ์˜ ์ปดํฌ๋„ŒํŠธ(๋˜๋Š” ๋ถ€ํ’ˆ)์—ฌ์•ผ ํ•˜๊ณ , ๊ทธ ์‹œ์Šคํ…œ ์•ˆ์—์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ ์˜คํผ๋ ˆ์ด์…˜๊ณผ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

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

๋ชจ๋“ˆ๊ณผ ํด๋ž˜์Šค์˜ ์ฐจ์ด์ 

ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์ƒ์„ฑ์„ ์œ„ํ•ด ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ์™€ ํ–‰์œ„๋ฅผ ์ƒ์†ํ•œ๋‹ค.

๋‹คํ˜•์„ฑ์€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์‹คํ–‰ ์‹œ๊ฐ„์— ๋ณ€๊ฒฝํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

๋ชจ๋“ˆ ๊ฐ„์˜ ๊ด€๊ณ„๋Š” ์ •์ ์ด๋‹ค.

๋ชจ๋“ˆ๊ณผ ํด๋ž˜์Šค์˜ ์œ ์‚ฌ์ 

์„ธ๋ถ€ ๊ตฌํ˜„์€ ์™ธ๋ถ€(public) ๋ทฐ๋กœ๋ถ€ํ„ฐ ๊ฐ์ถ”๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๋‘˜ ๋‹ค ๊ณ„์ธต์„ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

- 17 -

Page 18: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

18

๊ณ„์ธต (Hierarchy)

๊ณ„์ธต์˜ ์œ„์ชฝ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ์ถ”์ƒํ™” ์ •๋„๊ฐ€ ์‹ฌํ•จ

๊ณ„์ธต์˜ ์œ„์ชฝ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ๋ถ„๋ฅ˜ ๊ธฐ์ค€ ์†์„ฑ์ด ์ค„์–ด ๋“ฌ

๊ณ„์ธต์˜ ์•„๋ž˜์ชฝ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ๊ตฌ์ฒด์ ์ธ ๊ฐœ์ฒด

๋”ฐ๋ผ์„œ ๊ณ„์ธต์ด ํ‘œํ˜„ํ•˜๋Š” ๊ฐœ๋…์€,

Generalization / Specialization

Level of abstraction

Aggragation/Composition ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑํ•˜๋Š” ๊ณ„์ธต๊ณผ๋Š” ๋‹ค๋ฆ„

๋™๋ฌผ

๋‚ ์ง์Šน ๋“ค์ง์Šน ํŒŒ์ถฉ๋ฅ˜

๋…์ˆ˜๋ฆฌ ๋น„๋‘˜๊ธฐ ์‚ฌ์ž ํ˜ธ๋ž‘์ด

Page 19: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

19

๋‹คํ˜•์„ฑ(Polymorphism) (1/2)

๋‹คํ˜•์„ฑ์€ ์ถ”์ƒํ™”์˜ ๊ฐœ๋…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.

๊ฐ„๋‹จํ•œ ๋ช…๋ น์œผ๋กœ ๋งŽ์€ ๊ฐœ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

๋ช…๋ น์ด ์ˆ˜ํ–‰๋˜๋Š” ์‹œ๊ฐ„์— ์–ด๋–ค ๊ฐœ์ฒด๊ฐ€ ๋ช…๋ น์„ ๋ฐ›์„ ๊ฒƒ์ธ์ง€ ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

์‹คํ–‰์‹œ๊ฐ„ ๋ฐ”์ธ๋”ฉ(Run time binding, Late binding)

๋ฆฌ๋ชจ์ฝ˜

Page 20: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋‹คํ˜•์„ฑ(Polymorphism) (2/2)

์šฉ์–ด ์ •์˜ (from wikipedia)

[๊ฐ„๋‹จ์ •์˜]๋‹คํ˜•์„ฑ์€ ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ

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

์ฐธ์—ฌํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ์‹œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํผ๋ธ”๋ฆญ ๋ฉ”์†Œ๋“œ์—ฌ์•ผ ํ•œ๋‹ค.

Overriding

์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ, overriding polymorphism ์ด๋ผ๊ณ  ํ•จ.

Overloading

๊ตฌํ˜„์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋„ˆ์ฒ˜๋ฅผ ์‚ฌ์šฉํ•จ, overloading polymorphism ์ด๋ผ๊ณ  ํ•จ. ์˜ˆ โ€œ+โ€ ์—ฐ์‚ฐ์ž.

- 20 -

Page 21: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

1.2 ๊ฐ์ฒด-์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™

๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ์ด์šฉํ•œ ์‹ค์„ธ๊ณ„ ๋งคํ•‘

Liskov Substitution Principle [LSP]**

Open/Closed Principle [OCP]**

Dependency of Inversion Principle [DIP]**

21

** http://javaboutique.internet.com/tutorials/JavaOO/LSP.html

Page 22: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ํ†ตํ•œ ์‹ค์„ธ๊ณ„ ๋งคํ•‘(1/2)

๊ด€๊ณ„ ์œ ํ˜•

Aggregation/Composition

Inheritance/Realization

Dependency

- 22 -

๊ธฐ๋ณธ์ฐจ์ฒด

ํŠœ๋‹์ฐจ์ฒด

์ž๋™์ฐจ

์ž๊ฐ€์šด์ ‚์ž

์—”์ง‚

๋ฐ”ํ€ด

์—”์ง‚์˜ค์ผ๊ฒŒ์ด์ง€

ํƒ€์ด์–ด

๊ต์ฒด

์—”์ง„์˜ค์ผ

์ฒดํฌ

Page 23: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ํ†ตํ•œ ์‹ค์„ธ๊ณ„ ๋งคํ•‘(2/2)

์ƒํ™ฉ(context)์— ๋”ฐ๋ผ ๊ด€๊ณ„ ์œ ํ˜•์ด ๋‹ฌ๋ผ์ง

๊ฐ•์‚ฌ์šฉPC์™€ ๊ฐ•์‚ฌ

์‹ค์Šต์šฉ๋…ธํŠธ๋ถ๊ณผ ์ˆ˜๊ฐ•์ƒ

- 23 -

ํ‰๊ฐ€์ ์ˆ˜

์ˆ˜๊ฐ•์ƒ

๊ฐ•์‚ฌ

๊ณผ๋ชฉ ์‹ค์Šต์šฉ๋…ธํŠธ๋ถ

๋น”ํ”„๋กœ์ ํ„ฐ

ํ™”์ดํŠธ๋ณด๋“œ

๊ฐ•์‚ฌ์šฉPC

์ปดํ“จํ„ฐ

Page 24: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

LSP(Liskov`s Substitution Principle)

์ •์˜

[๋‹จ์ˆœ] ๊ธฐ์กด ํƒ€์ž…์˜ ํ•˜์œ„ ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๊ฐ€์ด๋“œ

S ํƒ€์ž…์˜ ๊ฐ์ฒด o1 ์— ๋Œ€ํ•ด Tํƒ€์ž…์˜ ๊ฐ์ฒด o2๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, T๋กœ ์ •์˜๋œ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ P์—๋Œ€ํ•ด, o1์ด o2๋กœ ๋Œ€์ฒด๋˜์–ด๋„ P๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, S๊ฐ€ T์˜ ํ•˜์œ„ํƒ€์ž…์ด๋‹ค . [If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behaviour of P is unchanged when o1 is substituted for o2 then S is a subtype of T.]

ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋“ˆ์ด Base ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋“ˆ์˜ ๊ธฐ๋Šฅ์—์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  Base ํด๋ž˜์Šค๋ฅผ ํŒŒ์ƒํด๋ž˜์Šค๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

- 24 -

T

S

o1::S o2::T

P

Page 25: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

LSP(Liskovโ€™s Substitution Principle)

NormalDiscountRule์€ HolydayDiscountRule๋กœ ๋Œ€์ฒด ๋ถˆ๊ฐ€๋Šฅํ•จ

- 25 -

NormalDiscountRule

-baseRate:double

+getDiscountRate()

HolydayDiscountRule

+getDiscountRate()

Price

-basePrice:double

+calculatePrice()

private double baseRate = 1.0;

public double getDiscountRate() {

return this.baseRate;

}

public double getDiscountRate() {

return this.baseRate - 0.2;

}

public double calculatePrice(NormalDiscountRule dcRule) {

double price = dcRule.getDiscountRate() * basePrice;

System.out.println(โ€œprice is โ€œ + price);

}

public static void main(String[] args) {

Price priceTest = new Price();

priceTest.setBasePrice(1000.0);

NormalDicountRule ncRule = new NormalDiscountRule();

HolydayDiscountRule hcRule = new HolydayDiscountRule();

priceTest.calculatePrice(ncRule);

priceTest.calculatePrice(hcRule);

}

price is 1000.0

price is 1000.0

๋ฆฌ์Šค์ฝ”ํ”„ ๋Œ€์ฒด ๊ทœ์น™์ด ๊นจ์ง ~~

Page 26: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

LSP(Liskovโ€™s Substitution Principle)

NormalDiscountRule์€ HolydayDiscountRule๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•จ

- 26 -

DiscountRule

-baseRate:double

+getDiscountRate()

HolydayDiscountRule

+getDiscountRate()

Price

-basePrice:double

+calculatePrice()

NormalDiscountRule

+getDiscountRate()

public double calculatePrice(DiscountRule dcRule) {

double price = dcRule.getDiscountRate() * basePrice;

System.out.println(โ€œprice is โ€œ + price);

}

public static void main(String[] args) {

Price priceTest = new Price();

priceTest.setBasePrice(1000.0);

NormalDicountRule ncRule = new NormalDiscountRule();

HolydayDiscountRule hcRule = new HolydayDiscountRule();

priceTest.calculatePrice(ncRule);

priceTest.calculatePrice(hcRule);

}

price is 1000.0

price is 800.0

Page 27: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

OCP(Open Closed Principle)

์›์น™

์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์€ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๋‹ซํ˜€์žˆ๊ณ , ํ™•์žฅ์— ๋Œ€ํ•ด ์—ด๋ ค์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

- 27 -

Customer A BusinessLogic

Customer B [๋ณ€๊ฒฝ๋œ]BusinessLogic

Page 28: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

OCP(Open Closed Principle)

ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋Š์Šจํ•œ ๊ฒฐํ•ฉ ์›์น™(Loose Coupling)์„ ์ค€์ˆ˜ํ•œ๋‹ค.

๋Œ€์ถœ์š”์ฒญ ์ฒ˜๋ฆฌ๊ธฐ์™€ ๊ฐœ์ธ๋Œ€์ถœ๊ฒ€์ฆ ํด๋ž˜์Šค๋Š” tight coupling ์ƒํƒœ

์ƒˆ๋กœ์šด ๋Œ€์ถœ์ธ ์‚ฌ์—…์ž ๋Œ€์ถœ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ™•์žฅ์„ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

- 28 -

๋Œ€์ถœ์š”์ฒญ์ฒ˜๋ฆฌ๊ธฐ

+๋Œ€์ถœ์Šน์ธ(๊ฐœ์ธ๋Œ€์ถœ๊ฒ€์ฆ)

๊ฐœ์ธ๋Œ€์ถœ๊ฒ€์ฆ

+isValid(int):boolean

์‚ฌ์—…์ž๋Œ€์ถœ๊ฒ€์ฆ

+isValid(int):boolean

?

Page 29: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

OCP(Open Closed Principle)

์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์ ์ ˆํžˆ ์กฐ์ •ํ•œ๋‹ค.

Abstract ํด๋ž˜์Šค๊ฐ€ Concrete ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

- 29 -

๋Œ€์ถœ์š”์ฒญ์ฒ˜๋ฆฌ๊ธฐ

+๋Œ€์ถœ์Šน์ธ(๊ฐœ์ธ๋Œ€์ถœ๊ฒ€์ฆ)

<<interface>>

๋Œ€์ถœ๊ฒ€์ฆ

+isValid(int):boolean

์‚ฌ์—…์ž๋Œ€์ถœ๊ฒ€์ฆ

+isValid(int):boolean

๊ฐœ์ธ๋Œ€์ถœ๊ฒ€์ฆ

+isValid(int):boolean

public void ๋Œ€์ถœ์Šน์ธ(๋Œ€์ถœ๊ฒ€์ฆ loanValidator) {

if (loadValidator.isValid(balance) {

....

}

}

Page 30: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

DIP(Dependency Inversion Principle)

์„ค๊ณ„ ์‹œ,

๋จผ์ € ๋ชจ๋“ˆ์ด ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋ฅผ ํ•œ ํ›„,

๋ชจ๋“ˆ์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ์œ ์—ฐ์„ฑ, ๊ฒฌ๊ณ ์„ฑ์„ ์‚ดํŽด๋ณธ๋‹ค.

์ด ๋•Œ, OCP๋ฅผ ์ค€์ˆ˜ํ–ˆ๋Š”์ง€ ๊ฒ€ํ† ํ•œ๋‹ค.

์˜์กด์„ฑ ์—ญ์ „ ์›์น™์€ OCP๋ฅผ ์ค€์ˆ˜ํ•˜๋„๋ก ๋„์™€์ค€๋‹ค.

๋†’์€ ์ˆ˜์ค€์˜ ๋ชจ๋“ˆ์€ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ๋ชจ๋‘ ์ถ”์ƒํ™” ๋ชจ๋“ˆ์— ์˜์กดํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

์ถ”์ƒํ™” ์ˆ˜์ค€์˜ ๋ชจ๋“ˆ์€ ์ƒ์„ธ ์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ์ƒ์„ธ ์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ถ”์ƒํ™” ๋ชจ๋“ˆ์— ์˜์กดํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

- 30 -

Page 31: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

DIP(Dependency Inversion Principle)

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

๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•จ

DataCollector, DataWriter, DatabaseWriter

- 31 -

DataWriter

+writeData(Data):void

DatabaseWriter

+writeToDB(Data):void

DataCollector

+collectData(String):void

High-level

Component

Low-level

Implementation

Page 32: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

DIP(Dependency Inversion Principle)

์„ค๊ณ„ ์กฐ์ •

DataWriter๋ฅผ ํŠน์ • ๋ชฉ์ ์ง€(destination)๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ๊ฒŒ ํ•œ๋‹ค.

์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๋งž์ถ˜๋‹ค.

- 32 -

DataWriter

+writeData(Data):void

DatabaseWriter

+writeToDB(Data):void

DataCollector

+collectData(String):void

<<interface>>

RepositoryWriter

+writeData(Data):void

FileWriter

+writeToDB(Data):void

Same

High-level

Component

Page 33: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

- 33 -

1.3 ๋””์ž์ธ ํŒจํ„ด ์ •์˜

๋””์ž์ธ ํŒจํ„ด ์ •์˜

๋””์ž์ธ ํŒจํ„ด ์—ญํ• 

๋””์ž์ธ ํŒจํ„ด ์œ ๋ž˜

๋””์ž์ธ ํŒจํ„ด ํ™œ์šฉ

๋””์ž์ธ ํŒจํ„ด ๋ฌธ์ œ์ 

Page 34: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

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

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ˜ผ์ž์„œ ๊ณ ๋ฏผ์„ ํ•œ๋‹ค.

๋‚จ์—๊ฒŒ ๋ฌผ์–ด๋ณธ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์ฃผ๋ณ€์—์„œ ์ฐพ์•„๋ณธ๋‹ค.

๋™์ผํ•œ ์œ ํ˜•(ํŒจํ„ด)์˜ ๋ฌธ์ œ๋ฅผ ์ฃผ๋ณ€์—์„œ ์ฐพ์•„๋ณธ๋‹ค.

์•„์ด๋””์–ด๋Š” ์•„์ด๋””์–ด๋ฅผ ๋”›๊ณ  ์ผ์–ด์„œ๊ณ , ๊ฐœ์„ ์€ ๊ฐœ์„ ์„ ๋”›๊ณ  ์ผ์–ด์„ ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋‚œ ๋ฌธ์ œ๊ฐ€ ์œ ์ผํ•  ํ™•๋ฅ ์€ ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋‚œ ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ณตํ•ฉ์ ์ด๋‹ค.

์Šค์Šค๋กœ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋“ฃ๋Š” ๊ฒƒ์ด ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

- 34 -

Page 35: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ์ •์˜

ํŒจํ„ด์€ ๊ฒ€์ฆ๋œ ์„ค๊ณ„ ๊ฒฝํ—˜์˜ ๊ธฐ๋ก

ํŒจํ„ด์€ ์ฃผ์–ด์ง„ ์‹œ์Šคํ…œ ์ƒํ™ฉ(context)์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด์†”๋ฃจ์…˜ ์ œ์‹œ

ํŒจํ„ด์€ ๋””์ž์ธ๊ณผ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์šฉ์–ด ์ œ๊ณต

ํŒจํ„ด ๊ทธ๋ฃน์€ ์•„ํ‚คํ…์ฒ˜์˜ ๊ธฐ๋ฐ˜

- 35 -

Page 36: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ์ •์˜(wikipedia)

์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์—์„œ, ๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ด๊ณ  ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด๋‹ค.

๋””์ž์ธ ํŒจํ„ด์€ ์™„๋ฃŒ๋œ ์„ค๊ณ„๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ง์ ‘ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค.

๋””์ž์ธ ํŒจํ„ด์€ ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์ƒํ™ฉ(situation)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์œ„ํ•œ ๊ธฐ์ˆ (description) ๋˜๋Š” ํ…œํ”Œ๋ฆฟ์ด๋‹ค.

๊ฐ์ฒด-์ง€ํ–ฅ ๋””์ž์ธ ํŒจํ„ด์€ ์ฐธ์—ฌํ•œ ์ตœ์ข… ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด๋ฅผ ๋ช…์„ธํ•˜์ง€ ์•Š๊ณ , ํด๋ž˜์Šค ๋˜๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ณด์—ฌ์ค€๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์„ค๊ณ„ ๋ฌธ์ œ ๋ณด๋‹ค๋Š” ๊ณ„์‚ฐ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ„ด์ด ๋””์ž์ธ ํŒจํ„ด์€ ์•„๋‹ˆ๋‹ค. ๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์ˆ˜์ค€์˜ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

- 36 -

Page 37: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด์˜ ์—ญํ• 

๊ธฐ์กด์˜์•„ํ‚คํ…์ฒ˜๋ฅผ์ดํ•ดํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•œ๋‹ค.

ํŒจํ„ด์€ ๊ธฐ์กด์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜, ํ”„๋ ˆ์ž„์›Œํฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์˜ ์•ˆ๋‚ด์ž ์—ญํ• ์ˆ˜ํ–‰.

์„ค๊ณ„๋ฅผ ๋•๊ณ  ์„ค๊ณ„ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

ํŒจํ„ด์€ ๋””์ž์ธ ๊ฒฝํ—˜์„ ๋‹ด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ… ์ œ๊ณต

๋””์ž์ธ์—๋Œ€ํ•œ ์˜์‚ฌ๊ตํ™˜์„ ๋•๋Š”๋‹ค.

ํŒจํ„ด์€ ์„ค๊ณ„์ž ๊ฐ„์˜ ์ค‘์š”ํ•œ ๊ฒฐ์ •์„ ๋•๊ณ  ์ •๋‹นํ™” ํ•จ.

- 37 -

Page 38: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ์œ ๋ž˜

ํŒจํ„ด์€ ๊ฑด์ถ• ์•„ํ‚คํ…์ฒ˜๋กœ๋ถ€ํ„ฐ ์œ ๋ž˜โ€ฆ

๊ทธ๋“ค์€ ๊ณผ๊ฑฐ์˜ ๊ฑด์ถ•๋ฌผ์— ์ƒ๋ช…์„ ๋ถˆ์–ด๋„ฃ์—ˆ๋˜ ๋น„๊ณต์‹์ ์ธ ๊ฒฝํ—˜ ์ค‘์— ์ผ๋ถ€๋ฅผ ์žก์•„๋‚ด๋ ค ๋…ธ๋ ฅํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ํ˜„๋Œ€ ๊ฑด์ถ•์—์„œ๋Š” ์ ์  ์žŠํ˜€์ง€๊ณ  ์žˆ๋‹ค...

ํŒจํ„ด์€ ๋””์ž์ธ ๊ฒฝํ—˜, ๊ด€๋ จ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ์ฑ…์„ ํ•จ๊ป˜ ๋‹ด๊ณ  ์žˆ๋‹ค :

โ€œ๊ฐ ํŒจํ„ด์€ ์šฐ๋ฆฌ ํ™˜๊ฒฝ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ธฐ์ˆ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์˜ ํ•ต์‹ฌ๋งŒ์„ ๊ธฐ์ˆ ํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทธ ์†”๋ฃจ์…˜์„ ์ˆ˜์—†์ด ๋ฐ˜๋ณตํ•ด์„œ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.โ€ (Christopher Alexander et al, A Pattern Language)

- 38 -

Page 39: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ์œ ๋ž˜

ํŒจํ„ด์€ Christopher Alexander์˜ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ๋…(1977)์—์„œ ์œ ๋ž˜ํ•˜์˜€๋‹ค.

1987๋…„์— Kent Beck๊ณผ Ward Cunningham์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ํŒจํ„ด์„ ์ ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ OOPSLA ์ปจํผ๋Ÿฐ์Šค์—์„œ ๋ฐœํ‘œํ•˜์˜€๋‹ค.

1994๋…„์— โ€œDesign Patterns: Elements of Reusable Object-Oriented Softwareโ€ ์ฑ…(Gamma ์™ธ)์ด ์ถœ๊ฐ„๋œ ์ดํ›„ ์ปดํ“จํ„ฐ๊ณตํ•™ ์˜์—ญ์—์„œ ๋””์ž์ธํŒจํ„ด์ด ๋„๋ฆฌ ์•Œ๋ ค์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

1994๋…„์— โ€œํ”„๋กœ๊ทธ๋žจ์˜ ํŒจํ„ด ์–ธ์–ด(Pattern Languages of Programs)โ€ ์ปจํฌ๋Ÿฐ์Šค๊ฐ€ ๊ฐœ์ตœ๋˜์—ˆ๊ณ , ์ด๋“ฌํ•ด์— ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”๋ฅผ ์œ„ํ•ด ํฌํ‹€๋žœ๋“œ ํŒจํ„ด ๋ฆฌํŒŒ์ง€ํ† ๋ฆฌ๊ฐ€ ์„ค๋ฆฝ๋˜์—ˆ๋‹ค.

2009๋…„์—๋Š”...

- 39 -

Page 40: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ํ™œ์šฉ

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

ํ”ํžˆ, ์‚ฌ๋žŒ๋“ค์€ ์–ด๋–ค ๋ฌธ์ œ์— ์–ด๋–ค ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๊ธฐ์ˆ (technique)์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ์„ ์ดํ•ดํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ (technique)์€ ๋„“์€ ๋ฒ”์œ„์˜ ๋ฌธ์ œ์— ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋””์ž์ธ ํŒจํ„ด์€ ์ผ๋ฐ˜์ ์ธ ํ•ด๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋•Œ ํŠน์ • ๋ฌธ์ œ๋กœ ๋ฒ”์œ„๋ฅผ ์ขํžˆ์ง€ ์•Š๊ณ  ๋ฌธ์„œํ™” ํ•œ๋‹ค.

๋””์ž์ธ ํŒจํ„ด์€ ๋ช‡ ๊ฐ€์ง€ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํŠนํžˆ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๊ตฌ์กฐ(structure), ์ฐธ์—ฌ๊ฐ์ฒด(participant), ํ˜‘์—…(collaboration) ๋ถ€๋ถ„์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ์„ค๊ณ„ ๋™๊ธฐ๋‚˜ ์ฃผ์ œ๋ฅผ ์„œ์ˆ ํ•œ๋‹ค(์ด๊ฒƒ์„ ๋งˆ์ดํฌ๋กœ-์•„ํ‚คํ…์ฒ˜๋ผ ํ•จ). ๋งˆ์ดํฌ๋กœ-์•„ํ‚คํ…์ฒ˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ์ฒด(์˜ˆ, ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ,...)์™€ ๊ทธ๋“ค์˜ ๊ด€๊ณ„ ์ง‘ํ•ฉ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์„ค๊ณ„์— ์ „ํ˜•์ ์ธ ๋งˆ์ดํฌ๋กœ-์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ์„ค๊ณ„์—์„œ ๋งˆ์ดํฌ๋กœ-์•„ํ‚คํ…์ฒ˜๋Š” ์„ ํƒํ•œ ์„ค๊ณ„ ๋™๊ธฐ์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ์™€ ์กฐ์ง์ฒด๊ณ„๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ์ƒํ˜ธ์ž‘์šฉ์„ ์ž˜ ์•Œ๋ ค์ง„ ๋ฐฉ์‹์œผ๋กœ ์˜์‚ฌ์†Œํ†ต์„ ํ•˜๊ฒŒํ•ด์ค€๋‹ค. - 40 -

Page 41: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ๋ฌธ์ œ์ 

์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด, ๋””์ž์ธ ํŒจํ„ด์€ ์šฐํšŒ๊ฒฝ๋กœ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ๊ฑฐ์นœ๋‹ค.

์ด๋กœ ์ธํ•ด ๊ฒฐ๊ณผ ๋””์ž์ธ์€ ๋ณต์žกํ•ด์ง€๊ณ ,

์ˆ˜ํ–‰์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

- 41 -

Target

+request()

Adaptor

request() {

...

return adaptee.specificRequest();

}

Adaptor

+specificRequest()

Client

adaptee

Page 42: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

1.4 ๋””์ž์ธ ํŒจํ„ด ๋ถ„๋ฅ˜

์ƒ์„ฑ ํŒจํ„ด(creational patterns)

๊ตฌ์กฐ ํŒจํ„ด(structural patterns)

ํ–‰์œ„ ํŒจํ„ด(behavioral patterns)

๋””์ž์ธ ํŒจํ„ด ๋งต

๋””์ž์ธ ํŒจํ„ด ํ‚ค์›Œ๋“œ

- 42 -

๋ชฉ์ 

์ƒ์„ฑ ํŒจํ„ด ๊ตฌ์กฐ ํŒจํ„ด ํ–‰์œ„ ํŒจํ„ด

๋ฒ”์œ„ ํด๋ž˜์Šค Factory Method Adapter Interpreter Template Method

๊ฐ์ฒด Abstract Factory Builder Prototype Singleton

Adapter Bridge CompositeDecorator FacadeProxy

Chain of Responsibility Command Iterator Mediator Memento Flyweight Observer State Strategy Visitor

Page 43: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒ์„ฑ ํŒจํ„ด(creational patterns)

Abstract factory ํŒจํ„ด

์ธ์Šคํ„ด์Šคํ™” ํ•  ํŒฉํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ์ค‘์•™ ์ง‘์ค‘ํ™” ํ•จ

Factory method ํŒจํ„ด:

์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌํ˜„ ์ค‘์— ํŠน์ • ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์„ ํƒ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์„ ์ค‘์•™ ์ง‘์ค‘ํ™” ํ•จ

Builder ํŒจํ„ด

์ƒ์„ฑ ์ ˆ์ฐจ๋Š” ๋™์ผํ•˜๋‚˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ, ๋ณต์žกํ•œ ๊ฐ์ฒด์˜ ๊ตฌ์ถ•์„ ํ‘œํ˜„(represention)๊ณผ ๋ถ„๋ฆฌํ•จ

Lazy initialization ํŒจํ„ด

๊ฐ์ฒด ์ƒ์„ฑ, ๊ฐ’ ๊ณ„์‚ฐ, ๋‹ค๋ฅธ ๊ฐ’ ๋น„์‹ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์‹œ์ ๊นŒ์ง€ ์ง€์—ฐํ•˜๋Š” ์ „์ˆ 

Object pool

๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์˜ ์žฌํ™œ์šฉ์„ ํ†ตํ•ด ๊ฐ’ ๋น„์‹ผ ํš๋“(acquisition) ๋ฐ ํ•ด์ง€(release)๋ฅผ ํ”ผํ•จ

Prototype pattern

์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‘œ์ค€์ ์ธ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๊ฐ’๋น„์Œ€ ๋•Œ ์‚ฌ์šฉํ•จ

Singleton pattern

ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•˜๋‚˜๋กœ ์ œํ•œํ•จ- 43 -

Page 44: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ตฌ์กฐ ํŒจํ„ด(structural patterns)

Adapter ํŒจํ„ด

์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ์œ„ํ•ด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฑ„ํƒํ•จ

Bridge ํŒจํ„ด

์ถ”์ƒ์ ์ธ ๋ถ€๋ถ„์„ ๊ตฌํ˜„๊ณผ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๋‘ ์š”์†Œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ

Composite ํŒจํ„ด

๊ฐ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋“ค์˜ ํŠธ๋ฆฌ๊ตฌ์กฐ

Decorator ํŒจํ„ด

์ƒ์†์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํด๋ž˜์Šค ๊ฐฏ์ˆ˜๊ฐ€ ์ง€์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ, ํด๋ž˜์Šค์— ๊ธฐ๋Šฅ ์ถ”๊ฐ€

Facade ํŒจํ„ด

๊ธฐ์กด์˜ ๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋‹จ์ˆœํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ

Flyweight ํŒจํ„ด

๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ๊ณตํ†ต์˜ ์†์„ฑ์„ ๊ณต์œ ํ•˜๋Š” ๋งŽ์€ ์ˆ˜์˜ ๊ฐ์ฒด

Proxy ํŒจํ„ด

๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค

- 44 -

Page 45: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํ–‰์œ„ ํŒจํ„ด(behavioral patterns) (1/2)

Chain of responsibility ํŒจํ„ด

๋ช…๋ น ๊ฐ์ฒด๊ฐ€ ๋กœ์ง์„ ํฌํ•จํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์— ์˜ํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋จ

Command ํŒจํ„ด

ํ–‰์œ„์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ช…๋ น ๊ฐ์ฒด

Interpreter ํŒจํ„ด

ํŠน์ • ๋ฌธ์ œ ์ง‘ํ•ฉ์„ ์‹ ์†ํ•˜๊ฒŒ ํ’€๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ํ™”๋œ ์ปดํ“จํ„ฐ ์–ธ์–ด๋ฅผ ๊ตฌํ˜„ํ•จ

Iterator ํŒจํ„ด

๊ฐ์ฒด ๋‚ด๋ถ€ ํ‘œํ˜„๋ฐฉ์‹์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ง‘ํ•ฉ๊ฐ์ฒด์˜ ์š”์†Œ์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•จ

Mediator ํŒจํ„ด

ํ•˜์œ„ ์‹œ์Šคํ…œ ์•ˆ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง‘ํ•ฉ์„ ์œ„ํ•˜์—ฌ ํ†ตํ•ฉ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต

Memento ํŒจํ„ด

๊ฐ์ฒด๋ฅผ ์ด์ „์˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์—ญ๋Ÿ‰์„ ์ œ๊ณตํ•จ(๋กค๋ฐฑ)

Null Object ํŒจํ„ด

๊ฐ์ฒด์˜ ๊ธฐ๋ณธ๊ฐ’(default value)์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„ํ•จ

- 45 -

Page 46: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํ–‰์œ„ ํŒจํ„ด(behavioral patterns) (2/2)

Observer ํŒจํ„ด

๋ณ„์นญ: publish/Subscribe ๋˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ

๋‹ค๋ฅธ ๊ฐ์ฒด์— ์˜ํ•ด์„œ ๋ฐœ์ƒํ•  ์ด๋ฒคํŠธ๋ฅผ ๊ด€์ฐฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ๋“ฑ๋ก

State ํŒจํ„ด

์‹คํ–‰ ์‹œ์ ์— ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•

Strategy ํŒจํ„ด

์‹คํ–‰ ์‹œ์ ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

Specification ํŒจํ„ด

๋ถ€์šธ๋ฆฌ์–ธ ๋ฐฉ์‹์œผ๋กœ ์žฌ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

Template method ํŒจํ„ด

ํ”„๋กœ๊ทธ๋žจ์˜ ๋ผˆ๋Œ€๋ฅผ ๊ธฐ์ˆ ํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋ฅผ ๊ณต์œ ํ•จ

Visitor ํŒจํ„ด

๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

- 46 -

Page 47: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ๋งต

- 47 -

CompositeDecorator๊ฐ์ฒด์— ์ฑ…์ž„์ถ”๊ฐ€

Strategy

์™ธ๋ถ€/๋‚ด๋ถ€ ๋ณ€๊ฒฝ

Flyweight

composite ๊ณต์œ 

State

State ๊ณต์œ 

Strategy ๊ณต์œ Interpreter

๋ฌธ๋ฒ• ์ •์˜

Visitor

์šฉ์–ด์‹ฌ๋ฒŒ ๊ณต์œ 

์˜คํผ๋ ˆ์ด์…˜ ์ถ”๊ฐ€

์˜คํผ๋ ˆ์ด์…˜ ์ถ”๊ฐ€

Iterator

์š”์†Œ ์—ด๊ฑฐํšก๋‹จ ์ •์˜

Memento

๋ฐ˜๋ณต์ƒํƒœ์ €์žฅ

Command๋ณตํ•ฉ ์‚ฌ์šฉ

์ด๋ ฅ๊ณก์„  ํšŒํ”ผ

Chain of Responsibility

์ฒด์ธ ์ •์˜

TemplateMethod

์•Œ๊ณ ๋ฆฌ์ฆ˜

์Šคํ…์ •์˜

Factory Method Abstract Factory

Prototype

Singleton

Facade

์‹ฑ๊ธ€์ธ์Šคํ„ด์Šค ์‹ฑ๊ธ€์ธ์Šคํ„ด์Šค

๋‹ค์–‘ํ•œ

๊ตฌ์„ฑ์„ค์ •

Observer

Mediator

๋ณต์žกํ•œ์˜์กด์„ฑ

๊ด€๋ฆฌ

Bridge

Adaptor

ProxyBuilder

Composite ์ƒ์„ฑ

Page 48: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๋””์ž์ธ ํŒจํ„ด ํ‚ค์›Œ๋“œ

- 48 -

๋ชฉ์  ๋””์ž์ธ ํŒจํ„ด ํŠน์ง•

์ƒ์„ฑ ํŒจํ„ด Abstract Factory ์ƒํ’ˆ ๊ฐ์ฒด๋“ค์˜ ํŒจ๋ฐ€๋ฆฌ

Builder ๋ณตํ•ฉ ๊ฐ์ฒด ์ƒ์„ฑ

Factory Method ์ธ์Šคํ„ด์Šคํ™”๋  ๊ฐ์ฒด์˜ ํ•˜์œ„ ํด๋ž˜์Šค

Prototype ์ธ์Šคํ„ด์Šคํ™” ๋  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค

Singleton ๋‹จ์ผ ์ธ์Šคํ„ด์Šค

๊ตฌ์กฐ ํŒจํ„ด Adapter ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

Bridge ๊ฐ์ฒด์˜ ๊ตฌํ˜„

Composite ๊ฐ์ฒด๊ตฌ์กฐ์™€ ๊ฐ์ฒด์˜ ๋ณตํ•ฉ์ฒด

Decorator ์ƒ์†์—†์ด ๊ฐ์ฒด์— ์ฑ…์ž„์ถ”๊ฐ€

Facade ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ์ธํ„ฐํŽ˜์ด์Šค

Flyweight ๊ฐ์ฒด ์ €์žฅ ๋น„์šฉ

Proxy ๊ฐ์ฒด์˜ ์œ„์น˜์™€ ์ ‘๊ทผ๋ฐฉ๋ฒ•

ํ–‰์œ„ ํŒจํ„ด Chain of Responsibility ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋“ค

Command ์š”์ฒญ์ฒ˜๋ฆฌ ์‹œ์ ๊ณผ ๋ฐฉ๋ฒ•

Interpreter ์–ธ์–ด์˜ ๋ฌธ๋ฒ•๊ณผ ํ•ด์„

Iterator ์ง‘ํ•ฉ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ณ  ํšก๋‹จํ•จ

Mediator ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”๊ฐ€?

Memento ์–ด๋–ค ์‚ฌ์ ์ •๋ณด๋ฅผ ์–ธ์ œ ๊ฐ์ฒด์˜ ๋ฐ–์— ์ €์žฅํ•˜๋Š”๊ฐ€?

Observer ์˜์กด ๊ฐ์ฒด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐฉ๋ฒ•

State ๊ฐ์ฒด์˜ ์ƒํƒœ

Strategy ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

Template Method ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฒ˜๋ฆฌ ์ ƒ์ฐจ

Visitor ์˜คํผ๋ ˆ์ด์…˜ ์ถ”๊ฐ€

Page 49: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

1.5 ๋””์ž์ธ ํŒจํ„ด ์‚ฌ๋ก€์—ฐ๊ตฌ(GoF)

Lexy ์†Œ๊ฐœ

์„ค๊ณ„ ์ด์Šˆ

๋ฌธ์„œ๊ตฌ์กฐ

ํฌ๋งทํŒ…

UI ์žฅ์‹

์—ฌ๋Ÿฌ ๋ฃฉ-์•ค-ํ•„ ํ‘œ์ค€ ์ง€์›

์—ฌ๋Ÿฌ ์œˆ๋„์šฐ ์‹œ์Šคํ…œ ์ง€์›

์‚ฌ์šฉ์ž ์กฐ์ž‘

- 49 -

Page 50: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Lexi ์†Œ๊ฐœ

Lexi

WISIWYG(What You See Is What You Get) ๋ฌธ์„œ ํŽธ์ง‘๊ธฐ

ํŽธ์ง‘ํ™”๋ฉด

ํ…์ŠคํŠธ/๊ทธ๋ž˜ํ”ฝ

๋‹ค์–‘ํ•œ ํฌ๋งท ์Šคํƒ€์ผ

ํ’€๋‹ค์šด ๋ฉ”๋‰ด

์Šคํฌ๋กค ๋ฐ”

ํŽ˜์ด์ง€ ์•„์ด์ฝ˜

- 50 -

Page 51: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ

๋ฌธ์„œ ๊ตฌ์กฐ

๋ฌธ์„œ๊ตฌ์กฐ๋Š” ํŽธ์ง‘๊ธฐ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ธฐ๋Šฅ(ํŽธ์ง‘, ํฌ๋งทํŒ…, ๋ณด๊ธฐ, ํ…์ŠคํŠธ ๋ถ„์„)์— ์˜ํ–ฅ์„ ๋ฏธ์นจ

ํฌ๋งทํŒ…

ํ…์ŠคํŠธ์™€ ๊ทธ๋ž˜ํ”ฝ์„ ๋ผ์ธ๊ณผ ์นผ๋Ÿผ์— ์–ด๋–ป๊ฒŒ ์ •๋ ฌํ•˜๋Š”๊ฐ€? ์—ฌ๋Ÿฌ ํฌ๋งท ์ •์ฑ…์„ ์ฃผ๊ด€ํ•˜๋Š” ๊ฐ์ฒด

UI ์žฅ์‹

์Šคํฌ๋กค ๋ฐ”, ํ…Œ๋‘๋ฆฌ ๋“ฑ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€,์ œ๊ฑฐ ๊ฐ€๋Šฅํ•˜์—ฌ์•ผ ํ•จ

์—ฌ๋Ÿฌ ๋ฃฉ-์•ค-ํ•„ ํ‘œ์ค€ ์ง€์›

์ž‘์€ ๋ณ€๊ฒฝ์œผ๋กœ ๋ชจํ‹ฐํ”„๋‚˜ PM๊ณผ ๊ฐ™์€ ๋ฃฉ-์•ค-ํ•„ ํ‘œ์ค€์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ์•ผ ํ•จ

- 51 -

Page 52: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ ๋ฌธ์„œ ๊ตฌ์กฐ (1/2)

๋ฌธ์„œ ๋‚ด๋ถ€ํ‘œํ˜„

๋ฌธ์„œ์˜ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ, ํ…์ŠคํŠธ์™€ ์ด๋ฏธ์ง€๋ฅผ ๋ผ์ธ๊ณผ ์นผ๋Ÿผ, ํ…Œ์ด๋ธ”๋กœ ์ •๋ ฌํ•ด์•ผ ํ•จ

๋ฌธ์„œ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•จ

๋‚ด๋ถ€ ์š”์†Œ๋ฅผ ๋””์Šคํ”Œ๋ ˆ์ด์˜ ์ง€์ ์œผ๋กœ ๋งคํ•‘

- 52 -

Page 53: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ ๋ฌธ์„œ ๊ตฌ์กฐ (2/2)

์„ค๊ณ„ ํ‚ค์›Œ๋“œ = Recursive and Composition

Glyph, ๋ฌธ์„œ๊ตฌ์กฐ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

Row, ์—ฌ๋Ÿฌ Glyph๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉด์„œ ์ž์‹ ๋„ ์—ญ์‹œ Glyph์ž„

- 53 -

<<interface>>

Glyph

+draw(Window):void

+bounds(Rect): void

+intersects(Point):boolean

+insert(Glyph,int):void

+remove(Glyph):void

+getChild(int):Glyph

+getParent():Glyph

Composite ํŒจํ„ด

Page 54: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ ํฌ๋งทํŒ… (1/2)

ํฌ๋งทํŒ…

ํŠน์ • ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ๊ฐ€?

ํ‘œํ˜„(representation)๊ณผ ํฌ๋งท์€ ๋ณ„๊ฐœ์˜ ์ž‘์—…

โ€ข ํ‘œํ˜„: ๋ฌธ์„œ์˜ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ(๋ณตํ•ฉ๊ตฌ์กฐ)

โ€ข ํฌ๋งท: ํ…์ŠคํŠธ๋ฅผ ๋ผ์ธ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๋ผ์ธ์„ ์นผ๋Ÿผ์œผ๋กœ... ์ขŒ์šฐ์ƒํ•˜ ๊ณต๋ฐฑ, ๋“ค์—ฌ์“ฐ๊ธฐ, ํƒญ์„ ๊ณ ๋ คํ•จ

ํฌ๋งทํŒ… = ๋ผ์ธ ๋‚˜๋ˆ„๊ธฐ, ์นผ๋Ÿผ ๋‚˜๋ˆ„๊ธฐ

ํฌ๋งทํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ’ˆ์งˆ๊ณผ ์†๋„ ๊ณ ๋ ค

ํฌ๋งทํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค์šฐ ๋ณต์žกํ•จ

์ปดํŒŒ์ผ ํƒ€์ž„ ๋˜๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์— ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

์ƒˆ๋กœ์šด ํฌ๋งทํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

์„ค๊ณ„ ๋ฐฉํ–ฅ

ํฌ๋งทํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์บก์Šํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋“ค์„ ์œ„ํ•ด ๋ณ„๋„์˜ ํด๋ž˜์Šค ๊ณ„์ธต์„ ๊ตฌ์„ฑ

์ธํ„ฐํŽ˜์ด์Šค ์ •์˜

- 54 -

Page 55: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ ํฌ๋งทํŒ… (2/2)

ํฌ๋งทํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

์„ ๋‚˜๋ˆ„๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ์ฒด ์•ˆ์œผ๋กœ ์บก์Šํ™” ํ•จ

Strategy ํŒจํ„ด ์‚ฌ์šฉ

- 55 -

<<interface>>

Glyph

+insert(Glyph,int):void

Composition

+insert(Glyph,int):void

Compositor

+compose()

+setComposition()

ArrayCompositor

+compose()

TeXCompositor

+compose()

SimpleCompositor

+compose()

public void insert(Glyph glyph, int pos) {

// ์ž๋ฃŒ๊ตฌ์กฐ์— ์ถ”๊ฐ€

....

// ํฌ๋งทํŒ… ์ž‘์—…

compositor.compose();

}

compositor

Compositor

๊ฐ€ ์ƒ์„ฑํ•œ Glyph

Page 56: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ UI ์žฅ์‹ (1/3)

์žฅ์‹ ๋‚ด์šฉ

ํ…์ŠคํŠธ ํŽธ์ง‘์˜์—ญ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ๊ณ„์„ (border) ์ถ”๊ฐ€

ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์Šคํฌ๋กค๋ฐ” ์ถ”๊ฐ€

์„ค๊ณ„ ์š”๊ตฌ

์ƒ์†์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ(์‹คํ–‰์‹œ์ ์— ์žฌ์ •๋ ฌ์„ ์–ด๋ ต๊ฒŒ ํ•จ)

UI ๊ฐ์ฒด๋Š” ์žฅ์‹๊ฐ์ฒด์˜ ์ถ”๊ฐ€/์‚ญ์ œ์—ฌ๋ถ€๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด์•ผ ํ•จ

์ˆจ๊น€์—†์ด ๋‘˜๋Ÿฌ์Œˆ(transparent enclosure)

์ƒ์†์„ ์ด์šฉํ•œ ๋ฌธ์ œํ•ด๊ฒฐ

- 56 -

Composition

+insert(Glyph,int):void

BorderedComposition

+insert(Glyph,int):void

ScrolledComposition

+insert(Glyph,int):void

BorderedScrolledComposition

+insert(Glyph,int):void

Page 57: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ UI ์žฅ์‹ (2/3)

์ˆจ๊น€์—†์ด ๋‘˜๋Ÿฌ์Œˆ(transparent enclosure)(๊ณ„์†)

object composition ์ด ๋ณด๋‹ค ์œ ์—ฐํ•œ ํ™•์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•จ

๋ˆ„๊ฐ€ ๊ตฌ์„ฑ์˜ ์ฃผ์ฒด๊ฐ€ ๋˜๋Š”๊ฐ€? Border, Glyph

ํด๋ผ์ด์–ธํŠธ๋Š” Glyph์™€ Bordered Glyph๋ฅผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃจ์–ด์•ผ ํ•จ

- 57 -

ํ•œ๊ธ€์„ ํŽธ์ง‘ํ•ฉ์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” _

<<interface>>

Glyph

+draw(Window):void

MonoGlyph

+draw(Window):void

Border

+draw(Window):void

-drawBorder(Window):void

Scroller

+draw(Window):void

public void draw(Window window) {

super.draw(window);

drawBorder(window);

}

com

ponent

public void draw(Window window) {

component.draw(window);

}

Page 58: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ UI ์žฅ์‹ (3/3)

์„ ํƒ

Border๊ฐ€ Scroller๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ

Scroller๊ฐ€ Border๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ

Decorator ํŒจํ„ด

์ˆจ๊น€์—†๋Š” ๋‘˜๋Ÿฌ์‹ธ๋Š” ๋ฐฉ์‹์œผ๋กœ ์žฅ์‹์„ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด ๊ด€๊ณ„

์žฅ์‹์€ ์–ด๋–ค ๊ฐ์ฒด์— ์ฑ…์ž„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

- 58 -

Page 59: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ ์—ฌ๋Ÿฌ ๋ฃฉ-์•ค-ํ•„ ์ง€์›(1/2)

์ด์‹์„ฑ(portability) ํ™•๋ณด

๋ฃฉ-์•ค-ํ•„ ํ‘œ์ค€์˜ ๋‹ค์–‘์„ฑ์ด ์ด์‹์„ฑ์˜ ์žฅ์• ๊ฐ€ ๋จ

๋ฃฉ-์•ค-ํ•„์€ ์œ ์‚ฌํ•œ UI ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

๊ธฐ์กด ๋ฃฉ-์•ค-ํ•„์„ ์ง€์›ํ•˜๊ณ , ๋ฏธ๋ž˜์˜ ๋ฃฉ-์•ค-ํ•„ ์—ญ์‹œ ์ง€์›ํ•˜์—ฌ์•ผ ํ•จ

๊ฐ์ฒด ์ƒ์„ฑ ์ถ”์ƒํ™”

๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์œ„์ง“(๊ฐ€์‹œ์ ์ธ Glyph)์ด ํ•„์š”ํ•จ

โ€ข ์œ„์ง“ ์ถ”์ƒํด๋ž˜์Šค, ์˜ˆ, ScrollBar๋Š” ์ผ๋ฐ˜์ ์ธ ์Šคํฌ๋กค๋ง ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ Glyph ์ธํ„ฐํŽ˜์ด์Šค

โ€ข ์œ„์ง“ ์‹ค์žฌํด๋ž˜์Šค ์ง‘ํ•ฉ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฃฉ-์•ค-ํ•„์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ์œ„์ง“. ์ฆ‰, MotifScrollBar

์œ„์ง“ ๊ฐ์ฒด์˜ ์ƒ์„ฑ

โ€ข GuiFactory guiFactory = GuiFactory.getFactory(PlatformType.Motif):

โ€ข ScrollBar scrollBar = guiFactory.createScrollBar();

โ€ข Motif ์šฉ scrollBar๊ฐ€ ์ƒ์„ฑ๋จ

- 59 -

Page 60: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์„ค๊ณ„ ์ด์Šˆ โ€“ ์—ฌ๋Ÿฌ ๋ฃฉ-์•ค-ํ•„ ์ง€์›(2/2)

ํŒฉํ† ๋ฆฌ๊ฐ€ UI ์œ„์ง“์ง‘ํ•ฉ(product object)์„ ์ƒ์„ฑํ•จ

Abstract Factory ํŒจํ„ด

- 60 -

Page 61: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์š”์•ฝ (๋””์ž์ธ ํŒจํ„ด ์‚ฌ๋ก€์—ฐ๊ตฌ)

Lexi ๊ฐœ๋ฐœ์— ์‚ฌ์šฉํ•œ ํŒจํ„ด๋“ค

Composite ํŒจํ„ด

Strategy ํŒจํ„ด

Decorator ํŒจํ„ด

Abstract Factory ํŒจํ„ด

- 61 -

Page 62: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์š”์•ฝ (๋””์ž์ธ ํŒจํ„ด ๊ฐœ์š”)

๋””์ž์ธ ํŒจํ„ด์€ ์„ค๊ณ„์ž์˜ ์‚ฌ๊ณ ๋ฅผ ์ฒด๊ณ„ํ™” ํ•˜์—ฌ ์ค€๋‹ค.

๋””์ž์ธ ํŒจํ„ด์€ ์‹ ์†ํ•œ ํ•ด๊ฒฐ์ฑ… ์ฐพ๊ธฐ๋ฅผ ๋„์™€์ค€๋‹ค.

๋””์ž์ธ ํŒจํ„ด์€ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜ ์‘์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

๋””์ž์ธ ํŒจํ„ด์€ Over-engineering์œผ๋กœ ์ด๋Œ ์ˆ˜๋„ ์žˆ๋‹ค.

- 62 -

Page 63: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

- 63 -

๊ต์œก ์ผ์ •ํ‘œ

์›”2์ผ์ฐจ

(ํ™”์š”์ผ)์ˆ˜ ๋ชฉ ๊ธˆ

2์›” 23์ผ 2์›” 24์ผ 2์›” 25์ผ 2์›” 26์ผ 2์›” 27์ผ

ํŒจํ„ด ๊ฐœ์š” GoF ํŒจํ„ด โ… 

- Creational Patterns

- Structural Patterns

GoF ํŒจํ„ด โ…ก

- Behavioral Patterns

๋ณตํ•ฉํŒจํ„ด

- Role Object

- AOM

POSAํŒจํ„ด

- Basic Patterns

Page 64: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

2. GoF ์ƒ์„ฑ ํŒจํ„ด

2.1 Singleton ํŒจํ„ด

2.2 Abstract Factory ํŒจํ„ด

2.3 Prototype ํŒจํ„ด

2.4 Builder ํŒจํ„ด

2.5 ๊ธฐํƒ€ ์ƒ์„ฑ ํŒจํ„ด ์†Œ๊ฐœ

- 64 -

Page 65: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

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

๊ฐ•์˜ ๊ตฌ์„ฑ

Problem ์ œ์‹œ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

โ€ข Problem ํ•ด๊ฒฐ ์‹œ ์ ์šฉํ•œ ํŒจํ„ด ์†Œ๊ฐœ

โ€ข ๋ชจ๋ธ ๋ฐ ์†Œ์Šค ๊ฒ€ํ† 

โ€ข ๋™์ผ ๋ฒ”์ฃผ๋‚ด ๋‹ค๋ฅธ ํŒจํ„ด๋“ค ๊ฐ„๋žต ์†Œ๊ฐœ

- 65 -

Page 66: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

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

์‹ค์Šต ์ฐธ์กฐ

IDE Tool : Eclipse

Java ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- 66 -

Page 67: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

2.1 Singleton ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 67 -

Page 68: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด

Problem ์ œ์‹œ

ํ”„๋ฆฐํ„ฐ ์Šคํ’€์€ ์‹œ์Šคํ…œ์— ์˜ค์ง ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ํ”„๋ฆฐํ„ฐ ์Šคํ’€ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ A์”จ๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๋„๋ก ๊ฒ€์‚ฌํ•˜๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ ํŽธ๋ฆฌํ•œ ์ ‘๊ทผ์„ ์œ„ํ•ด ์ „์—ญ๋ณ€์ˆ˜(static)๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ ‘๊ทผํ•˜๋„๋ก ํ•˜์˜€๋‹ค. ์ด ์‚ฌ์‹ค์„ ์ œ๋Œ€๋กœ ์ „๋‹ฌ๋ฐ›์ง€ ๋ชปํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ”„๋ฆฐํ„ฐ ์Šคํ’€ ๊ฐ์ฒด๋ฅผ ์ž„์˜๋กœ ์ƒ์„ฑํ•˜๋ ค๋‹ค ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๊ณค ํ•ด์„œ ์›์„ฑ์ด ํฌ๋‹ค.์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€?

- 68 -

PrintSpool

Client

Client

Client

๋™์ผํ•œ ๊ฐ์ฒด ์‚ฌ์šฉ

Page 69: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด

PrintSpool ์†Œ์Šค

- 69 -

public class PrintSpool {

public static int numOfinstance = 0;

public static PrintSpool SPOOL;

public PrintSpool() {

numOfinstance++;

if (numOfinstance > 1) {

throw new RuntimeException("์ด ์ธ์Šคํ„ด์Šค๋Š” 2๊ฐœ ์ด์ƒ ์ƒ์„ฑ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค");

}

}

public void print(String string) {

System.out.println("์ถœ๋ ฅ : " + string);

}

}

Page 70: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด

Client ์†Œ์Šค

- 70 -

public class Client {

public static void main(String[] args) {

print1();

// ๋งŽ์€ ์ž‘์—… ํ›„

print2();

}

private static void print1() {

PrintSpool.SPOOL = new PrintSpool();

PrintSpool.SPOOL.print("๋””์ž์ธ ํŒจํ„ด");

}

private static void print2() {

PrintSpool.SPOOL = new PrintSpool();

PrintSpool.SPOOL.print("Creational ํŒจํ„ด");

}

}

๋งŽ์€ ์ž‘์—… ํ›„์— ์•ž์—์„œ spool ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฐ๋‹ค.

๋˜๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ์— ์˜ํ•ด ๋‹ค์‹œ ์ƒ์„ฑ๋ ์ˆ˜ ์žˆ๋‹ค.

Page 71: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 71 -

Page 72: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

๊ฐ์ฒด ์ƒ์„ฑ ์ œ์–ดํ•˜๊ธฐ

โ€ข Spool์€ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ธฐ์— ์•„๋ฌด๋‚˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€ข ์•„๋ฌด๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ํ•˜์‹œ์˜ค.

์ผ๊ด€์„ฑ ์žˆ๋Š” ๊ฐ์ฒด ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ œ๊ณต

โ€ข ์‹œ์Šคํ…œ์— ์˜ค์ง ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ํ•˜์‹œ์˜ค.

โ€ข ๋…ผ์˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์‹œ์˜ค.

- 72 -

Page 73: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œํ•  ๊ฒƒ.

- 73 -

Page 74: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Singleton ํŒจํ„ด

์˜๋„

ํด๋ž˜์Šค์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ

์ด์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์–ด๋””์—์„œ๋“ ์ง€ ํ•˜๋‚˜๋กœ๋งŒ ํ†ต์ผํ•˜์—ฌ ์ œ๊ณต

๋™๊ธฐ

์‹œ์Šคํ…œ์— ๋งŽ์€ ํ”„๋ฆฐํ„ฐ๊ฐ€ ์žˆ๋”๋ผ๋„ ํ”„๋ฆฐํ„ฐ ์Šคํ’€์€ ํ•˜๋‚˜์ด์–ด์•ผ ํ•จ

์œˆ๋„์šฐ๊ฐ€ ๋งŽ๋”๋ผ๋„ ์œˆ๋„์šฐ ๋งค๋‹ˆ์ €๋Š” ์‹œ์Šคํ…œ์— ํ•˜๋‚˜์ด์–ด์•ผ ํ•จ

- 74 -

PrintSpool

- singleton

- PrintSpool

+ getInstance () : PrintSpool

Page 75: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Singleton ํŒจํ„ด

Singleton ๊ตฌํ˜„ ์˜ˆ

- 75 -

public class PrintSpool {

private static PrintSpool singleton = new PrintSpool();

private PrintSpool() {

}

public static PrintSpool getInstance() {

return singleton;

}

public void print(String string) {

System.out.println("์ถœ๋ ฅ : " + string);

}

}

Page 76: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Singleton ํŒจํ„ด

์ ์šฉ

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง ํ•˜๋‚˜์ด์–ด์•ผ ํ•จ์„ ๋ณด์žฅ

์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ž˜ ์ •์˜๋œ ์ ‘๊ทผ ๋ฐฉ์‹ ์ œ๊ณต

- 76 -

Page 77: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

2.2 Abstract Factory ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 77 -

Page 78: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(1/5)

Problem ์ œ์‹œ

๋‹ค์–‘ํ•œ ๊ณ ๊ฐ์„ ๋Œ€์ƒ์œผ๋กœ ์˜์—…ํ•˜๋Š” A์”จ๋Š” ์ž์‹  ๋งŒ์˜ ๊ณ ๊ฐ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ์„ ๋Š๊ผˆ๋‹ค. ์ดˆ๊ธฐ ๋””์ž์ธ์—๋Š” A์”จ ๊ณ ๊ฐ์ด ์ฃผ๋กœ ๊ตญ๋‚ด์ธ์œผ๋กœ ๋˜์–ด ์žˆ์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋‚˜ ์˜์—…์„ ํ•˜๋ฉด์„œ ์™ธ๊ตญ์— ๊ฑฐ์ฃผํ•˜๋Š” ๊ณ ๊ฐ์ด ์ ์ฐจ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜์—ˆ๊ณ , A์”จ๋Š” ์ฃผ์†Œ์™€์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ๊ฑฐ์ฃผํ•˜๋Š” ๊ตญ๊ฐ€์— ๋งž๊ฒŒ ์ƒ์„ฑ๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.

- 78 -

Page 79: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(2/5)

Main ์†Œ์Šค

- 79 -

public static void main(String[] args) throws Exception {

System.out.println("๊ตญ๋‚ด ๊ฑฐ์ฃผ ์ฃผ์†Œ ๋ฐ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.");

Client client = new Client();

KRAddress krAddress = client.createAddress("KR");

krAddress.set...

KRPhoneNumber krPhoneNumber = client.createPhoneNumber("KR");

krPhoneNumber.set...

System.out.println("์ฃผ์†Œ : " + krAddress.getFullAddress());

System.out.println("์ „ํ™”๋ฒˆํ˜ธ : (" + krPhoneNumber.getCountryCode() + ") โ€œ

+ krPhoneNumber.getPhoneNumber());

}

Page 80: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(3/5)

Client ์†Œ์Šค

- 80 -

/**

* ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

* @param countryType

* @return KRAddress

*/

public KRAddress createAddress(String countryType) {

KRAddress krAddress = null;

if (countryType.equals("KR")) {

krAddress = new KRAddress();

}

return krAddress;

}

Page 81: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(4/5)

Client ์†Œ์Šค

- 81 -

/**

* ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

* @param countryType

* @return

*/

public KRPhoneNumber createPhoneNumber(String countryType) {

KRPhoneNumber krPhoneNumber = null;

if (countryType.equals("KR")) {

krPhoneNumber = new KRPhoneNumber();

}

return krPhoneNumber;

}

Page 82: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(5/5)

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 82 -

Page 83: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

โ€ข ๋ฏธ๊ตญ์— ๊ฑฐ์ฃผํ•˜๋Š” ๊ณ ๊ฐ์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ๊ฒฝ์šฐ ์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ์‹œ์ผœ์•ผ ํ•  ๋ถ€๋ถ„์€ ์–ด๋””์ธ์ง€ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์— ์ ์šฉํ•œ ์‚ฌํ•ญ์„ ์‹คํ–‰ํ•˜์—ฌ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์‹œ์˜ค.

๋ณ€๊ฒฝ์˜ ๊ตญ์ง€ํ™” (Localization of Changes)

โ€ข ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ตญ์ง€ํ™”์‹œํ‚ด์œผ๋กœ์จ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ€๊ฒฝ์„ ๊ตญ์ง€ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ์ž์‹ ์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์˜†์— ์žˆ๋Š” ์‚ฌ๋žŒ๊ณผ ๋น„๊ต ํ† ์˜ํ•˜์‹œ์˜ค.

- 83 -

Page 84: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œ

- 84 -

Page 85: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(1/9)

์˜๋„

๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๊ด€๋ จ์„ฑ์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•จ

์„œ๋กœ ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•จ

๋™๊ธฐ

Problem์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Abstract Factory ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ์ถ”์ƒํ™” ๊ฒฐ์ •ํ•˜๊ธฐ

โ€ข ๋ณ€๊ฒฝ์˜ ๊ตญ์ง€ํ™” (Localization of Changes)

- 85 -

Page 86: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(2/9)

์ถ”์ƒํ™” ๊ฒฐ์ •ํ•˜๊ธฐ

์ด๋ฏธ ๊ตญ๋‚ด์— ๊ฑฐ์ฃผํ•˜๋Š” ๊ณ ๊ฐ ์ฃผ์†Œ์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Œ

ํ•˜์ง€๋งŒ, ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๊ณ ๊ฐ ์ฃผ์†Œ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด์„œ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋„์ถœํ•ด์•ผ ํ•จ

- 86 -

Address

+ getFullAddress() : String

KRAddress USAddress

+ getFullAddress() : String + getFullAddress() : String

๊ฐ๊ฐ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” getFullAddress() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ

ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ์™ธ ์šฐํŽธ๋ฒˆํ˜ธ, ์‹œ, ์ง€์—ญ(๊ตฌ/๊ตฐ) ๋“ฑ ์ •์˜๋œ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งŒ์•ฝ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตญ๋‚ด์— ๊ฑฐ์ฃผํ•˜๋Š”๊ณ ๊ฐ ์ฃผ์†Œ๋ฅผ ์›ํ•œ๋‹ค๋ฉด KRAddress ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. getFullAddress() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ตญ๋‚ด ์ฃผ์†Œ ํ‘œ๊ธฐ๋ฒ•์„ ๊ฐ€์ ธ์˜จ๋‹ค.

USAddress ํ•˜์œ„ ํด๋ž˜์Šค๋„ ๋™์ผํ•˜๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ getFullAddress()๋ฅผ ๋ฏธ๊ตญ์ฃผ์†Œ ํ‘œ๊ธฐ๋ฒ•์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

public String getFullAddress() {

return getPostalCode() + SPACE + getCountry()

+ SPACE + getCity() + SPACE + getRegion()

+ SPACE + getAddr();

}

public String getFullAddress() {

return getAddr() + SPACE + getCity() + COMMA

+ SPACE + getRegion() + SPACE + getPostalCode()

+ SPACE + getCountry();

}

๋งŒ์•ฝ, ํ”„๋ž‘์Šค ๊ฑฐ์ฃผ ๊ณ ๊ฐ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ???

Page 87: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(3/9)

์ถ”์ƒํ™” ๊ฒฐ์ •ํ•˜๊ธฐ

๊ณ ๊ฐ์˜ ์ „ํ™”๋ฒˆํ˜ธ๋„ ์œ„์™€ ๋™์ผํ•จ. ๋‹จ, ๊ฐ๊ฐ์˜ ์ „ํ™”๋ฒˆํ˜ธ์˜ ๊ตญ๊ฐ€ ์ฝ”๋“œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋ฉฐ ์ด๋ฅผ ์ •์ ์ธ ํ˜•ํƒœ๋กœ ์ •์˜ํ•ด์•ผ ํ•จ

- 87 -

PhoneNumber

+ getCountryCode() : String

KRPhoneNumber

- COUNTRY_CODE ; String = 82

USPhoneNumber

- COUNTRY_CODE : String = 01

+ getCountryCode() : String + getCountryCode() : String

์•ž์˜ Address ํด๋ž˜์Šค ์ •์˜์™€ ๋™์ผํ•˜๋‹ค. PhoneNumber ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๋Š”getCountryCode() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์•ผ ํ•œ๋‹ค.

ํด๋ž˜์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ์ „ํ™”๋ฒˆํ˜ธ์˜๊ตญ๊ฐ€์ฝ”๋“œ๊ฐ€ ์ •์˜๋˜๋ฏ€๋กœ ์ด๋ฅผ ์ •์ ์œผ๋กœ ์„ ์–ธํ•˜๊ณ  getCountryCode() ๋ฉ”์†Œ๋“œ๋Š” ์ •์ ์œผ๋กœ ์„ ์–ธ๋œ ๊ฐ’์„๋ฆฌํ„ด ํ•œ๋‹ค.

์•ž์˜ ์„ค๋ช…๊ณผ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜๋ฉฐgetCountryCode() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•œ๋‹ค.

private static final String COUNTRY_CODE = "82";

public String getCountryCode() {

return COUNTRY_CODE;

}

private static final String COUNTRY_CODE = "01";

public String getCountryCode() {

return COUNTRY_CODE;

}

Page 88: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(4/9)

๋ณ€๊ฒฝ์˜ ๊ตญ์ง€ํ™” (Localization of Changes)

์•ž์„œ ์ถ”์ƒํ™”์‹œํ‚จ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•  ๊ฒƒ์ธ๊ฐ€? ํด๋ผ์ด์–ธํŠธ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์œ ์ง€๋ณด์ˆ˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ

- 88 -

public Address createAddress(String countryType) {

Address address = null;

if (countryType.equals("KR")) {

address = new KRAddress();

}

else if countryType.equals(โ€œUS")) {

address = new UAddress();

}

return address;

}

public PhoneNumber createPhoneNumber(String countryType) {

PhoneNumber phoneNumber = null;

if (countryType.equals("KR")) {

phoneNumber = new KRPhoneNumber();

}

else if countryType.equals(โ€œUS")) {

phoneNumber = new USPhoneNumber();

}

return phoneNumber;

}

Tight coupling & Weak cohesion

์•ž์„œ ์ œ์‹œํ•œ ํ”„๋ž‘์Šค ๊ฑฐ์ฃผ ๊ณ ๊ฐ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์•„๋ž˜์˜์†Œ์Šค๊ฐ€ createAddress() ๋ฉ”์†Œ๋“œ์™€createPhoneNumber() ๋ฉ”์†Œ๋“œ์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.

else if countryType.equals(โ€œFR")) {

address = new FRddress();

}

else if countryType.equals(โ€œFR")) {

phoneNumber = new FRPhoneNumber();

}

add source

add source

๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด์„œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๊ตญ์ง€ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Page 89: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

public Address createAddress(String countryType) {

AddressFactory addressFactory = getAddressFactory(countryType);

return addressFactory.createAddress();

}

public PhoneNumber createPhoneNumber(String countryType) {

AddressFactory addressFactory = getAddressFactory(countryType);

return addressFactory.createPhoneNumber();

}

private AddressFactory getAddressFactory(String countryType) {

if (countryType.equals("KR")) return new KRAddressFactory();

else if (countryType.equals("US")) return new USAddressFactory();

return null;

}public class USAddressFactory implements AddressFactory {

public Address createAddress() {return new USAddress();}

public PhoneNumber createPhoneNumber() { return new USPhoneNumber();}

}

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(5/9)

๋ณ€๊ฒฝ์˜ ๊ตญ์ง€ํ™” (Localization Of Changes)

์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค์˜ ์—ฌ๋Ÿฌ ๊ณณ์— ์˜ํ–ฅ์„ ๋ฏธ์นจ

๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Factory ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

- 89 -

Client<<interface>>

AddressFactory

+ createAddress() : Address

+ createPhoneNumber() : PhoneNumber

KRAddressFactory

+ createAddress() : Address

+ createPhoneNumber() : PhoneNumber

USAddressFactory

+ createAddress() : Address

+ createPhoneNumber() : PhoneNumber

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

์ถ”์ƒํ™”๋œ Factory์˜ ํ•˜์œ„ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ ์ž์‹ ์˜ ํ˜•์‹์— ๋งž๋Š” ๊ตฌ์ƒํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Page 90: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(6/9)

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 90 -

public static void main(String[] args) throws Exception {

Client client = new Client();

System.out.println(">> ๊ตญ๋‚ด ๊ฑฐ์ฃผ ์ฃผ์†Œ ๋ฐ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.");

System.out.println("์ฃผ์†Œ : " + krAddress.getFullAddress());

System.out.println("์ „ํ™”๋ฒˆํ˜ธ : (" + krPhoneNumber.getCountryCode() + ") " + krPhoneNumber.getPhoneNumber());

System.out.println();

System.out.println(">> ํ•ด์™ธ ๊ฑฐ์ฃผ ์ฃผ์†Œ ๋ฐ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.");

System.out.println("Address : " + usAddress.getFullAddress());

System.out.println("PhoneNumber : (" + usPhoneNumber.getCountryCode() + ") " + usPhoneNumber.getPhoneNumber());

}

Page 91: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(7/9)

์ ์šฉ

์ƒ์„ฑ๋˜๊ณ  ๊ตฌ์„ฑ๋˜๊ณ  ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‹œ์Šคํ…œ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ

ํ•˜๋‚˜ ์ด์ƒ์˜ ์ œํ’ˆ๊ตฐ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ์‹œ์Šคํ…œ์„ ์„ค์ •ํ•ด์•ผ ํ•˜๊ณ  ํ•œ๋ฒˆ ๊ตฌ์„ฑํ•œ ์ œํ’ˆ์„๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๋•Œ

๊ด€๋ จ๋œ ๊ฐ์ฒด๊ตฐ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์„œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ณ , ์ด ์ œํ’ˆ์ด ๊ฐ–๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์„ ๋”ฐ๋ผ์•ผ ํ•  ๋•Œ

์ œํ’ˆ์— ๋Œ€ํ•œ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ทธ๋“ค์˜ ๊ตฌํ˜„์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

- 91 -

Page 92: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(8/9)

๊ตฌ์กฐ

- 92 -

Client

<<interface>>

ProductA

<<interface>>

ProductB

ProductA1 ProductA2

ProductB1 ProductB2

<<interface>>

AbstractFactory

+ createProductA() : ProductA+ createProductB() : ProductB

ConcreteFactory2

+ createProductA() : ProductA+ createProductB() : ProductB

ConcreteFactory1

+ createProductA() : ProductA+ createProductB() : ProductB

Page 93: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Abstract Factory ํŒจํ„ด(9/9)

Sequence

- 93 -

: Client : AbstractFactory

Ask for ProductA

create ProductA instance

: ProductA : ProductB

Tell Client about ProductA

Use ProductA

Ask for ProductB

create ProductB instance

Tell Client about ProductB

Use ProductB

Page 94: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

2.3 Prototype ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 94 -

Page 95: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(1/6)

Problem ์ œ์‹œ

TV ๋ฆฌ๋ชจ์ปจ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋Š” A์”จ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด S์‚ฌ TV์™€ L์‚ฌ TV๋ฅผ ์ œ์–ดํ•˜๋„๋ก์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. TV๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€ ์†Œ์œ ํ•œ ๊ณ ๊ฐ์€ TV ๋ณ„๋กœ ๋ฆฌ๋ชจ์ปจ์„ ๊ฐ–๊ฒŒ ๋˜์–ด๋ถˆํŽธํ•จ์„ ๋Š๋ผ๊ณ  ์žˆ์–ด A์”จ์—๊ฒŒ ๋ธŒ๋žœ๋“œ์— ๊ด€๊ณ„์—†์ด TV๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌ๋ชจ์ปจ์„์ œ์ž‘ํ•˜๋„๋ก ์š”๊ตฌํ•˜์˜€๋‹ค.

- 95 -

?

Page 96: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(2/6)

SCompanyRemocon

- 96 -

public static void main(String[] args) throws Exception {

SCompanyRemocon remocon = new SCompanyRemocon();

remocon.watchingTV(new SCompanyTV());

}

/**

* S์‚ฌ TV ์‹œ์ฒญ

* @param scompanyTV

*/

public void watchingTV(SCompanyTV scompanyTV) {

scompanyTV.turnOn();

for (int i=0; i<2; i++) {

scompanyTV.changeChannel();

}

scompanyTV.turnOff();

}

Page 97: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(3/6)

LCompanyRemote ์†Œ์Šค

- 97 -

public static void main(String[] args) throws Exception {

LCompanyRemocon remocon = new LCompanyRemocon();

remocon.watchingTV(new LCompanyTV());

}

/**

* L์‚ฌ TV ์‹œ์ฒญ

* @param lcompanyTV

*/

public void watchingTV(LCompanyTV lcompanyTV) {

lcompanyTV.turnOn();

for (int i=0; i<3; i++) {

lcompanyTV.changeChannel();

}

lcompanyTV.turnOff();

}

Page 98: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(4/6)

SCompanyTV ์†Œ์Šค

- 98 -

private static final String[] channels = { "SBS", "KBS2", "KBS1", "MBC", "EBS" };

private int channelIndex = 0;

/** TV ์ผœ๊ธฐ */

public void turnOn() { System.out.println("SCompany TV Turn on..."); }

/** ์ฑ„๋„๋ณ€๊ฒฝ */

public String changeChannel() {

if (channelIndex < 0) channelIndex = channels.length -1;

else if (channelIndex > channels.length -1) channelIndex = 0;

String channel = channels[channelIndex++];

System.out.println("SCompany TV " + channel + " channel change...");

return channel;

}

/** TV ๋„๊ธฐ */

public void turnOff() { System.out.println("SCompany TV Turn off..."); }

Page 99: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(5/6)

LCompanyTV ์†Œ์Šค

- 99 -

private static final String[] channels = { "SBS", "KBS2", "KBS1", "MBC", "EBS" };

private int channelIndex = 0;

/** TV ์ผœ๊ธฐ */

public void turnOn() { System.out.println("LCompany TV Turn on..."); }

/** ์ฑ„๋„๋ณ€๊ฒฝ */

public String changeChannel() {

if (channelIndex < 0) channelIndex = channels.length -1;

else if (channelIndex > channels.length -1) channelIndex = 0;

String channel = channels[channelIndex++];

System.out.println("LCompany TV " + channel + " channel change...");

return channel;

}

/** TV ๋„๊ธฐ */

public void turnOff() { System.out.println("LCompany TV Turn off..."); }

Page 100: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(6/6)

SCompanyRemocon ์‹คํ–‰ ๊ฒฐ๊ณผ

LCompanyRemocon ์‹คํ–‰ ๊ฒฐ๊ณผ

- 100 -

Page 101: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

โ€ข ๋ธŒ๋žœ๋“œ์™€ ๊ด€๊ณ„์—†์ด ๋ฆฌ๋ชจ์ปจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ์ด์™€ S์‚ฌ TV์™€ L์‚ฌ TV์™€์˜ ๊ด€๊ณ„๋ฅผ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์— ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ๊ฐ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜์—ฌ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์‹œ์˜ค.

๋™์  ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ/๋ณต์‚ฌ (Copy of Existing Object)

โ€ข ๊ธฐ์ˆ ์˜ ๋ฐœ๋‹ฌ๋กœ ํ•˜๋‚˜์˜ ์ฑ„๋„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์ค‘ ์ฑ„๋„์„ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‹ค์ค‘ ์ฑ„๋„์„ ์‹œ์ฒญํ•˜๊ธฐ ์œ„ํ•ด์„œ watchingTV ๋ฉ”์†Œ๋“œ ๋‚ด์˜ TV์˜ ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ? (S์‚ฌ TV๋Š” S์‚ฌ TV์ œํ’ˆ ๊ฐ์ฒด๋ฅผ L์‚ฌ TV๋Š” L์‚ฌ TV์ œํ’ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ)

โ€ข ์ž์‹ ์˜ ์ƒ๊ฐ์„ ๊ธฐ์ˆ ํ•˜๊ณ  ์˜†์— ์žˆ๋Š” ์‚ฌ๋žŒ๊ณผ ๋น„๊ต ํ† ์˜ํ•˜์‹œ์˜ค.

- 101 -

public void watchingTV(TV aTV) {

...

TV anotherTV = new ???;

...

}

Page 102: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œํ•  ๊ฒƒ.

- 102 -

Page 103: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(1/11)

์˜๋„

๊ฒฌ๋ณธ์ (prototypical) ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•จ

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๊ฒฌ๋ณธ์„ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

๋™๊ธฐ

Problem ์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Prototype ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ์ถ”์ƒํ™” ๊ฒฐ์ •ํ•˜๊ธฐ

โ€ข ๋™์  ์˜ค๋ธŒ์ ํŠธ ๋ณต์‚ฌ (Copy of Existing Object)

- 103 -

Page 104: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(2/11)

์ถ”์ƒํ™” ๊ฒฐ์ •ํ•˜๊ธฐ

S์‚ฌ TV ํด๋ž˜์Šค์™€ L์‚ฌ TV ํด๋ž˜์Šค๋ฅผ ๋น„๊ตํ•ด ๋ณด๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ–‰์œ„๊ฐ€ ์œ ์‚ฌํ•จ

ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ณตํ†ต์ ์ธ ํŠน์ง•์„ ์ถ”์ถœํ•˜์—ฌ ์ถ”์ƒํด๋ž˜์Šค ์ •์˜๊ฐ€ ํ•„์š”

๋˜ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค ๋ณต์‚ฌ๋ฅผ ์œ„ํ•œ Prototype ์—ญํ• ์„ ๋ถ€๊ฐ€ํ•ด์•ผ ํ•จ

- 104 -

TV

+ turnOn() : void+ changeChannel : String+ turnOff() : void+ getCompany() : String+ clone() : Object

SCompanyTV

- COMPANY_NAME : String = SCompany

LCompanyTV

+ getCompany() : String+ clone() : Object

+ getCompany() : String+ clone() : Object

- COMPANY_NAME : String = LCompany

TV ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๊ณตํ†ต๋œ ํ–‰์œ„๋ฅผ์ •์˜ํ•˜๊ณ  ๊ฐ๊ฐ์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ž์‹ ์— ๋งž๋Š” ํ–‰์œ„๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ธ์Šคํ„ด์Šค ๋ณต์‚ฌ๋ฅผ ์œ„ํ•œ Prototype ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

ํด๋ž˜์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ์ œํ’ˆํšŒ์‚ฌ๊ฐ€ ์ •์˜๋˜๋ฏ€๋กœ ์ด๋ฅผ ์ •์ ์œผ๋กœ ์„ ์–ธํ•œ๋‹ค. ๋˜ํ•œ ์ธ์Šคํ„ด์Šค ๋ณต์‚ฌ๋ฅผ ์œ„ํ•œ ๊ตฌํ˜„๋ถ€๋ถ„์„๋‹ด๋‹นํ•˜๋Š” Concrete Prototype ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

public void turnOn() {...}

public String changeChannel() {

...

return channel;

}

public void turnOff() {...}

public abstract String getCompany();

private static final String COMPANY_NAME = "LCompany";

public String getCompany() { return COMPANY_NAME; }

public Object clone() { return new LCompanyTV(); }

๋™์  ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ/๋ณต์‚ฌ ???

private static final String COMPANY_NAME = โ€œSCompany";

public String getCompany() { return COMPANY_NAME; }

public Object clone() {

try { return super.clone(); }

catch (CloneNotSupportedException cnse) {return null; }

}

Page 105: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(3/11)

๋™์  ์˜ค๋ธŒ์ ํŠธ ๋ณต์‚ฌ (Copy of Existing Object)

Runtime ์‹œ ๋™์ ์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ, ์ด๋•Œ ์ถ”์ƒํ™”๋œ ํƒ€์ž…์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ Prototype์œผ๋กœ ์ •์˜ํ•จ

์ด๋Ÿฌํ•œ Prototype์˜ ๊ตฌ์ƒํด๋ž˜์Šค๋“ค์€ ๊ฐ๊ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์‚ฌํ•  ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ •์˜ํ•ด์•ผํ•˜๋Š”๋ฐ Shallow Copy์™€ Deep Copy๋กœ ๊ตฌ๋ถ„๋จ

- 105 -

SCompanyTV LCompanyTV

+ clone() : Object + clone() : Object

public Object clone() {

return new LCompanyTV();

}

Shallow Copy ์™€ Deep Copy ???public Object clone() {

try { return super.clone(); }

catch (CloneNotSupportedException cnse) { return

null;}

}

TVRemocon

TV

+ clone() : Object

public void watchingTV(TV aTV) {

aTV.turnOn();

System.out.println("๋‹จ์ผ ์ฑ„๋„...");

for (int i=0; i<3; i++) { aTV.changeChannel(); }

System.out.println("๋‹ค์ค‘ ์ฑ„๋„...");

TV anotherTV = (TV) aTV.clone();

anotherTV.changeChannel();

aTV.turnOff();

}

TVRemocon ํด๋ž˜์Šค๋Š” ๋‹ค์ค‘์ฑ„๋„์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์œ„ํ•ด ๋™์ ์œผ๋กœ ์ถ”์ƒํ™”๋œ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Page 106: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(4/11)

Shallow Copy

java.lang.Object ํด๋ž˜์Šค์— ์ •์˜๋œ clone() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์‚ฌํ•จ

์ฃผ์˜ํ•  ์ ์€ clone() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์ž๋Š” ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ

์ด๋•Œ, ์ธ์Šคํ„ด์Šค ๋‚ด์— ํฌํ•จ๋œ ์†์„ฑ ์ค‘ ์ผ๋ถ€๋Š” ์ฐธ์กฐ๋งŒ ๋ณต์‚ฌ๋  ๋ฟ ์š”์†Œ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹˜

- 106 -

public class Person implements Cloneable {

private Car car;

private String name;

..

public Object clone() {

try { return super.clone(); }

catch (... e) { return null; }

}

}

Person

+ clone() : Object

Car- car

public class Car {

private String name;

public Car(String name) { this.name = name; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

}

java.lang.Object ํด๋ž˜์Šค์˜ clone() ๋ฉ”์†Œ๋“œํ˜ธ์ถœํ•˜์—ฌ Person ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.

Page 107: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(5/11)

Shallow Copy

clone() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ Person ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ

- 107 -

public class ShallowCopyTest {

public static void main(String[] args) {

Person person = new Person("์†กํƒœ๊ตญ", "๋‰ด ์‚ฐํƒ€ํŽ˜");

System.out.println("[์›๋ณธ(๋ณ€๊ฒฝ์ „)] ์ด๋ฆ„: " + person.getName() + " ์ž๋™์ฐจ: " + person.getCar().getName());

Person copyPerson = (Person) person.clone();

System.out.println("[๋ณต์‚ฌ๋ณธ(๋ณ€๊ฒฝ์ „)] ์ด๋ฆ„: " + copyPerson.getName() + " ์ž๋™์ฐจ: " + opyPerson.getCar().getName());

copyPerson.setName("๊น€๋™์—ด");

copyPerson.getCar().setName("๊ทธ๋žœ์ ธTG");

System.out.println("[๋ณต์‚ฌ๋ณธ(๋ณ€๊ฒฝํ›„)] ์ด๋ฆ„: " + copyPerson.getName() + " ์ž๋™์ฐจ: " +copyPerson.getCar().getName());

System.out.println("[์›๋ณธ(๋ณ€๊ฒฝํ›„)] ์ด๋ฆ„: " + person.getName() + " ์ž๋™์ฐจ: " + person.getCar().getName());

}

}

โ‘  Person ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

โ‘ก Person ์ธ์Šคํ„ด์Šค ๋ณต์‚ฌ

โ‘ข Person ๋ณต์‚ฌ๋ณธ ์†์„ฑ๋ณ€๊ฒฝ

โ‘ฃ ๋ณ€๊ฒฝ ํ›„ ์›๋ณธ๊ณผ๋ณต์‚ฌ๋ณธ๋‚ด์šฉ ๋น„๊ต ์ถœ๋ ฅ

๋ณต์‚ฌ๋ณธ ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์˜€์œผ๋‚˜ ์›๋ณธ ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€clone() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ธ์Šคํ„ด์Šค ๋ณต์‚ฌ ์‹œ์†์„ฑ์€ ์ฐธ์กฐ๋งŒ ๋ณต์‚ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Page 108: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(6/11)

Deep Copy

clone() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ƒ์„ฑ

์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ

์ด๋•Œ, ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์€ Shallow Copy ์ฒ˜๋Ÿผ ์ฐธ์กฐ๋งŒ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์š”์†Œ ํ•˜๋‚˜ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๊ฒŒ ๋จ

- 108 -

public class Person implements Cloneable {

private Car car;

private String name;

public Person(String name, String carName) {

this.name = name;

car = new Car(carName);

}

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public Car getCar() { return car; }

public Object clone() {

Person person = new Person(name, car.getName());

return person;

}

}

Person

+ clone() : Object

Car- car

public class Car {

private String name;

public Car(String name) { this.name =

name; }

public String getName() { return name; }

public void setName(String name)

{ this.name = name; }

}

java.lang.Object ํด๋ž˜์Šค์˜ clone() ๋ฉ”์†Œ๋“œ๋ฅผ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ด์ „ ์†Œ์Šค์™€ ๋™์ผํ•˜๋‹ค.

Page 109: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(7/11)

Deep Copy

clone() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ Person ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ

- 109 -

public class ShallowCopyTest {

public static void main(String[] args) {

Person person = new Person("์†กํƒœ๊ตญ", "๋‰ด ์‚ฐํƒ€ํŽ˜");

System.out.println("[์›๋ณธ(๋ณ€๊ฒฝ์ „)] ์ด๋ฆ„: " + person.getName() + " ์ž๋™์ฐจ: " + person.getCar().getName());

Person copyPerson = (Person) person.clone();

System.out.println("[๋ณต์‚ฌ๋ณธ(๋ณ€๊ฒฝ์ „)] ์ด๋ฆ„: " + copyPerson.getName() + " ์ž๋™์ฐจ: " + copyPerson.getCar().getName());

copyPerson.setName("๊น€๋™์—ด");

copyPerson.getCar().setName("๊ทธ๋žœ์ ธTG");

System.out.println("[๋ณต์‚ฌ๋ณธ(๋ณ€๊ฒฝํ›„)] ์ด๋ฆ„: " + copyPerson.getName() + " ์ž๋™์ฐจ: " + copyPerson.getCar().getName());

System.out.println("[์›๋ณธ(๋ณ€๊ฒฝํ›„)] ์ด๋ฆ„: " + person.getName() + " ์ž๋™์ฐจ: " + person.getCar().getName());

}

}

โ‘ข Person ๋ณต์‚ฌ๋ณธ ์†์„ฑ๋ณ€๊ฒฝ

๋ณต์‚ฌ๋ณธ ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์˜€์œผ๋‚˜ ์›๋ณธ ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์€ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค. ์ด๋Š” clone() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜์žˆ๋„๋ก ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โ‘  Person ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

โ‘ก Person

์ธ์Šคํ„ด์Šค ๋ณต์‚ฌ

โ‘ฃ ๋ณ€๊ฒฝ ํ›„ ์›๋ณธ๊ณผ๋ณต์‚ฌ๋ณธ๋‚ด์šฉ ๋น„๊ต ์ถœ๋ ฅ

Page 110: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(8/11)

TVRemocon ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 110 -

public static void main(String[] args) {

TVRemocon remocon = new TVRemocon();

SCompanyTV scompanyTV = new SCompanyTV();

System.out.println(scompanyTV.getCompany()

+ " TV ์‹œ์ฒญ...");

remocon.watchingTV(scompanyTV);

}

public static void main(String[] args) {

TVRemocon remocon = new TVRemocon();

LCompanyTV lcompanyTV = new LCompanyTV();

System.out.println(lcompanyTV.getCompany()

+ " TV ์‹œ์ฒญ...");

remocon.watchingTV(lcompanyTV);

}

Shallow Copy Deep Copy

Page 111: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(9/11)

์ ์šฉ

Prototype ํŒจํ„ด์„ ์“ธ ๊ฒฝ์šฐ๋Š” ์ œํ’ˆ์˜ ์ƒ์„ฑ, ํ•ฉ์„ฑ, ํ‘œํ˜„ ๋ฐฉ๋ฒ•์— ๋…๋ฆฝ์ ์ธ ์ œํ’ˆ์„ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ

๋Ÿฐํƒ€์ž„ ์‹œ ๋งŒ๋“ค ์ธ์Šคํ„ด์Šค์˜ ํด๋ž˜์Šค๋ฅผ ๋ช…์„ธํ•  ์ˆ˜ ์žˆ์„ ๋•Œ

ํด๋ž˜์Šค ๊ณ„์ธต๋„์™€ ๋ณ‘๋ ฌ์„ฑ์„ ๊ฐ–๋Š” ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์˜ ๊ณ„์ธต์„ ํ”ผํ•ด์•ผ ํ•  ๊ฒฝ์šฐ

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

- 111 -

Page 112: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(10/11)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 112 -

Client

+ operation() : void

Prototype

+ clone() : Prototype

ConcretePrototype1

+clone() : Prototype

ConcretePrototype2

+clone() : Prototype

Page 113: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Prototype ํŒจํ„ด(11/11)

Sequence

- 113 -

: Client original : Prototype

cloned : Prototype

cloned = orignal.clone();

create

copy attributes

Page 114: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

2.4 Builder ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 114 -

Page 115: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(1/5)

Problem ์ œ์‹œ

์‹๋‹น์„ ์šด์˜ํ•˜๋Š” A์”จ๋Š” ๋งค์ผ ์‹๋‹จ์„ ๋ฐ”๊พธ๊ณ  ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ตœ๊ทผ ์›นํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์‹๋‹จ์„ ํ™•์ธํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์•„์ ธ์„œ ์‹๋‹จ์„ ํ…์ŠคํŠธ ํฌ๋งท์œผ๋กœ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ HTML ํฌ๋งท์œผ๋กœ๋„ ๋งŒ๋“ค๊ธฐ๋กœ ํ•˜๊ณ  ํ˜„์žฌ ํ”„๋กœ๊ทธ๋žจ์„ ํ™•์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค

- 115 -

==========================

ใ€Ž11์›” 27์ผ ์‹๋‹จใ€

โ–  ์•„์นจ์‹๋‹จ

-ํ† ์ŠคํŠธ

-์œ ์šฐ

-๋‹ฌ๊ฑ€

โ–  ์ ์‹ฌ์‹๋‹จ

-๋œ์žฅ์ฐŒ๊ฒŒ

-๊น€์น˜

-๊ณ ๋“ฑ์–ด ์กฐ๋ฆผ

==========================

Page 116: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด (2/5)

ํ˜„์žฌ Model

์‹๋‹จ์˜ ๊ตฌ์กฐ๋Š” ์ œ๋ชฉ(title), ์†Œ์ œ๋ชฉ(string), ์‹๋‹จ์•„์ดํ…œ(item)์œผ๋กœ ๊ตฌ์„ฑ

TodayMenu๋Š” ์ด๋ฅผ private ๋ฉ”์†Œ๋“œ๋กœ ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•จ

- 116 -

Page 117: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(3/5)

TodayMenu ์†Œ์Šค

- 117 -

private StringBuilder buffer = new StringBuilder();

public String construct() {

makeTitle("11์›” 27์ผ ์‹๋‹จ");

makeString("์•„์นจ์‹๋‹จ");

makeItems(new String[]{"ํ† ์ŠคํŠธโ€œ,"์œ ์šฐโ€œ,"๋‹ฌ๊ฑ€โ€});

makeString("์ ์‹ฌ์‹๋‹จ");

makeItems(new String[] {"๋œ์žฅ์ฐŒ๊ฒŒโ€œ,"๊น€์น˜โ€œ,"๊ณ ๋“ฑ์–ด ์กฐ๋ฆผโ€});

buffer.append("==========================\n");

return buffer.toString();

}

private void makeTitle(String title) {...}

private void makeString(String str) {...}

private void makeItems(String[] items) {

for (int i = 0; i < items.length; i++) {

buffer.append("-" + items[i] + "\n");

}

}

Page 118: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(4/5)

Client ์†Œ์Šค

- 118 -

public class Client {

public static void main(String[] args) {

TodayMenu todayMenu = new TodayMenu();

String result = todayMenu.construct();

System.out.println(result);

}

}

Page 119: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(5/5)

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 119 -

Page 120: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

Problem ์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

๊ฒฐ๊ณผ ๊ฐ์ฒด ์ƒ์„ฑ ํŒจํ„ด ์ฐพ๊ธฐ

โ€ข ๋ชจ๋“  ์ถœ๋ ฅ์ด ์–‘์‹์— ์ƒ๊ด€์—†์ด ํ•ด์•ผ ํ•  ์ผ๋“ค์€ ๋ฌด์—‡์ธ๊ฐ€?

โ€ข ์‹๋‹จ์„ ์ถœ๋ ฅํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ์ฐพ์œผ์‹œ์˜ค.

์ถ”์ƒํ™”ํ•˜๊ธฐ

โ€ข ์ถœ๋ ฅ ์–‘์‹์— ๋”ฐ๋ผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ณตํ†ต์ ์„ ์ฐพ์•„ ์ด๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ๊ณตํ†ต์  ์ค‘ ๊ตฌํ˜„์ด ๋™์ผํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๋ถ„๋ฆฌํ•˜์‹œ์˜ค.

โ€ข ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜์‹œ์˜ค.

- 120 -

Page 121: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œํ•  ๊ฒƒ.

- 121 -

Page 122: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(1/8)

์˜๋„

๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ

์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด๋ผ๋„ ๋™์ผํ•œ ๊ตฌ์ถ• ๊ณต์ •์„ ์‚ฌ์šฉ

๋™๊ธฐ

Problem ์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Builder ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•จ

โ€ข ๋ณต์žกํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ํŒจํ„ด ์ฐพ๊ธฐ

โ€ข ์ƒ์„ฑ ํŒจํ„ด ์ถ”์ƒํ™”

- 122 -

Page 123: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(2/8)

๋ณต์žกํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ํŒจํ„ด ์ฐพ๊ธฐ

์‹๋‹จ์€ ์‹๋‹จ์ œ๋ชฉ, ์†Œ์ œ๋ชฉ, ์•„์ดํ…œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ทธ ์–‘์‹์— ์ƒ๊ด€ ์—†์ด ์ œ๊ณต๋˜์–ด์•ผ ํ•  ๊ธฐ๋Šฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Œ

- 123 -

์‹๋‹จ ์ œ๋ชฉ

==========================

ใ€Ž11์›” 27์ผ ์‹๋‹จใ€

โ–  ์•„์นจ์‹๋‹จ-ํ† ์ŠคํŠธ-์œ ์šฐ-๋‹ฌ๊ฑ€

โ–  ์ ์‹ฌ์‹๋‹จ-๋œ์žฅ์ฐŒ๊ฒŒ-๊น€์น˜-๊ณ ๋“ฑ์–ด ์กฐ๋ฆผ==========================

์†Œ์ œ๋ชฉ

์†Œ์ œ๋ชฉ

์•„์ดํ…œ

์•„์ดํ…œ

์•„์ดํ…œ

์•„์ดํ…œ

์ œ๋ชฉ์ƒ์„ฑ (makeTitle)

์†Œ์ œ๋ชฉ์ƒ์„ฑ (makeString)

์•„์ดํ…œ๋“ค ์ƒ์„ฑ (makeItems)

๊ฒฐ๊ณผ์ƒ์„ฑ (getResult)

Page 124: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(3/8)

์ƒ์„ฑ ํŒจํ„ด ์ถ”์ƒํ™”

๊ณตํ†ต์  ์ค‘ ๋™์ผํ•œ ํ–‰์œ„๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌ

์ถ”์ƒํ™”๋œ ํ–‰์œ„์™€ ๊ตฌ์ฒดํ™”๋œ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ

- 124 -

MenuBuilder

+ makeTitle(title) : void+ makeString(str) : void+ makeItems(items) : void+ getResult() : Object

TodayMenu

+ construct() : Object

TextMenuBuilder

+ makeTitle(title) : void+ makeString(str) : void+ makeItems(items) : void+ getResult() : Object

HtmlMenuBuilder

+ makeTitle(title) : void+ makeString(str) : void+ makeItems(items) : void+ getResult() : Object

- builder

public Object construct() {

builder.makeTitle(โ€œ...");

builder.makeString(โ€œ...");

builder.makeItems(...);

builder.makeString(โ€œ...");

...

return builder.getResult();

}

์–‘์‹์— ์ƒ๊ด€์—†์ด ๋ฉ”๋‰ด๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

์–‘์‹์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ builder์—๊ฒŒ ๋งก๊ธด๋‹ค(์œ„์ž„).

์–‘์‹์— ๋”ฐ๋ผ ๊ตฌํ˜„์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผํ•  ํ–‰์œ„๋“ค์„ ์ •์˜ํ•œ๋‹ค.

public void makeTitle(String title) {

...

}

public void makeString(String str) {

writer.println("<p>" + str + "</p>");

}

public void makeItems(String[] items) {...}

public String getResult() {...}

์–‘์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์„ ์‹ค์ œ ๊ตฌํ˜„ํ•œ๋‹ค.

Page 125: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(4/8)

๋™์ž‘๋ฐฉ๋ฒ•

- 125 -

: Client :MenuBuilder :TextMenuBuilder :HtmlMenuBuilder

Text Builder ์ƒ์„ฑ

๋ฉ”๋‰ด ๊ตฌ์„ฑ

Text Builder ์ „๋‹ฌ

Text ๋ฉ”๋‰ด ๋ฐ˜ํ™˜

๋ฉ”๋‰ด ๊ตฌ์„ฑ (construct)

์ œ๋ชฉ ์ƒ์„ฑ (ํ…์ŠคํŠธ)

์†Œ์ œ๋ชฉ ์ƒ์„ฑ (ํ…์ŠคํŠธ)

์•„์ดํ…œ์ƒ์„ฑ (ํ…์ŠคํŠธ)

HTMLBuilder ์ „๋‹ฌ

HTML Builder ์ƒ์„ฑ

๋ฉ”๋‰ด ๊ตฌ์„ฑ

HTML ํŒŒ์ผ ๋ฐ˜ํ™˜

๋ฉ”๋‰ด ๊ตฌ์„ฑ (construct)

์ œ๋ชฉ ์ƒ์„ฑ (HTML ํŒŒ์ผ)

์†Œ์ œ๋ชฉ ์ƒ์„ฑ (HTML ํŒŒ์ผ)

์•„์ดํ…œ์ƒ์„ฑ (HTML ํŒŒ์ผ)

Page 126: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(5/8)

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 126 -

public static void main(String[] args) {

TodayMenu todayMenu = new TodayMenu();

todayMenu.setBuilder(new TextMenuBuilder());

String textResult = (String) todayMenu.construct();

System.out.println(textResult);

System.out.println();

todayMenu.setBuilder(new HtmlMenuBuilder());

String htmlResult = (String) todayMenu.construct();

System.out.println("๋ฉ”๋‰ด๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (" + htmlResult + ")");

}

Page 127: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(6/8)

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 127 -

Page 128: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(7/8)

์ ์šฉ

๋ณตํ•ฉ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•ฉ์„ฑํ•˜๋Š” ์š”์†Œ์™€ ๋…๋ฆฝ์ ์ผ ๋•Œ

โ€ข ํ•ฉ์„ฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ด€์—ฌํ•˜์ง€ ์•Š์Œ

โ€ข ํ•ฉ์„ฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ๋‚˜์ค‘์— ๋™์ ์œผ๋กœ ๊ฒฐ์ •

ํ•ฉ์„ฑํ•  ๊ฐ์ฒด๋“ค์˜ ํ‘œํ˜„์ด ๋‹ค๋ฅด๋”๋ผ๊ณ  ๋™์ผํ•œ ๊ตฌ์ถ• ๊ณต์ •์„ ๊ฐ€์ ธ์•ผ ํ•  ๋•Œ

๊ณ ๋ ค์‚ฌํ•ญ

์œ„ ์š”๊ตฌ ์‚ฌํ•ญ์„ Template Method ํŒจํ„ด์œผ๋กœ ํ•ด๊ฒฐํ•ด ๋ณด์ž

Builder ํŒจํ„ด๊ณผ ์–ด๋–ค ์ ์ด ๋‹ค๋ฅธ๊ฐ€?

- 128 -

Page 129: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Builder ํŒจํ„ด(8/8)

๊ตฌ์กฐ

- 129 -

Director

+ construct()

Builder

+ buildPart

+ getResult()

ConcreteBuilder

+ buildPart

+ getResult()

Product

- builder

๋ณตํ•ฉ๊ฐ์ฒด์˜ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ด๋‹นํ•œ๋‹ค.

๋ณตํ•ฉ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋‹จ์œ„๊ฐ์ฒด๋Š”builder์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค.

builder . buildPart

Page 130: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

2.5 ๊ธฐํƒ€ ์ƒ์„ฑ ํŒจํ„ด ์†Œ๊ฐœ

Factory Method ํŒจํ„ด

- 130 -

Page 131: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Factory Method ํŒจํ„ด (1/4)

์˜๋„

๊ฐ์ฒด ์ƒ์„ฑ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜์ง€๋งŒ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ์ง€๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์ด๋ฃจ์–ด์ง

์„œ๋ธŒ ํด๋ž˜์Šค์—๊ฒŒ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ์œ„์ž„

๋™๊ธฐ

์‹ ๋ถ„์ฆ(ID ์นด๋“œ)์„ ๋งŒ๋“œ๋Š” ๊ณต์žฅ์„ ์ƒ์„ฑ

์ œํ’ˆ์„ ์ƒ์„ฑํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ํ–ฅํ›„ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ œํ’ˆ์ด ๋‚˜์˜ค๋”๋ผ๋„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ

- 131 -

ID ์นด๋“œ๊ณต์žฅ

ID ์นด๋“œ

์—ด์‡  ๊ณต์žฅ ์—ด์‡ 

์ƒ์„ฑ ํ›„ ๋“ฑ๋ก

์ƒ์„ฑ ํ›„ ๋“ฑ๋ก

๊ณต์žฅ ์ œํ’ˆ

Page 132: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Factory Method ํŒจํ„ด(2/4)

๋™๊ธฐ

- 132 -

Factory

+ create

+ createProduct

+ regiseterProduct

Product

+ use

IDCardFactory

- owners

+ createProduct

+ regiseterProduct

+ getOwners

IDCard

+ owner

+ use

+ getOwner

create

create

ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ

return new IDCard(owner);

Product p =

createProduct(owner);

registerProduct(p);

return p;

๋™์ผํ•œ ์ƒ์„ฑ๊ณผ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘์„ฑ

๊ฐ์ฒด ์ƒ์„ฑ์€ ์„œ๋ธŒ ํด๋ž˜์Šค์—๊ฒŒ ์œ„์ž„

Page 133: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Factory Method ํŒจํ„ด(3/4)

์ ์šฉ

์ƒ์„ฑํ•  ๊ฐ์ฒด ํƒ€์ž…์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์„ ๋•Œ

์ƒ์„ฑํ•  ๊ฐ์ฒด๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ์ฑ…์ž„์„ ์„œ๋ธŒํด๋ž˜์Šค์— ์ •์˜ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ

๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ์„œ๋ธŒ ํด๋ž˜์Šค์—๊ฒŒ ์œ„์ž„ํ•˜๊ณ  ์„œ๋ธŒ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์€๋‹‰

- 133 -

Page 134: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Factory Method ํŒจํ„ด(4/4)

๊ตฌ์กฐ

- 134 -

Creator

+ factoryMethod()

+ anOperation()

ConcreteCreator

+ factoryMethod()

Product

ConcreteProductCreate

...

Product = factoryMethod();

...

Return new ConcreteProduct()

Page 135: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

3. GoF ๊ตฌ์กฐ ํŒจํ„ด

3.1 Composite ํŒจํ„ด

3.2 Proxy ํŒจํ„ด

3.3 Bridge ํŒจํ„ด

3.4 ๊ธฐํƒ€ ๊ตฌ์กฐ ํŒจํ„ด ์†Œ๊ฐœ

- 135 -

Page 136: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

3.1 Composite ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 136 -

Page 137: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(1/7)

Problem ์ œ์‹œ

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

- 137 -

ํšŒ์‚ฌ

๊ฐœ๋ฐœ๋ถ€์„œ ๊ฐœ๋ฐœ๋ถ€์„œ

์ง์› ์ง์› ์ง์› ์ง์›

ํšŒ์‚ฌ

๊ฐœ๋ฐœ๋ถ€์„œ ๊ฐœ๋ฐœ๋ถ€์„œ

์ง์› ์ง์› ์ง์› ์ง์›

์ œํ’ˆA ์ œํ’ˆB ๊ตญ๋‚ด ํ•ด์™ธ

์ง์› ์ง์› ์ง์›์ง์›

Page 138: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(2/7)

ํ˜„์žฌ Model์ธ์‚ฌ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํšŒ์‚ฌ(Company), ๋ถ€์„œ(Department) ๊ทธ๋ฆฌ๊ณ ์ง์›(Employee)๋กœ ๊ตฌ์„ฑํ•˜๋ฉฐ ๊ฐ๊ฐ์€ ๊ณ ์œ ํ•œ ํŠน์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ๋“ค์„ ๊ฐ€์ง„๋‹ค.

- 138 -

Department

- name: String

- location: String

+ addEmployee(Department) : void

Employee

- name: String

- gender: String

Company

- name: String

+ addDepartment(Department) : void

+ print() : void

-employees

*-departments

*

Page 139: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(3/7)

Company ์†Œ์Šค

- 139 -

public class Company {

private String name;

private List<Department> departments = new ArrayList<Department>();

...

public void addDepartment(Department department) {

this.departments.add(department);

}

public void print() {

System.out.println("ํšŒ์‚ฌ : " + this.name );

for(int i = 0; i < this.departments.size(); i++) {

Department department = this.departments.get(i);

System.out.println(" - ๋ถ€์„œ : " + department.getName() + ...);

List<Employee> employees = department.getEmployees();

for(int j = 0; j < employees.size(); j++) {

Employee employee = employees.get(j);

System.out.println(" - ์ง์› : " + employee.getName() + ...);

}

...

}

Page 140: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(4/7)

Department ์†Œ์Šค

- 140 -

public class Department {

private String name;

private String location;

public List<Employee> employees = new ArrayList<Employee>();

...

public void addEmployee(Employee employee) {

this.employees.add(employee);

}

...

public List<Employee> getEmployees() {

return employees;

}

}

Page 141: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(5/7)

Employee ์†Œ์Šค

- 141 -

public class Employee {

private String name;

private String gender;

public Employee(String name, String gender) {

this.name = name;

this.gender = gender;

}

public String getName() {

return name;

}

public String getGender() {

return gender;

}

}

Page 142: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(6/7)

Main ์†Œ์Šค

- 142 -

public static void main(String[] args) {

Company company = new Company("๋ฏธ๋ž˜์†Œํ”„ํŠธ");

Department deptDev = new Department("๊ฐœ๋ฐœ๋ถ€์„œ", "์„์ง€๋กœ");

deptDev.addEmployee(new Employee("๊น€๊ฐœ๋ฐœ", "๋‚จ์ž"));

deptDev.addEmployee(new Employee("์ด๊ฐœ๋ฐœ", "์—ฌ์ž"));

company.addDepartment(deptDev);

Department deptSale = new Department("์˜์—…๋ถ€์„œ", "์ข…๋กœ");

deptSale.addEmployee(new Employee("๊น€์˜์—…", "๋‚จ์ž"));

deptSale.addEmployee(new Employee("์ด์˜์—…", "์—ฌ์ž"));

company.addDepartment(deptSale);

company.print();

}

Page 143: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(7/7)

Main ํด๋ž˜์Šค ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

- 143 -

Page 144: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

โ€ข ๋ถ€์„œ ๋ฐ‘์— ํ•˜์œ„ ๋ถ€์„œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ถ”์ƒํ™”ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„์ฐพ์•„ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ์ถ”์ƒํ™”๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด ๊ณตํ†ต์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ฑ…์ž„์„ ์ฐพ์•„ ์ƒ์œ„ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜์‹œ์˜ค.

์ฑ…์ž„์˜ ์œ„์ž„

โ€ข ์กฐ์ง์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์ฑ…์ž„์„ ๊ฐ€์ง„ print ๋ฉ”์†Œ๋“œ์— ๋กœ์ง์ด ํ•œ ๊ณณ์— ์ง‘์ค‘๋˜์ง€ ์•Š๋„๋ก ์ฑ…์ž„์„ ์œ„์ž„ํ•˜์‹œ์˜ค.

โ€ข ํšŒ์‚ฌ์—์„œ ์—ฌ์ž์ง์›๋“ค์˜ ๋ชจ์ž„์„ ๊ฐ–๊ธฐ ์œ„ํ•ด ์—ฌ์ž์ง์›๋“ค์˜ ๋ชฉ๋ก์„ ์–ป์–ด์˜ค๊ณ ์ž ํ•œ๋‹ค. ์ ์ ˆํ•œ ์ฑ…์ž„์˜ ์œ„์ž„์„ ํ†ตํ•ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜์‹œ์˜ค.

โ€ข ๊ฐ ํด๋ž˜์Šค์— ๋‚˜๋ˆˆ ์ฑ…์ž„์ด ์˜†์— ์žˆ๋Š” ์‚ฌ๋žŒ๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋น„๊ต ํ† ์˜ํ•˜์‹œ์˜ค.

- 144 -

Page 145: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œ

- 145 -

Page 146: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(1/10)

์˜๋„

๋ถ€๋ถ„๊ณผ ์ „์ฒด์˜ ๊ณ„์ธต์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐœ๋ณ„ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃธ

๋™๊ธฐ

Problem์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Composite ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

โ€ข ์ฑ…์ž„์˜ ์œ„์ž„

- 146 -

Page 147: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(2/10)

์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

๋ถ€์„œ์™€ ์ง์›์€ ์กฐ์ง ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ์ผ๋ถ€๋กœ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ์ถ”์ƒํ™”๊ฐ€ ๊ฐ€๋Šฅ

ํด๋ผ์ด์–ธํŠธ(ํšŒ์‚ฌ)๊ฐ€ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๋„๋ก ๋™์ผํ•œ ํ–‰์œ„๋ฅผ ์‹๋ณ„

- 147 -

Party

+ getGender() : String+ add(Party) : void+ getChildren() : Party[]+ print() : void+ findByGener(String) : Party[]

Employee

- name: String- gender: String

+ print() : void+ finaByGender(String)

Department

- name: String- location: String

+ add(Party) : void+ getChildren() : Party[]+ print() : void+ findByGener(String)

- parties

*Company

+ print() : void+ findByGender(String) : Party[]

*

ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ๊ฐ ์š”์†Œ๋“ค์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํ–‰์œ„๋ฅผ ์‹๋ณ„ํ•จ์œผ๋กœ์จ ์ถ”์ƒํ™”๋ฅผ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ดํด๋ž˜์Šค๋กœ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

- children

๋ถ€์„œ๋Š” ํ•˜์œ„๋ถ€์„œ์™€ ์ง์›์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€๋Š” ๋ชจ๋‘ Party์ด๋ฏ€๋กœDepartment๋Š” Party๋ฅผ ํฌํ•จํ•˜๋ฉด ๋œ๋‹ค.

public void add(Party unit) {

this.children.add(unit);

}

public List<Party> getChildren() {

return this.children;

}

์ง์›์€ ํ•˜์œ„ Party๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋งŒ overrideํ•œ๋‹ค. ํŠธ๋ฆฌ์˜ ๊ตฌ์„ฑ์š”์†Œ๋“ค์€ ๊ฐ์ž์˜ ํŠน์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ ๋ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

public void add(Party party) {

throw new ...Exception();

}

public List<Party> getChildren() {

throw new ...Exception();

}

ํŠน์ • ๋ฉ”์†Œ๋“œ๋Š”ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋‹ค

Page 148: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(3/10)

์ฑ…์ž„์˜ ์œ„์ž„

๋ชจ๋“  ํŠธ๋ฆฌ ์š”์†Œ์— ๋™์ผํ•œ ํ–‰์œ„๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ฐ ์š”์†Œ์—์„œ ํ•ด๋‹น ํ–‰์œ„๋ฅผ ๊ตฌํ˜„

์ฑ…์ž„์„ ์œ„์ž„ํ•จ์œผ๋กœ์จ ๋กœ์ง์ด ๋น„๋Œ€ํ•ด ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•จ.

- 148 -

Company Department Department

Department

Employee

Employee

Party

print print print

print print

public void print(int depth) {

printIndent(depth);

System.out.println("- ๋ถ€์„œ : " + name + ", " + location);

for(int i = 0; i < children.size(); i++) {

children.get(i).print(depth + 1);

}

}

public void print(int depth) {

printIndent(depth);

System.out.println("- ์ง์› : " + name + ", " + gender);

}

๊ฐ ํŠธ๋ฆฌ ์š”์†Œ๋Š” ์ž์‹ ์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฑ…์ž„์„ ์ง€๋‹˜

์ž์‹ ์˜ ์ •๋ณด๋Š” ์ž์‹ ์ด ์ถœ๋ ฅํ•˜๋„๋ก์ฑ…์ž„์˜ ์œ„์ž„

Page 149: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(4/10)

์ฑ…์ž„์˜ ์œ„์ž„

๋ชจ๋“  ํŠธ๋ฆฌ ์š”์†Œ๋“ค์„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃธ์œผ๋กœ์จ ์กฐ์ง์˜ ๊ตฌ์กฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ๊ฐ€ ์šฉ์ด

- 149 -

Company Department Department

Department

Employee

Employee

Party

find find find

find find

public List<Party> findByGender(String gender) {

List<Party> results = new ArrayList<Party>();

for(int i = 0; i < children.size(); i++) {

Party child = children.get(i);

if (gender.equals(child.getGender())) results.add(child);

results.addAll(child.findByGender(gender));

}

return results;

}

public List<Party> findByGender(String gender)

{

return new ArrayList<Party>();

}

์ง์›์˜ ๊ฒฝ์šฐ ํ•˜์œ„ ์š”์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜์—†์œผ๋ฏ€๋กœ ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํŠน์ • ํŠธ๋ฆฌ ์š”์†Œ๋Š” ๋ฐ”๋กœ ์ž์‹ ์˜ ํ•˜์œ„๋งŒ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

Page 150: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(5/10)

Main ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 150 -

public static void main(String[] args) {

List<Party> ogranizations = new ArrayList<Party>();

Department deptDev = new Department("๊ฐœ๋ฐœ๋ถ€์„œ", "์„์ง€๋กœ");

Department deptDevProductA = new Department("์ œํ’ˆA๊ฐœ๋ฐœ", "์„์ง€๋กœ");

...

ogranizations.add(deptDev);

Department deptSale = new Department("์˜์—…๋ถ€์„œ", "์ข…๋กœ");

...

ogranizations.add(deptSale);

deptDevProductA.add(new Employee("๊น€๊ฐœ๋ฐœ", "๋‚จ์ž"));

...

Company company = new Company("๋ฏธ๋ž˜์†Œํ”„ํŠธ", ogranizations);

System.out.println("* ์ „์ฒด ํšŒ์‚ฌ ์กฐ์ง๋„");

company.print();

System.out.println("* ์—ฌ์ž ์ง์› ๋ชจ์ž„");

List<Party> women = company.findByGender("์—ฌ์ž");

for(int i = 0; i < women.size(); i++) {

women.get(i).print(0);

}

}

Page 151: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(6/10)

Main ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 151 -

Page 152: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(7/10)

ํ™•์žฅ

์กฐ์ง ๊ตฌ์กฐ์— ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ๊ธฐ์กด ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์—†์ด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

Leaf์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋‚˜ Container์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ๋ชจ๋‘ ์ถ”๊ฐ€ ์šฉ์ด(๋ฌธ์ œ : Container ํ™•์žฅ๋ฐฉ๋ฒ•์€?)

- 152 -

Party

+ getGender() : String+ add(Party) : void+ getChildren() : Party[]+ print() : void+ findByGener(String) : Party[]

Employee

- name: String- gender: String

+ print() : void+ finaByGender(String) : Party[]

Department

- name: String- location: String

+ add(Party) : void+ getChildren() : Party[]+ print() : void+ findByGener(String) : Party[]

- parties

*Company

+ print() : void+ findByGender(String) : Party[]

*

- children

PartTime

- name: String- workingTime: Time

+ print() : void+ finaByGender(String) : Party[]

Party๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒˆ๋กœ์šด ํƒ€์ž…๋งŒ ๋งŒ๋“ค๋ฉด ๊ธฐ์กด ํด๋ž˜์Šค ๋ณ€๊ฒฝ ์—†์ด ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋Š” ๊ทธ ๊ฐ์ฒด์˜ํŠน์„ฑ์„ ํ‘œํ˜„ํ•˜๋Š” ์†์„ฑ์„ ๋”ฐ๋กœ ๊ฐ€์ง„๋‹ค.

Page 153: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(8/10)

์ ์šฉ

๋ถ€๋ถ„-์ง‘ํ•ฉ ๊ด€๊ณ„์˜ ๊ณ„์ธต๋„๋ฅผ ํ‘œํ˜„ํ•ด์•ผ ํ•  ๋•Œ

๋ณตํ•ฉ ๊ฐ์ฒด์™€ ๋‹จ์ผ ๊ฐ์ฒด ๊ฐ„์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ์ฐจ์ด๋ฅผ ๋‘๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ

๊ณ„์ธต๊ด€๊ณ„์˜ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ

- 153 -

Page 154: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(9/10)

๊ตฌ์กฐ

- 154 -

Component

+ operation()

+ add(Component) : void

+ remove(Component) : void

+ getChild(int) : Component

Leaf

+ operation()

Composite

+ operation()

+ add(Component) : void

+ remove(Component) : void

+ getChild(int) : Component

Client*

- children

๋ชจ๋“  children์— ๋Œ€ํ•ด child.operation() ํ˜ธ์ถœ

Page 155: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Composite ํŒจํ„ด(10/10)

Sequence

- 155 -

: Client :Composite :Composite :Leaf

Add Component to Composite

Add Component to Composite

Add Component to Composite

Operation

Get Children

Operation for all Child

Get Children

Operation for all Child

Page 156: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

3.2 Proxy ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 156 -

Page 157: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(1/6)

Problem ์ œ์‹œ

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

- 157 -

Page 158: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(2/6)

Printable ์†Œ์Šค

- 158 -

public interface Printable {

void setDefaultPrinter(boolean b);

boolean isDefaultPrinter();

String getPrinterName();

void print(String string);

}

Page 159: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(3/6)

Printer ์†Œ์Šค

- 159 -

public class Printer implements Printable {

private String name;

private boolean defaultPrinter;

...

public void print(String string) {

System.out.println("===== " + name + " Printer =====");

System.out.println(string);

}

private void initialize() {

System.out.print(name + " Printer ์ƒ์„ฑ ์ค‘ (5์ดˆ) ...");

... // 5์ดˆ๊ฐ„ ๋Œ€๊ธฐ

System.out.println(" ์™„๋ฃŒ.");

}

}

Page 160: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(4/6)

PrinterManager ์†Œ์Šค

- 160 -

public class PrinterManager {

private Printable[] printers = new Printable[] {

new Printer("ํšŒ์˜์‹ค"),

...

};

...

public void setDefaultPrinter(String printerName) {

for(int i = 0; i < printers.length; i++) {

if (printers[i].getPrinterName().equals(printerName)) {

printers[i].setDefaultPrinter(true);

}

}

public Printable getDefaultPrinter() {

for(int i = 0; i < printers.length; i++) {

if (printers[i].isDefaultPrinter()) {

return printers[i];

}

...

Page 161: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(5/6)

Main ์†Œ์Šค

- 161 -

public static void main(String[] args) {

PrinterManager manager = new PrinterManager();

manager.setDefaultPrinter("๊ฐœ๋ฐœ๋ถ€");

System.out.println("* Printer ๊ฒ€์ƒ‰");

Printable[] printers = manager.getPrinters();

for(int i = 0; i < printers.length; i++) {

if (printers[i].isDefaultPrinter()) System.out.print("[๊ธฐ๋ณธํ”„๋ฆฐํ„ฐ] ");

else System.out.print("[์„ ํƒํ”„๋ฆฐํ„ฐ] ");

System.out.println(printers[i].getPrinterName());

}

System.out.println("* ์ถœ๋ ฅ");

Printable printer = manager.getDefaultPrinter();

printer.print("Hello, Design Pattern");

}

Page 162: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(6/6)

Main ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 162 -

20์ดˆ ์†Œ์š”

Page 163: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ง€์  ์ฐพ๊ธฐ

โ€ข ์ „์ฒด ํด๋ž˜์Šค๋“ค ์ค‘ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•œ๋‹ค.

โ€ข ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์˜ ํŒจํ„ด์„ ๋ถ„์„ํ•œ๋‹ค.

์ง€์—ฐ ๋กœ๋”ฉ (Lazy Loading)

โ€ข ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ์ง€์—ฐํ•ด์„œ(ํ•„์š”ํ•  ๋•Œ) ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๋‹ค.

โ€ข ๋ฌธ์ œ ํ•ด๊ฒฐ ํ›„ ๋ช‡ ๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์˜†์— ์žˆ๋Š” ์‚ฌ๋žŒ๊ณผ ๋น„๊ต ํ† ์˜ํ•˜์‹œ์˜ค.

์ œํ•œ ์‚ฌํ•ญ

โ€ข Printable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‚ฐ์—…ํ‘œ์ค€์ด๋ผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

โ€ข Print ๊ฐ์ฒด๋Š” ์ถฉ๋ถ„ํžˆ ํŠœ๋‹ ๋˜์–ด ๋” ์ด์ƒ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

โ€ข ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ(Main) ํด๋ž˜์Šค์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™” ํ•˜๋ผ.

- 163 -

Page 164: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œ

- 164 -

Page 165: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(1/14)

์˜๋„

๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ๋Œ€๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

๋™๊ธฐ

Problem์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Proxy ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ง€์  ์ฐพ๊ธฐ

โ€ข ์ง€์—ฐ ๋กœ๋”ฉ (Lazy Loading)

โ€ข ์˜ํ–ฅ๋„ ์ตœ์†Œํ™”

- 165 -

Page 166: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(2/14)

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ง€์  ์ฐพ๊ธฐ

์‹คํ–‰์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„์€ Printer ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์†Œ์š”

PrinterManager๊ฐ€ Printer๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์–ด์ฉ” ์ˆ˜ ์—†์ด Printer๋ฅผ ์ƒ์„ฑํ•˜์—ฌ์•ผ ํ•จ

- 166 -

PrintablePrinterManager

Printer

- printers

*

new

setDefaultPrinter()

getPrinterName()

print()

private void initialize() {

System.out.print(name + " ..์ค‘ (5์ดˆ) ...");

...

Thread.sleep(1000L);

...

System.out.println(" ์™„๋ฃŒ.");

}

Printer ์ƒ์„ฑ์—์„œ ์ดˆ๊ธฐํ™” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค

private Printable[] printers

= new Printable[]

{

new Printer("ํšŒ์˜์‹ค"),

new Printer("์˜์—…๋ถ€"),

...

};

PrinterManager๋Š” Printer ๊ด€๋ฆฌ์™€ ์‚ฌ์šฉ์„์œ„ํ•ด Printer ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค.

Page 167: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(3/14)

์ง€์—ฐ ๋กœ๋”ฉ (Lazy Loading)

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜์˜ ํ”„๋ฆฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ชจ๋“  Printer๋ฅผ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Œ

ํ”„๋ฆฐํ„ฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ๋Š” print๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ž„

- 167 -

Printable

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void

Printer

- name : String- defaultPrinter : boolean

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void- initialize() : void

PrinterProxy

- name : String- defaultPrinter : boolean

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void- realize() : void

- real

1

PrinterManager- printers

*

new

Printer์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๋Š” Proxy๋ฅผ ๋‘”๋‹ค.

์‹ค์ œ Printer๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ๊นŒ์ง€Printer์˜ ์ƒ์„ฑ์„ ์—ฐ๊ธฐํ•œ๋‹ค.

public void print(String string) {

realize();

real.print(string);

}

private synchronized void realize() {

if (real == null) real = new Printer(name);

}

private Printable[] printers

= new Printable[]

{

new PrinterProxy("ํšŒ์˜์‹ค"),

new PrinterProxy("์˜์—…๋ถ€"),

...

};

Printer ๋Œ€์‹  ๋Œ€๋ฆฌ์—ญํ• ์„ํ•˜๋Š” PrintProxy๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

setDefaultPrinter()

getPrinterName()

print()

Page 168: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(4/14)

์ง€์—ฐ ๋กœ๋”ฉ (Lazy Loading)

- 168 -

public class PrinterProxy implements Printable {

private String name;

private boolean defaultPrinter;

private Printer real;

...

public String getPrinterName() {

return name;

}

public void setDefaultPrinter(boolean b) {

if (real != null) {

real.setDefaultPrinter(b);

}

defaultPrinter = b;

}

public boolean isDefaultPrinter() {

return defaultPrinter;

}

public void print(String string) {

realize();

real.print(string);

}

private synchronized void realize() {

if (real == null) real = new Printer(name);

}

}

์‹ค์ œ Printer๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹น์žฅ ์‹ค์ œ Printer๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐProxy์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ ๋น„์†Œ๋กœ Print ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Page 169: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(5/14)

๋™์ž‘ ๋ฐฉ๋ฒ•

- 169 -

: Main :PrinterManager :PrinterProxy :Printer

์ƒ์„ฑ

PrinterProxy ์ƒ์„ฑ

์‹ค์ œ ํ”„๋ฆฐํ„ฐ ํš๋“

์ƒ์„ฑ

ํ”„๋ฆฐํ„ฐ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ

๊ธฐ๋ณธ ํ”„๋ฆฐํ„ฐ ์„ค์ • ๋˜๋Š” ์ด๋ฆ„ ๊ฐ€์ ธ์˜ค๊ธฐ

์ถœ๋ ฅ

PrinterProxy ๋ชฉ๋ก ๋ฐ˜ํ™˜

์ถœ๋ ฅ

Page 170: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(6/14)

Main ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 170 -

ํ•„์š”ํ•œ ์‹œ์ ์— ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑ

5์ดˆ ์†Œ์š”

Page 171: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(7/14)

ํ™•์žฅ

์ƒˆ๋กœ์šด ํƒ€์ž…์˜ PortablePrinter๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?์ƒˆ๋กœ์šด Proxy๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

- 171 -

Printable

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void

Printer

- Name : String- defaultPrinter : boolean

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void- initialize() : void

PrinterProxy

- Name : String- defaultPrinter : boolean- printerType : int

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void- realize() : void

- real

1

PrinterManager- printers

*

PortablePrinter

- Name : String- defaultPrinter : boolean- Location : String

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void- initialize() : void

print

print

์–ด๋–ค Printer๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ตฌ๋ถ„์ž๊ฐ€ ํ•„์š”

Page 172: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(8/14)

ํ™•์žฅ

์ƒˆ๋กœ์šด Proxy๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ

- 172 -

Printable

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void

Printer

- Name : String- defaultPrinter : boolean

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void- initialize() : void

PrinterProxy- real

1

PrinterManager- printers

*

PortablePrinter

- Name : String- defaultPrinter : boolean- Location : String

+ setDefaultPrinter(boolean):void+ isDefaultPrinter() : boolean+ getPrinterName() : String+ print(String) : void- initialize() : void

PortablePrinterProxy

- real

1

Page 173: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(9/14)

Dynamic Proxy (Java 1.3 ์ด์ƒ)

์‹ค์ œ Proxy ๊ตฌํ˜„ ์—†์ด ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ Proxy๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑ

Proxy ํŒจํ„ด ์ ์šฉ ์‹œ ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋™์ผํ•œ ํŒจํ„ด์˜ Proxy๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ

- 173 -

Printable

PrinterPrinterProxy- real

1

PrinterManager- printers

*

LogProxy- real

1

ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค.

์‹ค์ œ๋กœ LogProxy ํด๋ž˜์Šค๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค

Page 174: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(10/14)

LogInvocationHandler ์†Œ์Šค

- 174 -

public class LogInvocationHandler implements InvocationHandler {

private Printable real;

public LogInvocationHandler(Printable printer) {

real = printer;

}

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

System.out.println("Method call : " + method.getName());

return method.invoke(real, args);

}

}

ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“ ๋ฉ”์†Œ๋“œ๋Š” ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค.

PrinterManager ์†Œ์Šค

private Printable[] printers = new Printable[] {

(Printable) Proxy.newProxyInstance(cl, new Class[]{Printable.class}, new LogInvocationHandler(new PrinterProxy("ํšŒ์˜์‹ค"))),

(Printable) Proxy.newProxyInstance(cl, new Class[]{Printable.class}, new LogInvocationHandler(new PrinterProxy("์˜์—…๋ถ€"))),

(Printable) Proxy.newProxyInstance(cl, new Class[]{Printable.class}, new LogInvocationHandler(new PrinterProxy("๊ฐœ๋ฐœ๋ถ€"))),

(Printable) Proxy.newProxyInstance(cl, new Class[]{Printable.class}, new LogInvocationHandler(new PrinterProxy("๊ด€๋ฆฌ๋ถ€")))

};

Page 175: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(11/14)

Main ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 175 -

Dynamic Proxy ์ฐธ์กฐ : http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html

Page 176: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(12/14)

์ ์šฉ

์›๊ฒฉ ํ˜ธ์ถœ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์›๊ฒฉ Proxy๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ (์˜ˆ: RMI)

์š”์ฒญ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ(์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜)

์›๋ž˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•  ๊ฒฝ์šฐ ๋ณดํ˜ธ์šฉ Proxy๋ฅผ ์‚ฌ์šฉ

- 176 -

Page 177: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(13/14)

๊ตฌ์กฐ

- 177 -

Subject

+ request()

...

RealSubject

+ request()

...

Proxy- realSubject

1

Client

+ request()

...

...

realSubject.request();

...

Page 178: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Proxy ํŒจํ„ด(14/14)

Sequence

- 178 -

: Client :Proxy :RealSubject

Request to Proxy

Request to Real Subject

Page 179: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

3.3 Bridge ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 179 -

Page 180: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(1/7)

Problem ์ œ์‹œ

ํ”„๋กœ๊ทธ๋ž˜๋จธ A์”จ๋Š” ์ฃผ์†Œ์–‘์‹์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์˜€๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์˜ˆ์ƒ์™ธ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ๋‹ฌ๋ผ๋Š” ์š”์ฒญ์— ๊ณ ๋ฏผ์ด๋‹ค.์ฃผ์†Œ์–‘์‹์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ํ…์ŠคํŠธ ์–‘์‹๊ณผ HTML ์–‘์‹์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ์ฃผ์†Œ๋ฅผ ํ•ด๋‹น ์–‘์‹์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

- 180 -

+--------------------------------------+

|Gasan-Dong Genumcheon-Gu, Seoul, Korea|

+--------------------------------------+

Gasan-Dong Genumcheon-Gu, Seoul, Korea์ž…๋ ฅ๊ฐ’

ํ…์ŠคํŠธ ์–‘์‹ HTML ์–‘์‹

+--------------------------------------+

|Gasan-Dong Genumcheon-Gu, Seoul, Korea|

|Gasan-Dong Genumcheon-Gu, Seoul, Korea|

|Gasan-Dong Genumcheon-Gu, Seoul, Korea|

+--------------------------------------+

ํ˜„์žฌ๋ชจ์Šต

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

Page 181: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(2/7)

ํ˜„์žฌ Model๋‹ค์–‘ํ•œ ์–‘์‹์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋ธ์„ ๋งŒ๋“ค์—ˆ๋‹ค.Formatter ํด๋ž˜์Šค์˜ Header, Body, Tail ์ˆœ์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.์ƒˆ๋กœ์šด ์–‘์‹์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Formatter๋ฅผ ์ƒ์†ํ•˜๋ฉด ๋œ๋‹ค.

- 181 -

Page 182: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(3/7)

Formatter ์†Œ์Šค

- 182 -

public abstract class Formatter {

public abstract void printHeader();

public abstract void printBody();

public abstract void printTail();

public final void print() {

printHeader();

printBody();

printTail();

}

}

Page 183: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(4/7)

TextFormatter ์†Œ์Šค

- 183 -

public class TextFormatter extends Formatter {

private String string;

private int width;

public TextFormatter(String string) {

this.string = string;

this.width = string.getBytes().length;

}

public void printHeader() { printLine(); }

public void printBody() {

System.out.println("|" + string + "|");

}

public void printTail() { printLine();}

private void printLine() {

...

}

Page 184: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(5/7)

HtmlFormatter ์†Œ์Šค

- 184 -

public class HtmlFormatter extends Formatter {

private String string;

public HtmlFormatter(String string) {

this.string = string;

}

public void printHeader() {

System.out.println("<table border=\"1\">");

}

public void printBody() {

System.out.println("<tr><td>" + string + "</td></tr>");

}

public void printTail() {

System.out.println("</table>");

}

}

Page 185: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(6/7)

Main ์†Œ์Šค

- 185 -

public class Main {

public static void main(String[] args) {

Formatter d1 = new TextFormatter("Gasan-Dong Genumcheon-Gu, Seoul, Korea");

Formatter d2 = new HtmlFormatter("Gasan-Dong Genumcheon-Gu, Seoul, Korea");

d1.print();

d2.print();

}

}

Page 186: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ ์ดํ•ด(7/7)

Main ํด๋ž˜์Šค ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

- 186 -

Page 187: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์ƒ์†์„ ํ†ตํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ํ•˜๊ธฐ

โ€ข ๋ชจ๋“  Formatter๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ์†์„ ํ†ตํ•ด ํ’€์–ด ๋ณด์‹œ์˜ค.

โ€ข ์–ด๋Š ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ธ์— ํ‘œํ˜„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์‹œ์˜ค.

ํ™•์žฅ ์ค€๋น„ ํ•˜๊ธฐ

โ€ข ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ ๋งˆ๋‹ค ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์„ ํ† ์˜ํ•˜์‹œ์˜ค.

โ€ข ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒ์†์„ ์ด์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์‹œ์˜ค.

โ€ข ํ˜„์žฌ ์ƒํƒœ์—์„œ ์ƒ์†์„ ํ†ตํ•ด ํ™•์žฅํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ์ ์„ ํ† ์˜ํ•˜์‹œ์˜ค.

์ƒ์†์˜ ๋‘ ๊ฐ€์ง€ ์šฉ๋„

โ€ข ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ์ƒ์†์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

โ€ข ์ƒ์œ„ ํด๋ž˜์Šค์— ์ •์˜๋œ ๊ธฐ๋Šฅ์— ์ƒˆ๋กœ์šด ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์ƒ์†์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

- 187 -

Page 188: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œ

- 188 -

Page 189: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(1/9)

์˜๋„

์ถ”์ƒํ™”์™€ ๊ตฌํ˜„์˜ ๊ฐœ๋…์„ ๋ถ„๋ฆฌ

๊ตฌํ˜„ ์ž์ฒด๋„ ํ•˜๋‚˜์˜ ์ถ”์ƒํ™” ๊ฐœ๋…์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์ด ๊ฐ€๋Šฅ

๊ตฌํ˜„๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋„ ๋‹ค์–‘ํ•จ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

๋™๊ธฐ

Problem์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Bridge ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ์ƒ์†์„ ํ†ตํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€์˜ ๋ฌธ์ œ์ 

โ€ข ์˜ˆ์ธก์ด ์–ด๋ ค์šด ๊ธฐ๋Šฅ ํ™•์žฅ ์‹œ ๋ฌธ์ œ์ 

โ€ข ์ถ”์ƒํ™”์™€ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ

- 189 -

Page 190: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

public void multiPrint(int times) {

printHeader();

for(int i = 0; i < times; i++) {

printBody();

}

printTail();

}

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(2/9)

์ƒ์†์„ ํ†ตํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€์˜ ๋ฌธ์ œ์ 

๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝ (ํ•˜์œ„ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ)

Formatter์— ์ถ”์ƒ ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€ ์‹œ ๋ชจ๋“  ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•จ

์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Œ

- 190 -

Formatter

+ printHeader() : void

+ printBody() : void

+ printTail() : void

+ print() : void

+ multiPrint(times) : void

TextFormatter

- string: String

- width: int

+ printHeader() : void

+ printBody() : void

+ printTail() : void

- printLine() : void

HtmlFormatter

- string: String

+ printHeader() : void

+ printBody() : void

+ printTail() : void

์ฃผ์†Œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์„ ์ƒ์œ„ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ชจ๋“ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ด ๊ตฌํ˜„์„ ์ƒ์†๋ฐ›์•„๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Page 191: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(3/9)

์˜ˆ์ธก์ด ์–ด๋ ค์šด ๊ธฐ๋Šฅ ํ™•์žฅ ์‹œ ๋ฌธ์ œ์ 

Formatter๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Formatter๋ฅผ ์ƒ์†ํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ

์ด ๊ฒฝ์šฐ ํ…์ŠคํŠธ ์–‘์‹๊ณผ HTML ์–‘์‹์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌํ˜„์„ ๋˜ ๋งŒ๋“ค์–ด์•ผ ํ•จ (์ค‘๋ณต)

- 191 -

Formatter

+ printHeader() : void

+ printBody() : void

+ printTail() : void

+ print() : void

TextFormatter

- string: String

- width: int

+ printHeader() : void

+ printBody() : void

+ printTail() : void

- printLine() : void

HtmlFormatter

- string: String

+ printHeader() : void

+ printBody() : void

+ printTail() : void

CountFormatter

+ multiPrint(times) : void

CountTextFormatter

- string: String

- width: int

+ printHeader() : void

+ printBody() : void

+ printTail() : void

- printLine() : void

CountHtmlFormatter

- string: String

+ printHeader() : void

+ printBody() : void

+ printTail() : void

์ค‘๋ณต์ด ๋ฐœ์ƒํ•จ

Page 192: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(4/9)

์ถ”์ƒํ™”์™€ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ

๊ธฐ๋Šฅ์„ ์œ„ํ•œ ํด๋ž˜์Šค ๊ณ„์ธต๊ณผ ๊ตฌํ˜„์„ ์œ„ํ•œ ํด๋ž˜์Šค ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ์—ฐ๊ฒฐ(bridge)

- 192 -

Formatter

+ printHeader() : void

+ printBody() : void

+ printTail() : void

+ print() : void

FormatterImpl

+ printRowHeader() : void

+ printRowBody() : void

+ printRowTail() : void

TextFormatterImpl

- string: String

- width: int

+ printRowHeader() : void

+ printRowBody() : void

+ printRowTail() : void

- printLine() : void

HtmlFormatterImpl

- string: String

+ printRowHeader() : void

+ printRowBody() : void

+ printRowTail() : void

CountFormatter

+ multiPrint(times) : void

impl

*

๊ตฌํ˜„ํด๋ž˜์Šค์—๊ฒŒ ๊ธฐ๋Šฅ์„์œ„์ž„

public void printHeader() {

impl.printRawHeader();

}

public void printBody() {

impl.printRawBody();

}

public void printTail() {

impl.printRawTail();

}

Formatter๋ฅผ ์ƒ์†ํ•˜๊ณ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€

public void multiPrint(int times) {

printHeader();

for(int i = 0; i < times; i++) {

printBody();

}

printTail();

}

๊ตฌํ˜„ํ™•์žฅ์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ ์ •์˜public abstract class FormatterImpl {

public abstract void printRawHeader();

public abstract void printRawBody();

public abstract void printRawTail();

}

๊ธฐ๋Šฅ์„ ์œ„ํ•œ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌํ˜„์„ ์œ„ํ•œ ํด๋ž˜์Šค ๊ณ„์ธต

Page 193: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(5/9)

Main ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 193 -

public static void main(String[] args) {

Formatter d1 = new Formatter(new TextFormatterImpl("Gasan-Dong Genumcheon-Gu, Seoul, Korea"));

Formatter d2 = new Formatter(new HtmlFormatterImpl("Gasan-Dong Genumcheon-Gu, Seoul, Korea"));

d1.print();

d2.print();

System.out.println();

CountFormatter d3 = new CountFormatter(new TextFormatterImpl("Gasan-Dong Genumcheon-Gu, Seoul, Korea"));

CountFormatter d4 = new CountFormatter(new HtmlFormatterImpl("Gasan-Dong Genumcheon-Gu, Seoul, Korea"));

d3.multiPrint(3);

d4.multiPrint(3);

}

Page 194: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(6/9)

Main ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 194 -

Page 195: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(7/9)

ํ™•์žฅ

์œ„์˜ ๊ฒฝ์šฐ์—์„œ XML ์–‘์‹์œผ๋กœ ํ™•์žฅํ•  ๊ฒฝ์šฐ ์–ด๋–ค ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฐ€? (๊ตฌํ˜„ ํ™•์žฅ)

Header์™€ Tail ์—†์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ฐ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ์–ด๋–ค ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฐ€? (๊ธฐ๋Šฅ ํ™•์žฅ)

- 195 -

Formatter

+ printHeader() : void

+ printBody() : void

+ printTail() : void

+ print() : void

FormatterImpl

+ printRowHeader() : void

+ printRowBody() : void

+ printRowTail() : void

TextFormatterImpl

- string: String

- width: int

HtmlFormatterImpl

- string: String

+ printRowHeader() : void

+ printRowBody() : void

+ printRowTail() : void

CountFormatter

+ multiPrint(times) : void

impl*

XMLFormatterImpl

- string: String

+ printRowHeader() : void

+ printRowBody() : void

+ printRowTail() : void

+ printRowHeader() : void

+ printRowBody() : void

+ printRowTail() : void

- printLine() : void

NewCountFormatter

+ multiPrintWithout(times) : void

Page 196: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(8/9)

์ ์šฉ

์ถ”์ƒํ™” ๊ฐœ๋…๊ณผ ์ด์— ๋Œ€ํ•œ ๊ตฌํ˜„ ๊ฐ„์˜ ์ข…์†์„ฑ์„ ์—†์• ๊ณ  ์‹ถ์„ ๋•Œ

์ถ”์ƒํ™” ๊ฐœ๋…๊ณผ ๊ตฌํ˜„ ๋ชจ๋‘ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์†์— ์˜ํ•ด ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•  ๋•Œ

์ถ”์ƒํ™” ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ตฌํ˜„ ๋‚ด์šฉ ๋ณ€๊ฒฝ์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๊ตฌํ˜„์„ ์™„๋ฒฝํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ธธ ์›ํ•  ๋•Œ

โ€ข ์†Œ์Šค๋ฅผ ๋ณด๋”๋ผ๋„ ๊ตฌํ˜„์€ ๋ถ„๋ฆฌ๋˜์–ด ๋ณผ ์ˆ˜ ์—†์Œ

ํด๋ž˜์Šค์˜ ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ํ•  ๋•Œ

โ€ข ํด๋ž˜์Šค ๊ณ„์ธต ์ƒ์˜ ๋ณ€ํ™”๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ (์ค‘์ฒฉ๋œ ์ผ๋ฐ˜ํ™”)

์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์— ๊ฑธ์ณ ๊ตฌํ˜„์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•  ๋•Œ

- 196 -

Page 197: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด ์†Œ๊ฐœ โ€“ Bridge ํŒจํ„ด(9/9)

๊ตฌ์กฐ

- 197 -

Abstraction

+ operation()

Implementor

+ operationImpl()

RefinedAbstraction

+ otherOperation()

ConcreteImplementorA

+ operationImpl()

impl

ConcreteImplementorB

+ operationImpl()

Implementor์—๊ฒŒ๊ธฐ๋Šฅ ์ˆ˜ํ–‰์„ ์œ„์ž„

impl.operationImpl()

Page 198: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

3.4 ๊ธฐํƒ€ ๊ตฌ์กฐ ํŒจํ„ด

Decorator ํŒจํ„ด

Adaptor ํŒจํ„ด

Facade ํŒจํ„ด

Flyweight ํŒจํ„ด

- 198 -

Page 199: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Decorator ํŒจํ„ด(1/5)

์˜๋„

๊ฐ์ฒด์— ๋™์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€

๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ์œตํ†ต์„ฑ์ด ์žˆ์Œ

๋™๊ธฐ

๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์— ์™ธ๊ฐ์„ ์„ ๊พธ๋ฏธ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€

๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ธฐ ๊ณค๋ž€ํ•จ

ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

- 199 -

์•ˆ๋…•ํ•˜์„ธ์š”.

+---------+

| |

+---------+

+

+---------------+

| * ์•ˆ๋…•ํ•˜์„ธ์š”. * |

+---------------+

* * * ์•ˆ๋…•ํ•˜์„ธ์š”. * +

์–‘์ชฝ ์žฅ์‹

์ฃผ๋ณ€ ์žฅ์‹

Page 200: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Decorator ํŒจํ„ด(2/5)

๋™๊ธฐ

- 200 -

Display

+ getColumns() : int

+ getRows() : int

+ getRowText(int) : String

+ show() : void

# display

StringDisplay

- string: String

+ getColumns() : int

+ getRows() : int

+ getRowText(int) : String

Border

SideBorder

- borderChar: char

+ getColumns() : int

+ getRows() : int

+ getRowText(int) : String

1

FullBorder

+ getColumns() : int

+ getRows() : int

+ getRowText(int) : String

- makeLine

public final void show() {

for(int i = 0; i < getRows(); i++) {

System.out.println(getRowText(i));

}

} ๊ฐ ๊ฐ์ฒด์˜ ์ค„๋“ค์„ ์ฝ๊ณ  ์ถœ๋ ฅ

public String getRowText(int row) {

return

borderChar + display.getRowText(row) + borderChar;

}

Page 201: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Decorator ํŒจํ„ด(3/5)

๋™๊ธฐ

- 201 -

aFullBorder

display

aFullBorder

display

aFullBorder

display

getRowText

getRowText

public static void main(String[] args) {

Display b1 = new StringDisplay("์•ˆ๋…•ํ•˜์„ธ์š”");

Display b2 = new SideBorder(b1, '*');

Display b3 = new FullBorder(b2);

b3.show();

}

Page 202: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Decorator ํŒจํ„ด(4/5)

์ ์šฉ

๋™์ ์œผ๋กœ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ์ด ๋•Œ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์–ด๋– ํ•œ ์˜ํ–ฅ๋„ ์ฃผ์ง€ ์•Š์•„์•ผ ํ•จ

์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค ์ผ ๋•Œ

์ƒ์†์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•  ๊ฒฝ์šฐ ์„œ๋ธŒํด๋ž˜์Šค์˜ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ ๊ณค๋ž€ํ•  ๋•Œ

- 202 -

Page 203: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Decorator ํŒจํ„ด(5/5)

๊ตฌ์กฐ

- 203 -

Component

+ operation() : void

ConcreteComponent

+ operation() : void

Decorator

+ operation() : void

ConcreteDecoratorA

+ operation() : void

ConcreteDecoratorB

+ operation() : void

component

1

์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Component๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

...

component.operation

...

Page 204: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Adapter ํŒจํ„ด(1/6)

์˜๋„

ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜

์„œ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•จ

๋™๊ธฐ

๋‹ค๋ฅธ ๋ง๋กœ Wrapper๋ผ๊ณ ๋„ ํ•จ

์•„๋ž˜์™€ ๊ฐ™์ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์žˆ์œผ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งž์ง€ ์•Š์„ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•จ

- 204 -

ํ˜„์ˆ˜๋ง‰

๊ด„ํ˜ธ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ

๋ณ„ํ‘œ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ

์•ฝํ•˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ธฐ

๊ฐ•์กฐํ•˜์—ฌ์ถœ๋ ฅํ•˜๊ธฐ ์ถœ๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค๋‚ด ํ”„๋กœ๊ทธ๋žจ

X

X(๋””์ž์ธํŒจํ„ด ์˜คํ”ˆ)

*๋””์ž์ธํŒจํ„ด ์˜คํ”ˆ*

Page 205: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Adapter ํŒจํ„ด(2/6)

๋™๊ธฐ

์ƒ์†์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

- 205 -

<<interface>>

Print

+ printWeak() : void

+ printStrong() : void

Main Banner

+ showWithParen() : void

+ showWithAster() : void

PrintBanner

+ printWeak() : void

+ printStrong() : void

use

์ƒ์†๋ฐ›์€ Banner์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค..

public void printWeak() {

showWithParen();

}

public void printStrong() {

showWithAster();

}

Page 206: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Adapter ํŒจํ„ด(3/6)

๋™๊ธฐ

์œ„์ž„์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

- 206 -

<<interface>>

Print

+ printWeak() : void

+ printStrong() : void

Main

Banner

+ showWithParen() : void

+ showWithAster() : void

PrintBanner

+ printWeak() : void

+ printStrong() : void

use

-banner

1

Banner๋ฅผ ๋ฉค๋ฒ„๋กœ ๊ฐ–๊ณ  ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉค๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ํ˜ธ์ถœํ•œ๋‹ค..

public void printWeak() {

banner.showWithParen();

}

public void printStrong() {

banner.showWithAster();

}

Page 207: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Adapter ํŒจํ„ด(4/6)

๋™๊ธฐ

- 207 -

: Main :PrintBanner :Banner

์•ฝํ•˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ธฐ

๊ด„ํ˜ธ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ

๊ฐ•์กฐํ•˜์—ฌ์ถœ๋ ฅํ•˜๊ธฐ

๋ณ„ํ‘œ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ

Page 208: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Adapter ํŒจํ„ด(5/6)

์ ์šฉ

๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

๊ธฐ๋Šฅ์€ ์ œ๊ณตํ•˜๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งž์ง€ ์•Š์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ

- 208 -

Page 209: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Adapter ํŒจํ„ด(6/6)

๊ตฌ์กฐ

- 209 -

Target

+ request() : void

Client Banner

+ specificRequest():void

Adapter

+ request() : void

Target

+ request() : void

Client

Banner

+ specificRequest():void

Adapter

+ request() : void

-adaptee 1

์ƒ์†์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ• ์œ„์ž„์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

Page 210: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Faรงade ํŒจํ„ด(1/5)

์˜๋„

์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ด๋ฃจ๋Š” ๋‹ค์ˆ˜ ๊ฐ์ฒด๋“ค์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต

๋ณต์žกํ•œ ๋‚ด์šฉ์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ์ฐฝ๊ตฌ(์ธํ„ฐํŽ˜์ด์Šค)๋กœ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ

๋™๊ธฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, HTML ์ƒ์„ฑ๊ธฐ, ์ „์ž๋ฉ”์ผ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ณ ์ž ํ•จ.

Client ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ž๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฆ„

- 210 -

๋ฉ”์ผ ์ ‚์†กํ”„๋กœ๊ทธ๋žจ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค HTML ์ƒ์„ฑ๊ธฐ ์ ‚์ž๋ฉ”์ผ์„œ๋ฒ„

JDBC

๋””์Šคํฌ

๋ฉ”์‹œ์ง•์„œ๋ฒ„

XML ํŒŒ์„œ

Page 211: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Faรงade ํŒจํ„ด(2/5)

๋™๊ธฐ

- 211 -

Main

PageMaker

+ sendMailPage

HtmlGenerator

+ makeHtml

Database

+ getMailInfo

MailServer

+ sendMail

ํด๋ผ์ด์–ธํŠธ(Main)์€ ๋‹จ์ง€PageMaker์˜ sendMailPage ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•œ๋‹ค.

์ฐฝ๊ตฌ ์—ญํ• ์„ ํ•˜๋Š” PageMaker๊ฐ€Database์—์„œ ๋ฉ”์ผ์ •๋ณด๋ฅผ ์ฝ๊ณ HtmlGenerator๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ”์ผ ๋‚ด์šฉ์„ ๋งŒ๋“ค๊ณ  MailServer๋กœ ๋ฉ”์ผ์„ ์ „์†กํ•˜๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Page 212: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Faรงade ํŒจํ„ด(3/5)

๋™๊ธฐ

- 212 -

: Main :PageMaker : Database

๋ฉ”์ผ์ „์†ก๋ฐ ๊ฒฐ๊ณผ ๋ณด์—ฌ์ฃผ๊ธฐ

๋ฉ”์ผ ์ •๋ณด ์กฐํšŒ

: HtmlGenerator :MailServer

๋ฉ”์ผ ๋‚ด์šฉ ๋งŒ๋“ค๊ธฐ

๋ฉ”์ผ ์ „์†ก

Page 213: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Faรงade ํŒจํ„ด(4/5)

์ ์šฉ

๋ณต์žกํ•œ ์„œ๋ธŒ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต์ด ํ•„์š”ํ•  ๋•Œ

โ€ข ์‹œ์Šคํ…œ์ด ๋ฐœ์ „ํ•˜๋ฉด ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ํด๋ž˜์Šค๊ฐ€ ์ž‘์•„์ง€๊ฑฐ๋‚˜ ๋งŽ์•„์ง

โ€ข ์„œ๋ธŒ ์‹œ์Šคํ…œ์ด ๋ณต์žกํ•ด์ง€๋ฉด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ

ํด๋ผ์ด์–ธํŠธ์™€ ๊ตฌํ˜„ ํด๋ž˜์Šค ๊ฐ„์— ๋„ˆ๋ฌด ๋งŽ์€ ์ข…์†์„ฑ์ด ์กด์žฌํ•  ๋•Œ

โ€ข Faรงade๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ธŒ์‹œ์Šคํ…œ๊ฐ„์˜ ๊ฒฐํ•ฉ์„ ์ค„์ž„

โ€ข ์„œ๋ธŒ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ ์‹œ Faรงade ๋งŒ ์˜ํ–ฅ์„ ๋ฐ›์Œ

์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์˜ ๊ณ„์ธตํ™”๋ฅผ ์ด๋ฃจ๊ณ ์ž ํ•  ๋•Œ (Layered)

โ€ข Faรงade๋Š” ๊ณ„์ธต๋ณ„ ์ ‘๊ทผ์ ์„ ์ œ๊ณต

โ€ข ๊ณ„์ธต๊ฐ„ ์ข…์†์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

โ€ข ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ๋‚ด๋ถ€ ์„ค๊ณ„ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ด๋ฃจ์–ด ์งˆ ์ˆ˜ ์žˆ์Œ

- 213 -

Page 214: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Faรงade ํŒจํ„ด(5/5)

๊ตฌ์กฐ

- 214 -

Faรงade

์„œ๋ธŒ์‹œ์Šคํ…œ

Page 215: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Flyweight ํŒจํ„ด(1/7)

์˜๋„

๋Œ€๊ทœ๋ชจ์˜ ์ž‘์€ ๊ฐ์ฒด๋“ค์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์œ ํ•จ

์ž‘์€ ๊ฐ์ฒด๋“ค๋„ ๋Œ€๊ทœ๋ชจ์ผ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

๋™๊ธฐ

๊ธ€์ž์˜ ํฐํŠธ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๋‹ค์†Œ ๋ฌด๊ฑฐ์šด ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ถœ๋ ฅ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ณ ์ž ํ•จ

๊ฐ ๊ธ€์ž๋Š” ์‘์šฉ๋ ฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์Šคํ…œ์—์„œ๋„ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์›ํ•จ

- 215 -

0 1 9 - 9 1 8 9 ...

๊ฐ ๊ธ€์ž๋Š” ์‘์šฉ๋ ฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ชจ๋‘ ๊ฐ์ฒด๋ฅผ์‚ฌ์šฉํ•จ

๊ฐ์ฒด ํ•˜๋‚˜๊ฐ€ 100 byte๋กœ ๊ฐ€์ •ํ•  ๋•Œ 1,000๊ฐœ์˜๋ฌธ์ž๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ 100 Kbyte๊ฐ€ ํ•„์š”ํ•จ

Page 216: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Flyweight ํŒจํ„ด(2/7)

๋™๊ธฐ

- 216 -

BigString

+ print() : void

BigCharFactory

- singleton

- pool : HashMap

+ getInstance() : BigCharFactory

+ getBigChar(char) : BigChar

BigChar

- charname

- fontdata

+ print() : void

Main- bigchars

creates

uses

BigCharFactory๋Š” BigChar ๊ฐ์ฒด๋“ค์„ pool์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ž๋ฅผ ์›ํ•  ๋•Œ๋Š” pool์—์žˆ๋Š” ๋™์ผํ•œ BigChar ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค..

BigString์€ BigChar ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ์ด๋‹ค.

๋ฌธ์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด BigChar ๊ฐ์ฒด๋ฅผ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ BigCharFactory์—๊ฒŒ ์˜๋ขฐํ•œ๋‹ค.

*

BigChar ๊ฐ์ฒด๋Š” ๋ฌธ์ž์˜ ๋ณธ์งˆ์ ์ธํŠน์„ฑ์ธ ํฐํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

Page 217: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Flyweight ํŒจํ„ด(3/7)

๋™๊ธฐ

- 217 -

: Main :BigString : BigCharFactory

์ƒ์„ฑ

BigChar ๊ฐ์ฒด ์š”์ฒญ

: BigChar

pool ๊ฒ€์‚ฌ

์—†์„ ๊ฒฝ์šฐ ์ƒ์„ฑ

๊ณต์œ  BigChar ๊ฐ์ฒด ๋ฐ˜ํ™˜

์ถœ๋ ฅ

๋ชจ๋“  BigChar ์ถœ๋ ฅ

Page 218: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Flyweight ํŒจํ„ด(4/7)

๋™๊ธฐ

๊ฐ์ฒด ํ•˜๋‚˜๊ฐ€ 100byte๋กœ ๊ฐ€์ •ํ•  ๋•Œ 1000๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ์—๋„ ์ตœ๋Œ€ 1.1Kbyte ๋งŒ์ดํ•„์š”ํ•จ. (์ˆซ์ž๋งŒ ์ทจ๊ธ‰ํ•  ๊ฒฝ์šฐ)

๊ณต์œ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ณด๋‹ค 1/100 ์ •๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝ

๋ฌธ์ž์—ด ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ํšจ๊ณผ ๊ทน๋Œ€ํ™”

- 218 -

0 1 1 - 9 1 8 9 ...

0 1 89 -

BigChar

pool

Page 219: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Flyweight ํŒจํ„ด(5/7)

์ ์šฉ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Œ€๋Ÿ‰์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

๊ฐ์ฒด ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์ €์žฅ ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋†’์•„์งˆ ๋•Œ

๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ถ€๊ฐ€์ ์ธ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๋•Œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ์ฒด ์‹๋ณ„์ž์— ๋น„์ค‘์„ ๋‘์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

โ€ข ๊ฐ์ฒด ์‹๋ณ„์ž๋ฅผ ์ทจ๊ธ‰ํ•  ๊ฒฝ์šฐ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ Flyweight๋ฅผ ์ ์šฉํ•˜์ง€ ๋ชปํ•จ

๊ณ ๋ ค์‚ฌํ•ญ

๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ณต์œ ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์— ์‹ ๊ฒฝ ์จ์•ผ ํ•จ

โ€ข ์‰ฌ์šด ํŒจํ„ด์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก immutable ๊ฐ์ฒด๋กœ ๋งŒ๋“ฆ

๊ณต์œ ํ•  ์ •๋ณด์™€ ๊ณต์œ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ์ •๋ณด๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„

โ€ข ๋ณธ์งˆ์  ์ •๋ณด : ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ๋™์ผํ•œ ๊ฐ์ฒด์˜ ๋ณธ์งˆ์ ์ธ ์ •๋ณด (๊ณต์œ )

โ€ข ๋ถ€๊ฐ€์  ์ •๋ณด : ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” context์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด (๊ณต์œ  ๋ชปํ•จ)

- 219 -

Page 220: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Flyweight ํŒจํ„ด(6/7)

๊ตฌ์กฐ

- 220 -

Flyweight

+ operation(Context) : void

FlyweightFactory

+ getFlyweight(key) : Flyweight

ConcreteFlyweight

+ operation(Context) : void

UnsharedConcreteFlyweight

+ operation(Context) : void

Client

flyweights

*

Flyweight๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ํ›„ pool์— ๋“ฑ๋กํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Flyweight์˜pool

Page 221: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Flyweight ํŒจํ„ด(7/7)

๊ตฌ์กฐ

๊ฐ์ฒด ๊ณต์œ  ๋ฐฉ๋ฒ•

- 221 -

aFlyweightFactory

flyweights

aConcreteFlyweight

intrinsic State

aConcreteFlyweight

intrinsic State

aClient aClient

flyweight

pool

Page 222: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

- 222 -

๊ต์œก ์ผ์ •ํ‘œ

์›” ํ™”3์ผ์ฐจ

(์ˆ˜์š”์ผ)๋ชฉ ๊ธˆ

2์›” 23์ผ 2์›” 24์ผ 2์›” 25์ผ 2์›” 26์ผ 2์›” 27์ผ

ํŒจํ„ด ๊ฐœ์š” GoF ํŒจํ„ด โ… 

- Creational Patterns

- Structural Patterns

GoF ํŒจํ„ด โ…ก

- Behavioral Patterns

๋ณตํ•ฉํŒจํ„ด

- Role Object

- AOM

POSAํŒจํ„ด

- Basic Patterns

Page 223: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

4. GoF ํ–‰์œ„ ํŒจํ„ด

4.1 Chain of Responsibility ํŒจํ„ด

4.2 Strategy ํŒจํ„ด

4.3 Template Method ํŒจํ„ด

4.4 ๊ธฐํƒ€ ์ƒ์„ฑ ํŒจํ„ด ์†Œ๊ฐœ

- 223 -

Page 224: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

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

๊ฐ•์˜ ๊ตฌ์„ฑ

Problem ์ œ์‹œ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ๊ฐ•์˜

โ€ข Problem ํ•ด๊ฒฐ์— ์ ์šฉํ•œ ํŒจํ„ด ์†Œ๊ฐœ

โ€ข ๋ชจ๋ธ ๋ฐ ์†Œ์Šค ๊ฒ€ํ† 

โ€ข ๋™์ผ ๋ฒ”์ฃผ๋‚ด ๋‹ค๋ฅธ ํŒจํ„ด๋“ค ๊ฐ„๋žต ์†Œ๊ฐœ

- 224 -

Page 225: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

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

์‹ค์Šต ์ฐธ์กฐ

IDE Tool : Eclipse

Java ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- 225 -

Page 226: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

4.1 Chain of Responsibility ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 226 -

Page 227: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(1/5)

Problem ์ œ์‹œ

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

- 227 -

Page 228: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(2/5)

Client ์†Œ์Šค

- 228 -

public static void main(String[] args) throws Exception {

Client client = new Client();

System.out.println("๋ถˆ๋งŒ์‚ฌํ•ญ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.");

System.out.println();

Complain[] complains = client.pileupComplain();

ComplainHandler complainHandler = new ComplainHandler();

for (int i=0; i<complains.length; i++) {

complainHandler.addComplain(complains[i]);

}

complainHandler.handleComplain();

}

public Complain[] pileupComplain() {

Complain[] complains = new Complain[2];

complains[0] = new Complain(Complain.UNKINDNESS_SERVICE, "์ œํ’ˆ๊ตํ™˜์„ ์›ํ•˜๋Š”๋ฐ ์ „ํ™”๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");

complains[1] = new Complain(Complain.DEFICIENT_INFORMATION, "๋„ฅ์Šค๋ธŒ๋กœ์ปค ์ œํ’ˆ์˜ ๊ตฌ์„ฑ ๋ฐ ์‚ฌ์–‘์„ ์›ํ•ฉ๋‹ˆ๋‹ค.");

return complains;

}

Page 229: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(3/5)

Complain ์†Œ์Šค

- 229 -

public static final int DEVELOP_TROUBLE = 1;

public static final int UNKINDNESS_SERVICE = 2;

public static final int DELIVERY_DELAYING = 3;

public static final int DEFICIENT_INFORMATION = 4;

private int type;

private String message;

public Complain(int type, String message) {

this.type = type;

this.message = message;

}

public int getType() { return type; }

public String getMessage() { return message; }

public String getResult() { return result; }

public void setResult(String result) { this.result = result; }

Page 230: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(4/5)

ComplainHandler ์†Œ์Šค

- 230 -

private List<Complain> complainContainer;

public void addComplain(Complain complain) {

if (complainContainer == null) { complainContainer = new ArrayList<Complain>(); }

complainContainer.add(complain);

}

public void handleComplain() throws Exception {

if (complainContainer == null || complainContainer.isEmpty()) { return; }

System.out.println("์š”์ฒญํ•˜์‹  ๋ถˆ๋งŒ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.");

for (int i=0; i<complainContainer.size(); i++) { requestResolve(complainContainer.get(i)); }

}

private void requestResolve(Complain complain) {

switch (complain.getType()) {

case Complain.DEVELOP_TROUBLE:

System.out.println("[๋‚ด์šฉ] " + complain.getMessage());

System.out.println("[์ฒ˜๋ฆฌ] ๊ณ ์žฅ์‹ ๊ณ ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 10์ผ ์ด๋‚ด์— ์„œ๋น„์Šค์„ผํ„ฐ์— ๋ฐฉ๋ฌธํ•˜์…”์„œ ์ˆ˜๋ฆฌํ•˜์‹ญ์‹œ์š”...");

break;

...

default:

System.out.println("์š”์ฒญํ•˜์‹  ๋ถˆ๋งŒ์‚ฌํ•ญ(" + complain.getType() + ")์€ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค.");

break;

}

}

Page 231: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(5/5)

Client ์‹คํ–‰ ๊ฒฐ๊ณผ

- 231 -

Page 232: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์ฑ…์ž„ ํ• ๋‹น (Assigning responsibilities to Object)

โ€ข ๊ณ ๊ฐ์˜ ๋ถˆ๋งŒ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์œ ํ˜•์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ํŠน์ • ํด๋ž˜์Šค์— ๋งŽ์€ ์ฑ…์ž„์ด ์ง‘์ค‘๋˜์–ด ์ง„๋‹ค. ์ฑ…์ž„์ด ์ง‘์ค‘๋˜๋Š” ํด๋ž˜์Šค๋Š” ์–ด๋–ค ํด๋ž˜์Šค์ธ๊ฐ€?

โ€ข ๋˜ํ•œ, ์ง‘์ค‘๋œ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ ๋‹นํ•œ ์ˆ˜์ค€์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์— ์ ์šฉํ•œ ๋ถ„๋ฆฌ๋œ ์ฑ…์ž„์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์‹œ์˜ค.

ํ–‰์œ„์  ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ(Reduce behavioral coupling)

โ€ข ํ–‰์œ„์  ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ์†Œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ์†Œ์‹œํ‚ฌ ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ์ž์‹ ์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์˜†์— ์žˆ๋Š” ์‚ฌ๋žŒ๊ณผ ๋น„๊ต ํ† ์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์‹œ์˜ค.

- 232 -

Page 233: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œ

- 233 -

Page 234: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(1/9)

์˜๋„

๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฐ์ฒด์™€ ์ด๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด

ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•œ ๊ฐ์ฒด์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—๊ฒŒ ๊ทธ์ฒ˜๋ฆฌ์˜ ๊ธฐํšŒ๋ฅผ ์ฃผ๋ ค๋Š” ๊ฒƒ

์ฆ‰, ์ด ํŒจํ„ด์—์„œ๋Š” ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ์ฒ˜๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋„๋ก ํ•จ

๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•  ๊ฐ์ฒด๋“ค์„ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋กœ ๋งŒ๋“ค๊ณ , ์‹ค์ œ๋กœ ์š”์ฒญ์„์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์š”์ฒญ์„ ์ „๋‹ฌ

๋™๊ธฐ

Problem์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Chain of Responsibility ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ์ฑ…์ž„ ํ• ๋‹น (Assigning responsibilities to Object)

โ€ข ํ–‰์œ„์  ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ(Reduce behavioral coupling)

- 234 -

Page 235: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(2/9)

์ฑ…์ž„ ํ• ๋‹น (Assigning responsibilities to Object)

๋ถˆ๋งŒ์‚ฌํ•ญ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค๋ฅผ ๋ณด๋ฉด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ชจ๋“  ๋ถˆ๋งŒ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌ

ํ–ฅํ›„ ๋ถˆ๋งŒ์‚ฌํ•ญ ์œ ํ˜•์ด ์„ธ๋ถ„ํ™” ๋˜๊ฑฐ๋‚˜ ์‹ ๊ทœ๋กœ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ์œ ์—ฐ์„ฑ์ด ๊ฒฐ์—ฌ๋˜์–ด ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ ธ์„œ ์ ํ•ฉํ•œ ํด๋ž˜์Šค๋กœ ์ฑ…์ž„์„ ํ• ๋‹นํ•ด์•ผ ํ•จ

- 235 -

ComplainHandler

+ handleComplain() : void

DevelopTroubleResolver

+ resolve(Complain) : boolean

UnkindnessServiceResolver

+ resolve(Complain) : boolean

<<uses>>

ComplainHandler์—์„œ ์ฒ˜๋ฆฌํ•˜๋˜ ๋ถˆ๋งŒ์‚ฌํ•ญ์„ ๊ฐ๊ฐ ๋ถˆ๋งŒ์‚ฌํ•ญ ์œ ํ˜•์— ๋งž๊ฒŒ ์ฑ…์ž„์„ํ• ๋‹นํ•˜๊ณ  ์‹คํ–‰์„ ์œ„์ž„ํ•œ๋‹ค.

public void handleComplain(Complain complain) {

switch (complain.getType()) {

case Complain.DEVELOP_TROUBLE:

DevelopTrobleResolver resolver = ...

resovler.resolve(complain);

...

}

}

...

DeliveryDelayingResolver์™€DeficientInformationResolver ๋Š” ์ƒ๋žต๋จ

public boolean resolve(Complain complain) {

if (complain.getType() != Complain.DEVELOP_TROUBLE) return false;

// ์ฒ˜๋ฆฌ ๋กœ์ง ๊ตฌํ˜„

return true;

}

๋ชจ๋“  ๋ถˆ๋งŒ์‚ฌํ•ญResolver๋Š” ๋™์ผํ•œ ๊ตฌ์กฐ์™€ ํ–‰์œ„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์ถ”์ƒํ™” ์‹œ์ผœ์•ผ ํ•œ๋‹ค

ํ–‰์œ„์  ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ ๋ฐฉ์•ˆ ๊ณ ๋ ค

ComplainHandler๊ฐ€ ๋ถˆ๋งŒ์‚ฌํ•ญ ์œ ํ˜•์—๋”ฐ๋ผ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”๊ฐ€?

switch ~ case ~๋ฌธ์„ ์ œ๊ฑฐํ•˜์žโ€ฆ

Page 236: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(3/9)

์ถ”์ƒํ™” ๊ฒฐ์ •ํ•˜๊ธฐ

๋ถˆ๋งŒ์‚ฌํ•ญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋™์ผํ•œ ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰

ํ•ด๊ฒฐ์ž(Resolver) ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒํด๋ž˜์Šค๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Œ

์ด๋Š” ComplainHandler ํด๋ž˜์Šค์™€ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์ž‘์ ์ด ๋จ

- 236 -

DevelopTroubleResolver

+ doTask(Complain) : boolean

UnkindnessServiceResolver

+ doTask(Complain) : boolean

DeliveryDelayingResolver

+ doTask(Complain) : boolean

DeficientInformationResolver

+ doTask(Complain) : boolean

Resolver

+ resolve(Complain) : void+ doTask(Complain) : boolean

๊ณตํ†ต์ ์ธ ๊ตฌ์กฐ์™€ ํ–‰์œ„๋ฅผ ์ƒ์œ„์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์ˆ˜ํ–‰ํ•  ํ–‰์œ„๋ฅผ ์ถ”์ƒํ™”์‹œํ‚จ๋‹ค.

public void resolve(Complain complain) {

if (doTask(complain)) { complete(complain); }

else { failure(complain); }

}

protected abstract boolean doTask(Complain complain);

ํ•˜์œ„ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ ์ž์‹ ์—๋งž๋Š” ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.

public boolean doTask(Complain complain) {

if (complain.getType() != Complain.DEVELOP_TROUBLE) return false;

// ์ฒ˜๋ฆฌ ๋กœ์ง ๊ตฌํ˜„return true;

}

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

Page 237: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(4/9)

์—ฐ๊ฒฐ๊ณ ๋ฆฌ ๊ตฌํ˜„ํ•˜๊ธฐ (Implementing the Successor Chain)

๋ถˆ๋งŒ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ด๊ฒฐ์ž(Resolver)๋“ค์€ ๋ถˆ๋งŒ์‚ฌํ•ญ ์ฒ˜๋ฆฌ ์š”์ฒญ์— ๋Œ€ํ•ด ๋‹ด๋‹นํ•˜๋Š” ํ•ด๊ฒฐ์ž๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ์Œ

์ฆ‰, ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ ํ•ด๊ฒฐ์ž(Resolver)๋Š” ์š”์ฒญ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์Œ ์ˆ˜ํ–‰ํ•  ํ•ด๊ฒฐ์ž(Resolver)์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค๋„ ์ •์˜ํ•ด์•ผ ํ•จ

- 237 -

Resolver

+ resolve(Complain) : void+ setNext(Resolver) : Resolver+ doTask(Complain) : boolean

- next : Resolver

ํ˜„์žฌ Resolver์—์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ, ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ๋‹ค์Œ Resolver ์ธ์Šคํ„ด์Šค๋ฅผ์ •์˜ํ•œ๋‹ค.

public Resolver setNext(Resolver next) {

this.next = next;

return next;

}

ํ˜„์žฌ Resolver์—์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ๋‹ค์Œ Resolver๋กœ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค.

protected Resolver next;

public void resolve(Complain complain) {

if (doTask(complain)) { complete(complain); }

else if (next != null) { next.resolve(complain); }

else { failure(complain); }

}

protected abstract boolean doTask(Complain complain);

Page 238: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(5/9)

ํ–‰์œ„์  ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ (Reduce Behavioral Coupling)

๋ถˆ๋งŒ์‚ฌํ•ญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•ด๊ฒฐ์ž(Resolver)์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ๊ตฌํ˜„์˜ ์™„๋ฃŒ๋กœ ComplainHandler์—์„œ์˜ ํ–‰์œ„์  ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋จ

๊ทธ๋Ÿฌ๋‚˜ ComplainHandler์—์„œ๋Š” ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ์ •๋ณด๋ฅผ ํ†ตํ•ด์„œ ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ ํš๋“ํ•  ์ˆ˜์žˆ๋‹ค๋ฉด ๋ช…์‹œ์ ์ธ ์ •์˜๊ฐ€ ํ•„์š”์—†์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์ค‘๋ณต๋˜๋”๋ผ๋„ ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ์ •์˜ํ•ด์•ผ ํ•จ

- 238 -

Resolver

+ resolve(Complain) : void+ setNext(Resolver) : Resolver+ doTask(Complain) : boolean

- next : Resolver

ComplainHandler๋Š” ์ด์ œ ๋ถˆ๋งŒ์‚ฌํ•ญ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋‹จ์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฑ…์ž„์„ ์œ„์ž„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋”์ด์ƒ ComplainHandler ์—์„œ ๋ถˆ๋งŒ์‚ฌํ•ญ ์œ ํ˜•์„ ์ฒดํฌํ•˜์ง€ ์•Š๋Š”๋‹ค.public void handleComplain() throws Exception {

if (complainContainer == null

|| complainContainer.isEmpty()) { return; }

Resolver resolver = configureResolver();

for (int i=0; i<complainContainer.size(); i++) {

resolver.resolve(complainContainer.get(i));

}

}

ComplainHandler

+ handleComplain() : void- configureResolver() : Resolver

ํ˜„์žฌ ComplainHandler์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ์ •๋ณด๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ ํš๋“ํ•  ์ˆ˜ ์—†์–ด ๋ช…์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ ์ •์˜ํ•˜์˜€๋‹ค.

private Resolver configureResolver() {

Resolver dtResolver = new DevelopTroubleResolver();

...

dtResolver.setNext(usResolver).setNext(...)...;

return dtResolver;

}

๋ช…์‹œ์ ์ธ ์„ ์–ธ ์—†์ด ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์€???

<<uses>>

Page 239: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(6/9)

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 239 -

public static void main(String[] args) throws Exception {

Client client = new Client();

Complain[] complains = new Complain[2];

complains[0] = new Complain(Complain.UNKINDNESS_SERVICE, "์ œํ’ˆ๊ตํ™˜์„ ์›ํ•˜๋Š”๋ฐ ์ „ํ™”๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");

complains[1] = new Complain(Complain.DEFICIENT_INFORMATION, "๋„ฅ์Šค๋ธŒ๋กœ์ปค ์ œํ’ˆ์˜ ๊ตฌ์„ฑ ๋ฐ ์‚ฌ์–‘์„ ์›ํ•ฉ๋‹ˆ๋‹ค.");

ComplainHandler complainHandler = new ComplainHandler();

for (int i=0; i<complains.length; i++) {

complainHandler.addComplain(complains[i]);

}

complainHandler.handleComplain();

}

Page 240: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(7/9)

์ ์šฉ

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

๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๊ฐ์ฒด๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ์ฑ„ ์—ฌ๋Ÿฌ ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜์—๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‹ถ์„๋•Œ

์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๊ฐ์ฒด ์ง‘ํ•ฉ์„ ๋™์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ ์ž ํ•  ๋•Œ

- 240 -

Page 241: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(8/9)

ํด๋ž˜์Šค ๊ตฌ์กฐ

๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๋ฉ”์‹œ์ง€ ํ๋ฆ„

- 241 -

Client

+ operation() : void

Handler

+ handleRequest() : void

ConcreteHandler1

+ handleRequest() : void

ConcreteHandler2

+ handleRequest() : void

- successor : Handler

aClient

aHandler

aConcreteHandler

successor

aConcreteHandler

successor

Page 242: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Chain of Responsibility ํŒจํ„ด(9/9)

Sequence

- 242 -

: Client : ConcreteHandler1 : ConcreteHandler2

handleRequest() : void

handleRequest() : void

handleRequest() : void

Page 243: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

4.2 Strategy ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 243 -

Page 244: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(1/7)

- 244 -

Problem ์ œ์‹œ

๋ฌด์—ญํšŒ์‚ฌ์—์„œ ํ•ด์™ธ ์˜์—…์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” A์”จ๋Š” ์ฃผ๋ฌธ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•จ์„ ๋Š๊ผˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ตญ๊ฐ€์—์„œ ์ œํ’ˆ์— ๋Œ€ํ•ด ์ฃผ๋ฌธ์„ ํ•˜๋ฉด ํ•ด๋‹น ๊ตญ๊ฐ€์˜ ๊ด€์„ธ์™€ ํ™˜์œจ์„ ์ ์šฉํ•˜์—ฌ ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ์š”๊ตฌํ•˜์—ฌ ์•„๋ž˜์™€๊ฐ™์ด ๋””์ž์ธ๋œ ์‹œ์Šคํ…œ์ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

Page 245: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(2/7)

TaskController ์†Œ์Šค

- 245 -

public static void main(String[] args) {

TaskController controller = new TaskController();

controller.process();

}

public void process() {

Product product = getProduct();

System.out.println("[์ œํ’ˆ๋ช…] " + product.getName());

System.out.println("[๊ฐ€๊ฒฉ] " + NumberFormat.getInstance().format(product.getPrice()));

System.out.println();

ProductOrder usProductOrder = new USProductOrder(product);

System.out.println("[์ฃผ๋ฌด๊ตญ๊ฐ€] " + usProductOrder.getOrderCountry());

System.out.println("[๊ด€์„ธ] " + NumberFormat.getInstance().format(usProductOrder.calculateTax()));

System.out.println("[ํ™˜์œจ ์ ์šฉ ๊ฐ€๊ฒฉ] " + NumberFormat.getInstance().format(usProductOrder.getCurrency()));

System.out.println();

ProductOrder jpProductOrder = new JPProductOrder(product);

System.out.println("[์ฃผ๋ฌด๊ตญ๊ฐ€] " + jpProductOrder.getOrderCountry());

System.out.println("[๊ด€์„ธ] " + NumberFormat.getInstance().format(jpProductOrder.calculateTax()));

System.out.println("[ํ™˜์œจ ์ ์šฉ ๊ฐ€๊ฒฉ] " + NumberFormat.getInstance().format(jpProductOrder.getCurrency()));

...

}

Page 246: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(3/7)

ProductOrder ์†Œ์Šค

- 246 -

private Product product;

public ProductOrder(Product product) {

this.product = product;

}

public double getPrice() {

return product.getPrice();

}

public abstract String getOrderCountry();

public abstract double calculateTax();

public abstract double getCurrency();

Page 247: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(4/7)

USProductOrder ์†Œ์Šค

- 247 -

private static final String ORDER_COUNTRY = "UNITED STATE";

private static final double TAX_RATE = 0.35;

private static final double CURRENCY_RATE = 0.94;

public USProductOrder(Product product) {

super(product);

}

public String getOrderCountry() {

return ORDER_COUNTRY;

}

public double calculateTax() {

return getPrice() * TAX_RATE;

}

public double getCurrency() {

return getPrice() * CURRENCY_RATE;

}

Page 248: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(5/7)

JPProductOrder ์†Œ์Šค

- 248 -

private static final String ORDER_COUNTRY = "JAPAN";

private static final double TAX_RATE = 0.15d;

private static final double CURRENCY_RATE = 1.34;

public JPProductOrder(Product product) {

super(product);

}

@Override

public double calculateTax() {

return getPrice() * TAX_RATE;

}

@Override

public double getCurrency() {

return getPrice() * CURRENCY_RATE;

}

@Override

public String getOrderCountry() {

return ORDER_COUNTRY;

}

Page 249: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(6/7)

CanProductOrder ์†Œ์Šค

- 249 -

private static final String ORDER_COUNTRY = "CANADA";

private static final double TAX_RATE = 0.3d;

private static final double CURRENCY_RATE = 0.94d;

public CanProductOrder(Product product) {

super(product);

}

public String getOrderCountry() {

return ORDER_COUNTRY;

}

public double calculateTax() {

return getPrice() * TAX_RATE;

}

public double getCurrency() {

return getPrice() * CURRENCY_RATE;

}

Page 250: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(7/7)

TaskController ์‹คํ–‰ ๊ฒฐ๊ณผ

- 250 -

Page 251: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

Is-A ์™€ Has-A ๊ด€๊ณ„

โ€ข ํ•ด์™ธ ์˜์—…๋ง์ด ๋„“์–ด์ง€๋ฉด์„œ ์˜๊ตญ๊ณผ ํ”„๋ž‘์Šค๊ฐ€ ์ฃผ๋ฌธ์„ ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ด๋“ค์˜ ๊ด€๊ณ„๋ฅผ ๋‹ค์ด์–ด๊ทธ๋žจ์— ์ถ”๊ฐ€ํ•˜์—ฌ ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ์ถ”๊ฐ€๋œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์‹œ์˜ค.

ํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ตฐ ํ˜•์„ฑ

โ€ข ์ƒ์†์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•˜๊ณ  ์ƒ์†์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ–‰์œ„ ๋ฐ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.

โ€ข ์ƒ์†์„ ํ†ตํ•œ ๊ตฌํ˜„๊ณผ ํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์˜ ์ฐจ์ด์ ์„ ๋น„๊ตํ•ด ๋ณด์•„๋ผ.

- 251 -

Page 252: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œ

- 252 -

Page 253: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(1/9)

์˜๋„

๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•˜๋ฉด ์ด๋“ค ๊ฐ๊ฐ์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ์บก์Šํ™”ํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ

Strategy ํŒจํ„ด์„ ์ด์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ๋…๋ฆฝ์ ์ธ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ณ€ํ˜•

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ”๊พธ๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ๋Š” ์•„๋ฌด๋Ÿฐ ๋ณ€๊ฒฝ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ

๋™๊ธฐ

Problem์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Strategy ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข Is-A ์™€ Has-A ๊ด€๊ณ„

โ€ข ํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ตฐ ํ˜•์„ฑ

- 253 -

Page 254: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(2/9)

Is-A ๊ด€๊ณ„

์ƒ์†์€ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ–‰์œ„๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜

๊ตญ๊ฐ€๋ณ„๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํ–‰์œ„๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ProductOrder ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„

๊ทธ๋Ÿฌ๋‚˜ ํ–‰์œ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง์ ‘ ์ฝ”๋”ฉํ•˜๊ฒŒ ๋˜๋ฉด ์ถ”ํ›„ ์ˆ˜์ •์ด ์–ด๋ ค์›Œ์ง€๊ณ , ๋‹ค์–‘ํ•˜๊ฒŒ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•  ์ˆ˜๊ฐ€ ์—†์Œ

- 254 -

ProductOrder

+ calculateTax() : double+ getCurrency() : double

USProductOrder

- TAX_RATE : double = 0.35- CURRENCY_RATE : double = 0.94

+ calculateTax() : double+ getCurrency() : double

CanProductOrder

- TAX_RATE : double = 0.3- CURRENCY_RATE : double = 0.94

+ calculateTax() : double+ getCurrency() : double

JPProductOrder

- TAX_RATE : double = 0.15- CURRENCY_RATE : double = 1.34

+ calculateTax() : double+ getCurrency() : double

public double calculateTax() { return getPrice() * TAX_RATE; }

public double getCurrency() { return getPrice() * CURRENCY_RATE; }

๋ชจ๋“  ํ•˜์œ„ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์€ ๋™์ผํ•œ ๋กœ์ง์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. (์ค‘๋ณต์ฝ”๋“œ)

๊ตญ๊ฐ€๋ณ„ ๊ด€์„ธ์œจ์ด๋‚˜ ํ™˜์œจ์€ ํ•˜์œ„ํด๋ž˜์Šค๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, US์™€ Can ๊ฒฝ์šฐ ๋™์ผํ•œ US Dollar๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ™˜์œจ๋„ ๋™์ผํ•˜๋‹ค.

๋ฏธ๊ตญ๊ณผ ์บ๋‚˜๋‹ค๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ด€์„ธ์œจ์„ ์ ์šฉํ•˜๊ณ ์žˆ๋Š”๋ฐ ํ–ฅํ›„์— ๋ฏธ๊ตญ๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ด€์„ธ๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ๋‹ค๋ฉด CanProductOrder๋Š”USProductOrder์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค๋ฅธ ์˜ˆ๋กœ ์œ ๋Ÿฝ์˜ ์—ฌ๋Ÿฌ ๊ตญ๊ฐ€๊ฐ€ EU๋กœ ํ†ตํ•ฉ๋˜๋ฉด์„œ FTA๋ฅผํ†ตํ•ด ๊ด€์„ธ์œจ๊ณผ ์œ ๋กœํ™”๋กœ ํ™”ํ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ํ™˜์œจ์ด๋™์ผํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์‹œ์Šคํ…œ์„ ๊ฐœ์„ ํ•  ๊ฒƒ์ธ๊ฐ€???

...

์ƒํ’ˆ์ฃผ๋ฌธ ๊ตญ๊ฐ€๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋กProductOrderํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํ•˜์œ„ํด๋ž˜์Šค๋Š” ๊ณ„์†ํ•ด์„œ ์ฆ๊ฐ€ํ•œ๋‹ค.

Page 255: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(3/9)

Has-A ๊ด€๊ณ„ (Has-A can be better than Is-A)

ํ–‰์œ„์— ๋Œ€ํ•œ ์ƒ์† ๋Œ€์‹  ํ–‰์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์‹œ์Šคํ…œ์„ ๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ฆ

ProductOrder ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ๋„ ํ–‰์œ„์˜ ์ƒ์†์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๊ณ  ๊ทธ๋กœ ์ธํ•ด๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•จ

Has-A ๊ด€๊ณ„๋Š” ํด๋ž˜์Šค ๋‚ด์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์บก์Šํ™”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ–‰์œ„์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ตฌํ˜„์„ ํ†ตํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ์˜ ํ–‰์œ„๋ฅผ Runtime์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

- 255 -

ProductOrder

+ calculateTax() : double+ getCurrency() : double

์ƒ์†์ด ์•„๋‹Œ ์œ„์ž„์„ ํ†ตํ•ด์„œProductOrder ํด๋ž˜์Šค์˜ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค.

<<Design Principle>>

Favor composition over inheritance

???

Has-A ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ ๋ณ€ํ™”ํ•˜๋Š” ํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถ”์ถœํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜/๊ตฌํ˜„ํ•œ ํ›„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€์ˆ˜ํ–‰ ์ค‘์— ๊ทธ ํ–‰์œ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

<<Design Principle>>

Program to an interface, not an Implementation.

Page 256: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Strategy ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ถœํ•˜์˜€์œผ๋ฉด ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(4/9)

ํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฆฌํ•˜๊ธฐ (Separating an action & algorithm)

์ƒํ’ˆ์ฃผ๋ฌธ(ProductOrder) ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์„ ๋ณด๋ฉด ๊ด€์„ธ์™€ ํ™˜์œจ์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ TaxCalculator์™€ CurrencyTransformer ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Œ

- 256 -

ProductOrder

+ calculateTax() : double+ getCurrency() : double+ setTaxCalulator(TaxCalculator) : void+ setCurrencyTransformer(CurrencyTransformer) : void

<<interface>>

TaxCalulator

+ calculate(double) : double

<<interface>>

CurrencyTransformer

+ transform(double) : double

์ƒํ’ˆ์ฃผ๋ฌธ ํด๋ž˜์Šค์—์„œ ๊ด€์„ธ๊ณ„์‚ฐ๊ณผ ํ™˜์œจ๋ณ€ํ™˜์„ Strategy ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋…๋ฆฝ์‹œํ‚ค๋ฉด ProductOrderํด๋ž˜์Šค์™€ ๋ฌด๊ด€ํ•˜๊ฒŒํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€ํ˜•์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ง„๋‹ค.

- taxCalculator

- currencyTransformer

Strategy Interface

Page 257: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(5/9)

Strategy ๊ตฌํ˜„ํ•˜๊ธฐ (Implementing an Strategy Interface)

ํ–‰์œ„์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ์ค€์œผ๋กœ ์ถ”์ถœํ•œ TaxCalculator์™€ CurrencyTransformer ๋‘ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ  ๊ฐ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€์‘ํ•˜๋Š” ๊ตฌ์ƒํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„

- 257 -

<<interface>>

TaxCalulator

+ calculate(double ) : double

<<interface>>

CurrencyTransformer

+ transform(double) : doubleFreeTaxCalculator

+ calculate(double ) : double

BaseTaxCalculator

+ calculate(double ) : double

ProtectedTaxCalculator

+ calculate(double ) : double

UnvaluedCurrencyTransformer

+ transform(double) : double

<<interface>>

ValuedCurrencyTransformer

+ transform(double) : double

๊ด€์„ธ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ํ•˜์œ„ํด๋ž˜์Šค๋Š” TaxCalculator์ธํ„ฐํŽ˜์ด์Šค์˜ calculator๋ฉ”์†Œ๋“œ๋ฅผ๊ตฌํ˜„ํ•œ๋‹ค.

์ž์œ ๋ฌด์—ญ์œผ๋กœ ๊ด€์„ธ๊ฐ€์—†๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๊ตฌํ˜„ ๊ธฐ๋ณธ๊ด€์„ธ๋ฅผ ์ ์šฉํ•˜

๊ธฐ ์œ„ํ•œ ๊ตฌํ˜„

๋ณดํ˜ธ๊ด€์„ธ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌํ˜„

ํ™˜์œจ์„ ์ ์šฉํ•˜๊ธฐ ํž˜๋“ 

๊ตญ๊ฐ€์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌํ˜„

๊ธฐ๋ณธ์ ์ธ ํ™˜์œจ์„

์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌํ˜„

TaxCalculator์™€ ๋™์ผํ•˜๋ฉฐ ํ•˜์œ„ํด๋ž˜์Šค๋Š” tranformCurrency๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

Page 258: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(6/9)

TaskController ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 258 -

public void process() {

System.out.println("[์ œํ’ˆ๋ช…] " + product.getName());

System.out.println("[๊ฐ€๊ฒฉ] " + NumberFormat.getInstance().format(product.getPrice()));

CurrencyTransformer dollarCurrency = new ValuedCurrencyTransformer("Dollar", 0.94d);

CurrencyTransformer yenCurrency = new ValuedCurrencyTransformer("Yen", 1.34);

TaxCaculator freeTaxCalc = new FreeTaxCalulator();

ProductOrder usProductOrder = new ProductOrder(product, "UNITED STATE");

usProductOrder.setTaxCalculator(new BaseTaxCalculator(0.35d));

usProductOrder.setCurrencyTransformer(dollarCurrency);

System.out.println("[์ฃผ๋ฌด๊ตญ๊ฐ€] " + usProductOrder.getOrderCountry());

System.out.println("[๊ด€์„ธ] " + usProductOrder.calculateTax());

System.out.println("[ํ™˜์œจ ์ ์šฉ ๊ฐ€๊ฒฉ] " + usProductOrder.getCurrency());

...

System.out.println("ํ•œ๋ฏธFTA๋กœ ์ธํ•ด ์ž์œ ๋ฌด์—ญ์ด ํ™•์‚ฐ๋˜์–ด ๊ด€์„ธ๊ฐ€ ์—†์–ด์กŒ๋‹ค.");

usProductOrder.setTaxCalculator(freeTaxCalc);

System.out.println("[์ฃผ๋ฌด๊ตญ๊ฐ€] " + usProductOrder.getOrderCountry());

System.out.println("[๊ด€์„ธ] " + usProductOrder.calculateTax());

System.out.println("[ํ™˜์œจ ์ ์šฉ ๊ฐ€๊ฒฉ] " + usProductOrder.getCurrency());

}

๋™์ ์œผ๋กœ Strategy ๋ณ€๊ฒฝํ•˜์—ฌ ํ–‰์œ„ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ ์šฉ

Page 259: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(7/9)

์ ์šฉ

ํ–‰์œ„๋“ค์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅผ ๋ฟ ๊ฐœ๋…์ ์œผ๋กœ ๊ด€๋ จ๋œ ๋งŽ์€ ํด๋ž˜์Šค๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ๊ฐ์˜์„œ๋กœ ๋‹ค๋ฅธ ํ–‰์œ„ ๋ณ„๋กœ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑ

โ€ข ์ฆ‰, ๊ฐœ๋…์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜๋งŒ ์ •์˜

โ€ข ์„œ๋กœ ๋‹ค๋ฅธ ํ–‰์œ„๋“ค์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ฆ

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ณ€ํ˜•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

โ€ข ๊ธฐ์–ต ๊ณต๊ฐ„๊ณผ ์ฒ˜๋ฆฌ ์†๋„ ๊ฐ„์˜ ์ ˆ์ถฉ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

โ€ข Strategy๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋ฅผ ํด๋ž˜์Šคํ™”ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ƒ์† ๊ด€๊ณ„๋กœ ์ •์˜

์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋ฅด๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์„ ๋•Œ๋„ ํ•„์š”

โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ผ๋„ ๋˜๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” Strategy ํด๋ž˜์Šค์—๋งŒ ๋‘๋„๋ก ํ•จ

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

- 259 -

Page 260: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(8/9)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 260 -

Context

+ contextInterface() : void

<<interface>>

Strategy

+ algorithmInterface() : void

ConcreteStrategyA

+ algorithmInterface() : void

ConcreteStrategyB

+ algorithmInterface() : void

ConcreteStrategyC

+ algorithmInterface() : void

- strategy

Page 261: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Strategy ํŒจํ„ด(9/9)

Sequence

- 261 -

: Client : Context : Strategy

// create context

algorithmInterface(Message)

// create strategy

setStrategy(Strategy)

contextInterface(Message)

executeStrategy(Message)

Page 262: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

4.3 Template Method ํŒจํ„ด

์ƒํ™ฉ์ดํ•ด

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

ํŒจํ„ด ์†Œ๊ฐœ

- 262 -

Page 263: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(1/6)

Problem ์ œ์‹œ

์žํŒ๊ธฐ ์‚ฌ์—…์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•œ A์”จ๋Š” ์ปคํ”ผ์™€ ๋ ˆ๋ชฌ์ฐจ๋ฅผ ํŒ๋งคํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์ด๋ฅผ ์ œ์–ดํ•  ์žํŒ๊ธฐ ์ œ์–ด ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋„๋ก ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์š”๊ตฌํ–ˆ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์‹œ์Šคํ…œ์ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

- 263 -

Page 264: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(2/6)

Coffee & Tea ์กฐ๋ฆฌ ๋งค๋‰ด์–ผ

Coffee ์กฐ๋ฆฌ๋ฒ•

โ€ข ๋ฌผ์„ ๋“์ธ๋‹ค.

โ€ข ๋“์ธ ๋ฌผ์— ์ปคํ”ผ๋ฅผ ๋„ฃ๋Š”๋‹ค.

โ€ข ์ปต์— ์ปคํ”ผ๋ฅผ ๋ถ“๋Š”๋‹ค.

โ€ข ์„คํƒ• ๋ฐ ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

Tea ์กฐ๋ฆฌ๋ฒ•

โ€ข ๋ฌผ์„ ๋“์ธ๋‹ค.

โ€ข ๋“์ธ ๋ฌผ์— Tea๋ฅผ ์šฐ๋ ค๋‚ธ๋‹ค.

โ€ข ์ปต์— Tea๋ฅผ ๋ถ“๋Š”๋‹ค.

โ€ข ๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

- 264 -

Page 265: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(3/6)

Client ํด๋ž˜์Šค ์†Œ์Šค

- 265 -

public static void main(String[] args) {

Client client = new Client();

Coffee coffee = client.pressCoffeeButton();

coffee.prepareRecipe();

System.out.println();

Tea tea = client.pressTeaButton();

tea.prepareRecipe();

}

public Coffee pressCoffeeButton() {

System.out.println("์ปคํ”ผ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์…จ์Šต๋‹ˆ๋‹ค.");

return new Coffee();

}

public Tea pressTeaButton() {

System.out.println("๋ ˆ๋ชฌ์ฐจ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์…จ์Šต๋‹ˆ๋‹ค.");

return new Tea();

}

Page 266: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(4/6)

Coffee ํด๋ž˜์Šค ์†Œ์Šค

- 266 -

public void prepareRecipe() {

boilWater();

brewCoffeeGrinds();

pourInCup();

addSugarAndMilk();

}

public void boilWater() {

System.out.println("Bolling Water...");

}

public void brewCoffeeGrinds() {

System.out.println("Dripping Coffee through filter...");

}

public void pourInCup() {

System.out.println("Pouring into cup...");

}

public void addSugarAndMilk() {

System.out.println("Adding Sugar and Milk...");

}

Page 267: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(5/6)

Tea ํด๋ž˜์Šค ์†Œ์Šค

- 267 -

public void prepareRecipe() {

boilWater();

steepTeaBag();

pourInCup();

addLemon();

}

public void boilWater() {

System.out.println("Bolling Water...");

}

public void steepTeaBag() {

System.out.println("Steeping the tea...");

}

public void addLemon() {

System.out.println("Adding Lemon...");

}

public void pourInCup() {

System.out.println("Pouring into cup...");

}

Page 268: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ƒํ™ฉ์ดํ•ด(6/6)

Client ํด๋ž˜์Šค ์‹คํ–‰ ๊ฒฐ๊ณผ

- 268 -

Page 269: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ

์†”๋ฃจ์…˜ ์ฐพ๊ธฐ (๋ฌธ์ œํ•ด๊ฒฐ ์‹ค์Šต)

์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

โ€ข ์ปคํ”ผ์™€ ๋ ˆ๋ชฌ์ฐจ๋ฅผ ์กฐ๋ฆฌํ•˜๋Š” ์กฐ๋ฆฌ๋ฒ•์„ ๊ธฐ์ค€์œผ๋กœ ์ถ”์ƒํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„ ์ด๋“ค์˜ ๊ด€๊ณ„๋ฅผ๋‹ค์ด์–ด๊ทธ๋žจ์— ํ‘œํ˜„ํ•˜์‹œ์˜ค.

โ€ข ํ‘œํ˜„๋œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์‹œ์˜ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์บก์Šํ™” ํ•˜๊ธฐ

โ€ข ์ปคํ”ผ์™€ ๋ ˆ๋ชฌ์ฐจ์˜ ์กฐ๋ฆฌ๋ฒ•์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ํ•˜๋‚˜ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.

โ€ข ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์บก์Šํ™” ํ•˜๊ธฐ ์ด์ „๊ณผ ์ดํ›„๋ฅผ ๋น„๊ตํ•ด ๋ณด์•„๋ผ.

- 269 -

Page 270: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์†”๋ฃจ์…˜ ๋ฐœํ‘œ

๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋””์ž์ธํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐœ๋ฐœ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐœํ‘œ

- 270 -

Page 271: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(1/9)

์˜๋„

์˜คํผ๋ ˆ์ด์…˜์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ์ •์˜

๊ตฌ์ฒด์ ์ธ ๋‹จ๊ณ„๋Š” ํ•˜์œ„ํด๋ž˜์Šค์— ์ •์˜

Template Method ํด๋ž˜์Šค์˜ ํ•˜์œ„ํด๋ž˜์Šค๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋ฅผ ์žฌ์ •์˜

๋™๊ธฐ

Problem์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์ ์„ Template Method ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

โ€ข ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์บก์Šํ™” ํ•˜๊ธฐ (Encapsulating Algorithms)

- 271 -

Page 272: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(2/9)

์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

์ปคํ”ผ์™€ ๋ ˆ๋ชฌ์ฐจ ์กฐ๋ฆฌ๋ฒ•์„ ๋ณด๋ฉด ๊ณตํ†ต๋œ ํ–‰์œ„๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ

์ฆ‰, ๋ฌผ์„ ๋“์ด๊ฑฐ๋‚˜ ์ปต์— ๋‹ด๋Š” ํ–‰์œ„๋Š” ๋™์ผํ•˜๊ณ  ์ด๋ฅผ ์ถ”์ƒํด๋ž˜์Šค์˜ ํ–‰์œ„๋กœ ์ถ”์ถœ

- 272 -

Beverage

+ prepareRecipe()+ boilWater()+ pourInCup()

Coffee

+ prepareRecipe()+ brewCoffeeGrinds()+ addSugarAndMilk()

Tea

+ prepareRecipe()+ steepTeaBag()+ addLemon()

boilWater()์™€ pourInCup() ๋ฉ”์†Œ๋“œ๋Š” ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ƒ์œ„ํด๋ž˜์Šค์— ์ •์˜ํ•œ๋‹ค.

ํ•˜์œ„ํด๋ž˜์Šค์ธ ์ปคํ”ผ์™€ ๋ ˆ๋ชฌ์ฐจ๋Š” ์ž์‹ ์˜ ์กฐ๋ฆฌ๋ฒ•์— ๋งž๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•œ๋‹ค.

prepareRecipe() ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ๊ฐ์˜ ํ•˜์œ„ํด๋ž˜์Šค๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ •์˜๋œ๋‹ค. ์ด๋ฅผ ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜ํ•˜์˜€๋‹ค.

๊ฐ๊ฐ์˜ ํ•˜์œ„ํด๋ž˜์Šค๋Š”prepareRecipe() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค..

Page 273: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(3/9)

prepareRecipe() ์ถ”์ƒํ™” ํ•˜๊ธฐ

์ปคํ”ผ์™€ ๋ ˆ๋ชฌ์ฐจ์˜ ์กฐ๋ฆฌ๋ฒ•์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ดํŽด๋ณด๋ฉด ๋™์ผํ•œ ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

์ด๋ฅผ ํ†ตํ•ด์„œ prepareRecipe()๋ฅผ ์ถ”์ƒํ™” ๋ฐฉ์•ˆ ๊ณ ๋ ค

- 273 -

์ปคํ”ผ์™€ ๋ ˆ๋ชฌ์ฐจ ์กฐ๋ฆฌ๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ โ€“ prepareRecipe

1. ๋ฌผ์„ ๋“์ธ๋‹ค.

2. ์ปคํ”ผ ๋˜๋Š” ์ฐจ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋œจ๊ฑฐ์šด ๋ฌผ์— ๋„ฃ๋Š”๋‹ค.

3. ์Œ๋ฃŒ์กฐ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ปต์— ๋‹ด๋Š”๋‹ค.

4. ๊ธฐํ˜ธ์— ๋งž๊ฒŒ ์Œ๋ฃŒ์— ์ฒจ๊ฐ€๋ฌผ์„ ๋„ฃ๋Š”๋‹ค

๋ฌผ์„ ๋“์ด๋Š” ๊ฒƒ๊ณผ ์ปต์— ๋‹ด๋Š” ๊ฒƒ์€์ด๋ฏธ ์ถ”์ƒํด๋ž˜์Šค ๋‚ด์— ์ •์˜๋˜์–ด์žˆ๋‹ค.

์ถ”์ƒํด๋ž˜์Šค์— ์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋™์ผํ•˜๋‹ค. ๋‹จ์ง€ ์Œ๋ฃŒ๋งˆ๋‹ค ์ฐจ์ด๋งŒ ์žˆ์„ ๋ฟ์ด๋‹ค.

public void prepareRecipe() {

boilWater();

brewCoffeeGrinds();

pourInCup();

addSugarAndMilk();

}

Coffee ํด๋ž˜์Šค

public void prepareRecipe() {

boilWater();

steepTeaBag();

pourInCup();

addLemon();

}

Tea ํด๋ž˜์Šค

Page 274: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(4/9)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์บก์Šํ™” ํ•˜๊ธฐ (Encapsulating Algorithms)

์•ž์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ปคํ”ผ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‚˜ ์ฐจ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ๊ฒƒ์€ ์ฐจ์ด๊ฐ€ ์—†๊ณ  ์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‚˜ ๋ ˆ๋ชฌ์„ ๋„ฃ๋Š” ๊ฒƒ ๋˜ํ•œ ์ฐจ์ด๊ฐ€ ์—†์Œ

์ด ํ–‰์œ„๋“ค์„ ์ข€ ๋” ์ผ๋ฐ˜ํ™” ์‹œ์ผœ์•ผ ํ•จ

- 274 -

Beverage

+ prepareRecipe()+ brew()+ addCondiments()+ boilWater()+ pourInCup()

Coffee

+ brew()+ addCondiments()

Tea

+ brew()+ addCondiments()

์ด์ œ ์ปคํ”ผ๋‚˜ ๋ ˆ๋ชฌ์ฐจ๋‚˜ ๋™์ผํ•œ ์กฐ๋ฆฌ๋ฒ• ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. prepareRecipe() ๋ฉ”์†Œ๋“œ๋Š” ์ด์ œ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์žฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๊ฒŒ final๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

brew()์™€ addCondiments() ๋ฉ”์†Œ๋“œ๋Š” ์ปคํ”ผ์™€๋ ˆ๋ชฌ์ฐจ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์กฐ๋ฆฌ๋ฒ•์„ ์ ์šฉํ•˜๋ฏ€๋กœ ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋กœ ์„ ์–ธํ•˜๊ณ  ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

public void addCondiments() {

System.out.println("Adding Sugar and Milk...");

}

public void brew() {

System.out.println("Dripping Coffee through filter...");

}

public void addCondiments() {

System.out.println("Adding Lemon...");

}

public void brew() {

System.out.println("Steeping the tea...");

}

์ปคํ”ผํด๋ž˜์Šค์—์„œ ์ปคํ”ผ๋ฅผ ๋„ฃ๊ณ  ์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ์ฒจ๊ฐ€ํ•˜๋Š” ํ–‰์œ„๋ฅผ๊ตฌํ˜„ํ•œ๋‹ค.

์ฐจํด๋ž˜์Šค์—์„œ ์ฐจ๋ฅผ ์šฐ๋ ค๋‚ด๊ณ  ๋ ˆ๋ชฌ์„ ์ฒจ๊ฐ€ํ•˜๋Š” ํ–‰์œ„๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

Page 275: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(5/9)

Template ๋ฉ”์†Œ๋“œ์™€ Hook ๋ฉ”์†Œ๋“œ

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•˜๋‚˜ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ๋‹จ๊ณ„๋ฅผ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๋„๋ก ์ œ๊ณต

ํ›… ๋ฉ”์†Œ๋“œ๋Š” ์ถ”์ƒํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋“ค ์ค‘์—์„œ ๊ตฌํ˜„์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ๊ตฌํ˜„๋งŒ ๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์˜๋ฏธ

- 275 -

Beverage

+ prepareRecipe()+ brew()+ addCondiments()+ boilWater()+ pourInCup()+ customerWantsCondiments() : boolean

prepareRecipe() ๋ฉ”์†Œ๋“œ๋Š” ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ „์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๊ณ  ๋˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ…œํ”Œ๋ฆฟ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ ๋‹จ๊ณ„๋Š” ๋ฉ”์†Œ๋“œ์— ์˜ํ•ด์„œ ํ‘œํ˜„๋œ๋‹ค.

public void prepareRecipe() {

boilWater();

brew();

pourInCup();

addCondiments();

}

ํ›… ๋ฉ”์†Œ๋“œ๋Š” ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ณ€ํ™”๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํ›… ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฌด์‹œํ• ์ˆ˜ ์žˆ๋‹ค.

if (customerWantsCondiments()) {

addCondiments();

}

public boolean customerWantsCondiments() {

return true;

}

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ๋‚ด์— ํ›… ๋ฉ”์†Œ๋“œ์ ์šฉ

customerWantsConditions() ๋ฉ”์†Œ๋“œ๋Š”ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์ด ์žˆ์œผ๋ฏ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰์— ์˜ํ–ฅ์ด ์—†๋‹ค.

Page 276: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(6/9)

ํ• ๋ฆฌ์šฐ๋“œ ์›์น™ (Hollywood Principle)

์˜์กด์„ฑ ๋ฌธ์ œ๋กœ ๊ณ ์ˆ˜์ค€์˜ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์ €์ˆ˜์ค€์˜ ๊ตฌ์„ฑ์š”์†Œ์— ์˜์กดํ•˜๊ณ  ๋ฐ˜๋Œ€๋กœ ์ €์ˆ˜์ค€์˜๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๊ณ ์ˆ˜์ค€์˜ ๊ตฌ์„ฑ์š”์†Œ์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ์˜์กด์„ฑ์ด ๊ผฌ์ด๊ฒŒ ๋จ

์ด๋Ÿฌํ•œ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์›์น™์„ ๋งํ•จ

- 276 -

High-Level Component

Low-Level

Component

Low-Level

Component

The Hollywood Principle

โ€œDon not call us, we will call youโ€

Low-Level Component๋Š” ๊ฐ๊ฐ์ž์‹ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ถฉ์‹คํ•˜๋ฉด ๋œ๋‹ค.

Low-Level Component๋Š” ์ ˆ๋Œ€ ์ง์ ‘ High-Level Component๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

High-Level Component๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ์ž‘๊ณผ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•œ๋‹ค.Template Method ํŒจํ„ด์—์„œ๋„ ํ…œํ”Œ๋ฆฟ

๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ƒ์œ„ํด๋ž˜์Šค๊ฐ€์ „์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ์–ดํ•˜๊ณ  ์žˆ๊ณ  ํ•˜์œ„ํด๋ž˜์Šค๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด ํ• ๋ฆฌ์šฐ๋“œ ์›์น™์„ ์ ์šฉํ•œ ์ข‹์€์˜ˆ์ด๋‹ค.

Page 277: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(7/9)

Client ํด๋ž˜์Šค ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

- 277 -

public static void main(String[] args) {

Client client = new Client();

Beverage coffee = client.pressCoffeeButton();

coffee.prepareRecipe();

System.out.println();

Beverage tea = client.pressTeaButton();

tea.prepareRecipe();

System.out.println();

System.out.println("๋ธ”๋ž™์ปคํ”ผ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์…จ์Šต๋‹ˆ๋‹ค.");

((Coffee) coffee).setCustomerWantsCondiments(false);

coffee.prepareRecipe();

}

Hook ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€๊ฒฝํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.

Page 278: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(8/9)

์ ์šฉ

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ํ•œ ๋ฒˆ ์ •์˜ํ•˜๊ณ  ๋‹ค์–‘ํ•ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•  ๋•Œ

ํ•˜์œ„ํด๋ž˜์Šค ์‚ฌ์ด์˜ ๊ณตํ†ต์ ์ธ ํ–‰์œ„๋ฅผ ์ถ”์ถœํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ณตํ†ต ํด๋ž˜์Šค๋กœ ์ •์˜ํ•  ๋•Œ

โ€ข ์ผ๋ฐ˜ํ™”๋ฅผ ์œ„ํ•œ ๋ฆฌํŽ™ํ† ๋ง์˜ ์˜ˆ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ

โ€ข ๊ธฐ์กด ์ฝ”๋“œ์—์„œ์˜ ์ฐจ์ด๋ฅผ ์‹๋ณ„ํ•œ ํ›„ ์ด๋ฅผ ์ƒˆ๋กœ์šด ์˜คํผ๋ ˆ์ด์…˜์œผ๋กœ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Œ

โ€ข ์ฐจ์ด๋ฅผ ๋ณด์ด๋Š” ๋ถ€๋ถ„์„ ํ…œํ”Œ๋ฆฟ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜ํ•˜๊ณ  ๋‚˜์ค‘์— ์ƒ์†๋ฐ›์€ ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ์ •์˜ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜์„ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•จ

ํ•˜์œ„ํด๋ž˜์Šค ํ™•์žฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

โ€ข ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๊ฐ€ ์–ด๋–ค ํŠน์ •ํ•œ ์‹œ์ ์— ํ›…(Hook) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ •์˜

โ€ข ์‹ค์ œ๋กœ ์ด ํ›…(Hook) ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„ ์ƒˆ๋กœ์šด ํ™•์žฅ์ด ์ด๋ฃจ์–ด์ง

- 278 -

Page 279: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒจํ„ด์†Œ๊ฐœ โ€“ Template Method ํŒจํ„ด(9/9)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 279 -

AbstractClass

+ templateMethod()

+ primitiveOperation1()

+ primitiveOperataon2()

ConcreteClass

+ primitiveOperation1()

+ primitiveOperataon2()

public void templateMethod() {

...

primitiveOperation1();

primitiveOperation2();

...

}

Page 280: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

4.4 ๊ธฐํƒ€ ์ƒ์„ฑ ํŒจํ„ด ์†Œ๊ฐœ

Command ํŒจํ„ด

Interpreter ํŒจํ„ด

Iterator ํŒจํ„ด

Mediator ํŒจํ„ด

Memento ํŒจํ„ด

Observer ํŒจํ„ด

State ํŒจํ„ด

Visitor ํŒจํ„ด

- 280 -

Page 281: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Command ํŒจํ„ด(1/6)

์˜๋„

์š”์ฒญ ์ž์ฒด๋ฅผ ๊ฐ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ

์„œ๋กœ ๋‹ค๋ฅธ ์š”์ฒญ์„ ๊ฐ์ฒดํ™”ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

๋™๊ธฐ

๊ฐ„๋‹จํ•œ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ ์˜ˆ์ œ๋กœ ๋งˆ์šฐ์Šค๋ฅผ ๋Œ๋ฉด ๋นจ๊ฐ„ ์ ์ด ์—ฐ๊ฒฐ๋˜์–ด ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง

[clear] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ ์ด ๋ชจ๋‘ ์ง€์› ์ง

- 281 -

Page 282: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Command ํŒจํ„ด(2/6)

๋™๊ธฐ

- 282 -

<<interface>>

Command

+ execute()

MacroCommand

+ execute() + clear()+ undo()

DrawCommand

+ execute()

<<interface>>

Drawable

+ draw()

DrawCanvas

+ draw()+ paint()

Main

- drawable

- commands

*

- canvas

public void execute() {

drawable.draw(position.x, position.y);

}

public void execute() {

Iterator it = commands.iterator();

while (it.hasNext()) {

((Command) it.next()).execute();

}

}public void paint(Graphics g) {

history.execute();

}

๊ทธ๋ฆฌ๊ธฐ ํ˜ธ์ถœ

๊ทธ๋ฆผ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น ํด๋ž˜์Šค

์—ฌ๋Ÿฌ ๋ช…๋ น์„ ๋ชจ์€ ๋ช…๋ น ํด๋ž˜์Šค

๋ช…๋ นํ‘œํ˜„ ์ธํ„ฐํŽ˜์ด์Šค

๋™์ž‘ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค

๊ทธ๋ฆฌ๊ธฐ ๋Œ€์ƒ ํด๋ž˜์Šค

๊ทธ๋ฆฌ๊ธฐ ๋Œ€์ƒ ์ธํ„ฐํŽ˜์ด์Šค

Page 283: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Command ํŒจํ„ด(3/6)

๋™๊ธฐ

- 283 -

framework ofjava.awt

: Main

: DrawCommand

mouseDragged()

new

execute()

: DrawCanvas : MacroCommand

draw()

paint()

execute()

execute()

draw()

Page 284: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Command ํŒจํ„ด(4/6)

์ ์šฉ

์ˆ˜ํ–‰ํ•  ํ–‰์œ„ ์ž์ฒด๋ฅผ ๊ฐ์ฒด๋กœ ํŒŒ๋ผ๋ฉ”ํ„ฐํ™”ํ•˜๊ณ ์ž ํ•  ๋•Œ CommandํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์š”์ฒญ์„ ๋ช…์‹œํ•˜๊ณ  ์ €์žฅํ•˜๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. Command ๊ฐ์ฒด๋Š” ์›๋ž˜์˜์š”์ฒญ๊ณผ๋Š” ๋‹ค๋ฅธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

๋ช…๋ น์–ด ๊ฐ์ฒด ์ž์ฒด์— ์‹คํ–‰ ์ทจ์†Œ์— ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€๊ฒฝ ๊ณผ์ •์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ ๋‘๋ฉด ์‹œ์Šคํ…œ์ด ๊ณ ์žฅ ๋‚ฌ์„ ๋•Œ ์›์ƒํƒœ๋กœ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์˜คํผ๋ ˆ์ด์…˜์˜ ์กฐํ•ฉ์œผ๋กœ ์ข€ ๋” ๊ณ ๋‚œ์ด๋„์˜ ์˜คํผ๋ ˆ์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •๋ณด์‹œ์Šคํ…œ์˜ ์ผ๋ฐ˜์ ์ธ ํŠน์„ฑ์€ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Command ํŒจํ„ด์€ ์ด๋ŸฐํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋ธ๋ง์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

- 284 -

Page 285: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Command ํŒจํ„ด(5/6)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 285 -

Client

<<interface>>

Command

+ execute()

Receiver

+ action()

ConcreteCommand

+ execute()

Invoker

- receiver

creates

Page 286: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Command ํŒจํ„ด(6/6)

Sequence

- 286 -

: Client

: ConcreteCommand

: Reciever

// create

execute()

action()

: Invoker

Page 287: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Interpreter ํŒจํ„ด(1/5)

์˜๋„

์–ด๋–ค ์–ธ์–ด๋Š” ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ํ‘œํ˜„์„ ์ •์˜ํ•˜๋ฉด์„œ ๊ทธ ์–ธ์–ด๋กœ ๊ธฐ์ˆ ๋œ ๋ฌธ์žฅ์„ ํ•ด์„ํ•˜๋Š” ๊ธฐ๋ฒ•์„ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋„ ํ•จ๊ป˜ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ

๋™๊ธฐ

๋ฌด์„ ์กฐ์ •๊ธฐ๋กœ ์ž๋™์ฐจ๋ฅผ ์›€์ง์ด๋Š” ๋ฏธ๋‹ˆ ์–ธ์–ด ์˜ˆ์ œ

์ž๋™์ฐจ๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น

โ€ข ์•ž์œผ๋กœ 1๋ฏธํ„ฐ ์ „์ง„ (go)

โ€ข ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐฉํ–ฅ์ „ํ™˜ (right)

โ€ข ์™ผ์ชฝ์œผ๋กœ ๋ฐฉํ–ฅ์ „ํ™˜ (left)

๋ฐ˜๋ณต๋ช…๋ น์„ ํ†ตํ•ด์„œ ์ž๋™์ฐจ๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

- 287 -

go

rightleft

1.go

2.right3.go

4. right

6. right8. right

5.go

7.go

Page 288: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Interpreter ํŒจํ„ด(2/5)

๋™๊ธฐ

- 288 -

Node

+ parse()

Context

+ nextToken() + currentToken()+ skipToken()

RepeatCommandNodeProgramNode

Maincreates

uses

CommandListNode CommandNode PrimitiveCommandNode

๊ตฌ๋ฌธํŠธ๋ฆฌ ๋…ธ๋“œํด๋ž˜์Šค

<program>์—

๋Œ€์‘ํ•˜๋Š” ํด๋ž˜์Šค<repeat command>์— ๋Œ€์‘ํ•˜๋Š” ํด๋ž˜์Šค

<command list>์— ๋Œ€์‘ํ•˜๋Š” ํด๋ž˜

์Šค

<command>์—

๋Œ€์‘ํ•˜๋Š” ํด๋ž˜์Šค<primitive

command>์— ๋Œ€์‘ํ•˜๋Š” ํด๋ž˜์Šค

๊ตฌ๋ฌธํ•ด์„์„ ์œ„ํ•œ ์ „ํ›„ ๊ด€๊ณ„ ํด๋ž˜์Šค๋™์ž‘ ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค

public void parse(Context context) throws ParseException

{

name = context.currentToken();

context.skipToken(name);

if (!name.equals("go") && !name.equals("right")

&& !name.equals("left")) {

throw new ParseException(name + "is undefined");

}

}

PrimitiveCommandNode์˜ parse() ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

Page 289: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Interpreter ํŒจํ„ด(3/5)

๋ฏธ๋‹ˆ ์–ธ์–ด ํ”„๋กœ๊ทธ๋žจ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ

- 289 -

: ProgramNode

: CommandListNode

: RepeatCommandNode

: CommandListNode

go : PrimitiveCommandNode right : PrimitiveCommandNode

Page 290: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Interpreter ํŒจํ„ด(4/5)

์ ์šฉ

ํ•ด์„์ด ํ•„์š”ํ•œ ์–ธ์–ด๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋กœ ์–ธ์–ด์— ์ •์˜๋œ ๋ฌธ์žฅ์„ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด Interpreter ํŒจํ„ด์„ ์‚ฌ์šฉ

์ •์˜ํ•  ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์ด ๊ฐ„๋‹จ

โ€ข ๋ฌธ๋ฒ•์ด ๋ณต์žกํ•  ๊ฒฝ์šฐ๋ผ๋ฉด ๋ฌธ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค ๊ณ„์ธต๋„๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์Œ

โ€ข ์ด๋Ÿด ๋•Œ๋Š” Interpreter ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”๋‚˜์€ ๋ฐฉ๋ฒ•

ํšจ์œจ์„ฑ์€ ๋ณ„๋กœ ๊ณ ๋ ค์‚ฌํ•ญ์ด ๋˜์ง€ ์•Š์Œ

โ€ข ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ํŒŒ์Šค ํŠธ๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์„ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๊ณ  ํŒŒ์Šค ํŠธ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ณ€ํ˜•์‹œํ‚ค๋Š” ๊ฒƒ

โ€ข ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์ •๊ทœ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ•œ ์ƒํƒœ ๊ธฐ๊ณ„(Finite State Machine) ๊ฐœ๋…์œผ๋กœ ๋ณ€ํ˜•

โ€ข ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์œ ํ•œ ์ƒํƒœ ๊ธฐ๊ณ„๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๋ฒˆ์—ญ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ, Interpreter ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

- 290 -

Page 291: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Interpreter ํŒจํ„ด(5/5)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 291 -

Client

AbstractExpression

+ interpret(Context)

TerminalExpression

+ interpret(Context)

createsContext

+ getInfoToInterpret()

NonterminalExpression

+ interpret(Context)

uses

Page 292: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Iterator ํŒจํ„ด(1/4)

์˜๋„

๋ณตํ•ฉ ๊ฐ์ฒด ์š”์†Œ์˜ ๋‚ด๋ถ€ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ ๋„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต

๋™๊ธฐ

์„œ๊ฐ€(BookShelf)์— ์ฑ…(Book)์„ ๋„ฃ๊ณ  ์ฑ…์ด๋ฆ„์„ ์ˆœ์„œ๋Œ€๋กœ ํ‘œ์‹œํ•˜๋Š” ์˜ˆ์ œ

- 292 -

BookShelf

Book

BookShelfIterator

Page 293: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Iterator ํŒจํ„ด(2/4)

๋™๊ธฐ

- 293 -

<<interface>>

Iterator

+ hasNext() + next()

BookShelfIterator

+ hasNext() + next()

Book

+ getName()

<<interface>>

Aggregate

+ iterator()

BookShelf

+ appendBook()+ getBookAt()+ iterator()

creates์ง‘ํ•ฉ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”์ธํ„ฐํŽ˜์ด์Šค

ํ•˜๋‚˜์”ฉ ์—ด๊ฑฐํ•˜๋ฉด์„œ ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

์ฑ…์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค

์„œ๊ฐ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค

์„œ๊ฐ€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ํด๋ž˜์Šค

public Iterator iterator() {

return new BookShelfIterator(this);

}

์„œ๊ฐ€์˜ Iterator ๊ตฌ์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์ž์‹ ์„ ๋„˜๊ฒจ์ค€๋‹ค.

public boolean hasNext() {

if (index < bookShelf.getLength()) { return true; }

else { return false; }

}

public Object next() {

Book book =

bookShelf.getBookAt(index);

index++;

return book;

}

์„œ๊ฐ€์˜ Book ์ธ๋ฑ์Šค๋ฅผ ์ฒดํฌํ•œ๋‹ค.

์„œ๊ฐ€์˜ ํ˜„์žฌ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” Book์„ ๋ฆฌํ„ดํ•œ๋‹ค.

Page 294: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Iterator ํŒจํ„ด(3/4)

์ ์šฉ

๊ฐ์ฒด ๋‚ด๋ถ€ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๋ชจ๋ฅด๊ณ ๋„ ์ง‘ํ•ฉ ๊ฐ์ฒด์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ˆœํšŒ

์ง‘ํ•ฉ ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ์‹œ

์„œ๋กœ ๋‹ค๋ฅธ ์ง‘ํ•ฉ ๊ฐ์ฒด ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒ

- 294 -

Page 295: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Iterator ํŒจํ„ด(4/4)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 295 -

<<interface>>

Aggregate

+ iterator()

creates

ConcreteIterator

+ hasNext()+ next()

- aggregateConcreteAggregate

+ iterator()

<<interface>>

Iterator

+ hasNext()+ next()

Page 296: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Mediator ํŒจํ„ด(1/5)

์˜๋„

๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์บก์Šํ™”ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฐ์ฒด ์•ˆ์— ์ •์˜

Mediator ํŒจํ„ด์€ ๊ฐ ๊ฐ์ฒด๊ฐ€ ๊ด€๋ จ์„ฑ์„ ๊ฐ–๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ด€๊ณ„๋ฅผ ์ง์ ‘ ์ •์˜ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ด๋ฅผ ๋…๋ฆฝ๋œ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ๊ด€๋ฆฌ

๋™๊ธฐ

์ด๋ฆ„๊ณผ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋กœ๊ทธ์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ์— ๋Œ€ํ•œ GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์ œ

GUI ์‚ฌ์šฉ๋ฐฉ๋ฒ•

โ€ข ๊ฒŒ์ŠคํŠธ ๋กœ๊ทธ์ธ[Guest]์ด๋‚˜ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ[Login] ์„ ํƒ

โ€ข ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋ช…[Username]๊ณผ ํŒจ์Šค์›Œ๋“œ[Password]๋ฅผ ์ž…๋ ฅ

โ€ข ๋กœ๊ทธ์ธํ•˜๋ฉด [OK]๋ฒ„ํŠผ, ์ค‘์ง€ํ•˜๋ ค๋ฉด [Cancel]๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ„

- 296 -

GUI ์ƒํƒœ๋ณ€ํ™”

โ€ข ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ์ด ์„ ํƒ๋˜์–ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž๋ช…์€ Enable์ด์ง€๋งŒ ํŒจ์Šค์›Œ๋“œ๋Š” Disable

โ€ข ์‚ฌ์šฉ์ž๋ช…์ด ํ•œ ๋ฌธ์ž๋ผ๋„ ์ž…๋ ฅ์ด ๋˜๋ฉด ํŒจ์Šค์›Œ๋“œ๋Š” Enable ์ด์ง€๋งŒ OK๋ฒ„ํŠผ์€ Disable

โ€ข ํŒจ์Šค์›Œ๋“œ์—๋„ ๋ฌธ์ž๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด OK๋ฒ„ํŠผ๋„ Enable

โ€ข ์—ฌ๊ธฐ์„œ ๊ฒŒ์ŠคํŠธ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋ช…๋„ ํŒจ์Šค์›Œ๋“œ๋„ Disable

โ€ข ํŒจ์Šค์›Œ๋“œ๊ฐ€ ๋“ค์–ด์žˆ์–ด๋„ ์‚ฌ์šฉ์ž๋ช…์„ ์‚ญ์ œํ•˜๋ฉด OK๋ฒ„ํŠผ๊ณผ ํŒจ์Šค์›Œ๋“œ๋Š” Disable

Page 297: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Mediator ํŒจํ„ด(2/5)

๋™๊ธฐ

- 297 -

<<interface>>

Colleague

+ setMediator()+ setColleagueEnabled()

ColleagueButton

Frame

<<interface>>

Mediator

+ createColleagues()+ colleagueChanged()

LoginFrame

checkGuestcheckLogintextUsertextPassbuttonOkbuttonCancel

+ createColleagues()+ colleagueChanged()+ userpassChanged()+ actionPerformed()

ColleagueTextFeild

+ textValueChanged()

ColleagueCheckbox

+ itemStateChanged()

Button

TextFeild

Checkbox

- mediator

public class ColleagueButton

extends Button implements Colleague { ... }

public class ColleagueButton

extends TextFeild implements Colleague { ... }

public class ColleagueButton

extends Checkbox implements Colleague { ... }

์ค‘๊ณ„์ž๋ฅผ ์ •ํ•˜๋Š”์ธํ„ฐํŽ˜์ด์Šค

๋ฉค๋ฒ„๋ฅผ ์ •ํ•˜๋Š”์ธํ„ฐํŽ˜์ด์Šค

Mediator ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด

Page 298: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Mediator ํŒจํ„ด(3/5)

์ ์šฉ

์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ์ž˜ ์ •์˜๋œ ํ˜•ํƒœ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ, ๊ฐ์ฒด๋“ค ๊ฐ„์˜์˜์กด์„ฑ์„ ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ

๊ฐ์ฒด์˜ ์žฌ์‚ฌ์šฉ์ด ๋‹ค๋ฅธ ๊ฐ์ฒด์™€์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„์˜ ๋ณต์žกํ•จ์œผ๋กœ ์ธํ•ด ๋ฐฉํ•ด๋ฅผ ๋ฐ›์„ ๋•Œ

์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ๋ถ„์‚ฐ๋œ ํ–‰์œ„๋“ค์ด ์ƒ์† ์—†์ด ์ˆ˜์ •๋˜์–ด์•ผ ํ•  ๋•Œ

- 298 -

Page 299: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Mediator ํŒจํ„ด(4/5)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 299 -

Mediator

+ createColleagues()+ colleagueChanged()

ConcreteColleague1

+ controlColleague()

- mediator

ConcreteMediator

+ createColleagues()+ colleagueChanged()

Colleague

+ setMediator()+ controlColleague()

ConcreteColleague3

+ controlColleague()

ConcreteColleague2

+ controlColleague()

Page 300: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Mediator ํŒจํ„ด(5/5)

๊ฐ์ฒด ๊ฐ„์˜ ๋ฉ”์‹œ์ง€ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- 300 -

aColleague

mediator

aConcreteMediator

aColleague

mediator

aColleague

mediator

aColleague

mediator

aColleague

mediator

Page 301: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Memento ํŒจํ„ด(1/4)

์˜๋„

์บก์Šํ™”๋ฅผ ์œ„๋ฐฐํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ํ‘œํ˜„ํ•จ

๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•ด ๋‘” ์ƒํƒœ๋กœ ๋‹ค์‹œ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

๋™๊ธฐ

์ฃผ์‚ฌ์œ„ ๊ฒŒ์ž„์œผ๋กœ ๊ณผ์ผ ๋ชจ์œผ๊ธฐ ๊ฒŒ์ž„ ์˜ˆ์ œ

์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ ธ ๋‚˜์˜จ ์ˆ˜๊ฐ€ ๋‹ค์Œ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ์ข‹์€ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ˆ๊ณผ ๊ณผ์ผ์„ ๋ฐ›๋Š”๋‹ค. ๋‚˜์œ ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ˆ์ด ์ค„๊ณ  ๋ˆ์ด ์—†์œผ๋ฉด ๊ฒŒ์ž„์€ ์ข…๋ฃŒ

- 301 -

requests

Memento

+ getMoney()# addFruit()

creates

Main Gamer

+ getMoney()bet()createMemento()restoreMemento()

Page 302: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Memento ํŒจํ„ด(2/4)

์ ์šฉ

๊ฐ ์‹œ์ ์—์„œ์˜ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ ํ›„ ๋‚˜์ค‘์— ์ด ์ƒํƒœ๋กœ ๋ณต๊ตฌํ•ด์•ผ ํ•  ๋•Œ

์ƒํƒœ๋ฅผ ์–ป๋Š”๋ฐ ํ•„์š”ํ•œ ์ง์ ‘ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด์˜ ์ž์„ธํ•œ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ํ•˜๊ณ  ๊ฐ์ฒด์˜ ์บก์Šํ™”๋ฅผ ์œ„๋ฐฐํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ

- 302 -

Page 303: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Memento ํŒจํ„ด(3/4)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 303 -

requests

Memento

+ setMemento(Memento) : void+ createMemento() : Memento

creates

Caretaker Originator

+ createMemento()+ restoreMemento()

Page 304: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Memento ํŒจํ„ด(4/4)

Sequence

- 304 -

: Originator

: Memento// create

createMemento()

: Caretaker

setState()

setMemento(Memento)

getState()

Page 305: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Observer ํŒจํ„ด(1/4)

์˜๋„

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

๋™๊ธฐ

์ˆซ์ž๋ฅผ ๋งŽ์ด ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ด€์ฐฐ์ž๊ฐ€ ๊ด€์ฐฐํ•ด์„œ ๊ทธ ๊ฐ’์„ ๊ฐ„์ด ๊ทธ๋ž˜ํ”„์— ์ˆซ์ž๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์˜ˆ์ œ

- 305 -

NumberGenerator

+ addObserver(Observer)+ deleteObserver()+ notifyObservers()+ getNumber()+ execute()

notifies

ConcreteIterator

+ update()

- observers

RandomNumberGenerator

+ getNumber()+ execute()

<<interface>>

Observer

+ update()

*

ConcreteIterator

+ update()

Page 306: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Observer ํŒจํ„ด(2/4)

์ ์šฉ

์ถ”์ƒํ™” ๊ฐœ๋…์ด ๋‘ ๊ฐ€์ง€์˜ ์ธก๋ฉด์„ ๊ฐ–๊ณ  ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜์— ์ข…์†์ ์ผ ๋•Œ.

โ€ข ์ด๋Ÿฐ ์ข…์† ๊ด€๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌ์‹œ์ผœ ์ด๋“ค ๊ฐ๊ฐ์„ ์žฌ์‚ฌ์šฉ

ํ•œ ๊ฐ์ฒด์— ๊ฐ€ํ•ด์ง„ ๋ณ€๊ฒฝ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€๊ฐ์ฒด๋“ค์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ชฐ๋ผ๋„ ๋จ

๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ณ€ํ™”๋ฅผ ํ†ต๋ณดํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ณ€ํ™”์— ๊ด€์‹ฌ ์žˆ์–ดํ•˜๋Š” ๊ฐ์ฒด๋“ค์ด ๋ˆ„๊ตฌ์ธ์ง€์— ๋Œ€ํ•œ ๊ฐ€์ • ์—†์ด๋„ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•  ๋•Œ

- 306 -

Page 307: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Observer ํŒจํ„ด(3/4)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 307 -

Subject

+ addObserver(Observer)+ deleteObserver()+ notifyObserver()+ getSubjectStatus()+ setSubjectStatus()

ConcreteObserver

+ update()

notifies

ConcreteSubject

+ getSubjectStatus()+ setSubjectStatus()

Observer

+ update()

-subject

-observers

*

Page 308: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Observer ํŒจํ„ด(4/4)

Sequence

- 308 -

: ConcreteObserver : ConcreteObserver

setSubjectStatus()

: ConcreteSubject

notifyObserver()

update()

update()

getSubjectStatus()

getSubjectStatus()

Page 309: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

State ํŒจํ„ด(1/3)

์˜๋„

๊ฐ์ฒด ์ž์‹ ์˜ ๋‚ด๋ถ€ ์ƒํƒœ์— ๋”ฐ๋ผ ํ–‰์œ„๋ฅผ ๋ณ€๊ฒฝ

๊ฐ์ฒด๊ฐ€ ํด๋ž˜์Šค๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Œ

๋™๊ธฐ

์‹œ๊ฐ๋งˆ๋‹ค ๊ฒฝ๋น„์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ธˆ๊ณ ๊ฒฝ๋น„ ์‹œ์Šคํ…œ ์˜ˆ์ œ

์ฃผ๊ฐ„์— ๊ธˆ๊ณ ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ๊ธฐ๋ก์„ ๋‚จ๊น€

์•ผ๊ฐ„์— ์‚ฌ์šฉํ•˜๋ฉด ๋น„์ƒ์‚ฌํƒœ์˜ ํ†ต๋ณด๊ฐ€ ๊ฐ€๋„๋ก ํ•จ

- 309 -

<<interface>>

Context

+ changeState()

+ callSecurityCenter()

DayState

SafeFrame

+ changeState()+ callSecurityCenter()

<<interface>>

State

+ doClock()+ doUse()+ doAlarm()

NightState

Page 310: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

State ํŒจํ„ด(2/3)

์ ์šฉ

๊ฐ์ฒด์˜ ํ–‰์œ„๋Š” ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„ ์‹œ์—ํ–‰์œ„๊ฐ€ ๋ฐ”๋€Œ์–ด์•ผ ํ•จ

๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์ˆ˜๋งŽ์€ ์กฐ๊ฑด ๋ฌธ์žฅ์„ ๊ฐ–๋„๋ก ์˜คํผ๋ ˆ์ด์…˜์„ ๊ตฌํ˜„

โ€ข ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜(enumerated constant)๋กœ ์ •์˜

โ€ข ์–ด๋–ค ๊ฒฝ์šฐ๋Š” ๋™์ผํ•œ ์กฐ๊ฑด ๋ฌธ์žฅ๋“ค์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜คํผ๋ ˆ์ด์…˜์— ์ค‘๋ณต ์ •์˜ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ

โ€ข ์ด๋•Œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ„๋„์˜ ๊ฐ์ฒด๋กœ ์ •์˜ํ•จ์œผ๋กœ์จ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์ƒ๊ด€์—†์ด ๋‹ค์–‘ํ™”

- 310 -

Page 311: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

State ํŒจํ„ด(3/3)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 311 -

Context

+ request()

ConcreteState1

+ handle()

- stateState

+ handle()

ConcreteState2

+ handle()

Page 312: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Visitor ํŒจํ„ด(1/4)

์˜๋„

๊ฐ์ฒด ๊ตฌ์กฐ์— ์†ํ•œ ์š”์†Œ์— ์ˆ˜ํ–‰๋  ์˜คํผ๋ ˆ์ด์…˜์„ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด

Visitor ํŒจํ„ด์€ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ์š”์†Œ์— ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์˜คํผ๋ ˆ์ด์…˜์„ ์ •์˜

๋™๊ธฐ

ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•ˆ์„ ๋ฐฉ๋ฌธ์ž๊ฐ€ ์ฐพ์•„ ๋‹ค๋‹ˆ๋Š” ํŒŒ์ผ์˜ ์ผ๋žŒ์„ ํ‘œ์‹œํ•˜๋Š” ์˜ˆ์ œ

- 312 -

Visitor

+ visit(File)+ visit(Directory)

DirectoryListVisitor

<<interface>>

Acceptor

+ accept()

File

Entry

+ getName()+ getSize()+ iterator()

Mainuses

uses

uses

Page 313: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Visitor ํŒจํ„ด(2/4)

์ ์šฉ

๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ ๊ตฌ์ฒด์  ํด๋ž˜์Šค์— ๋”ฐ๋ผ ์ด๋“ค ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•  ๋•Œ.

๊ตฌ๋ณ„๋˜๊ณ  ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋งŽ์€ ์˜คํผ๋ ˆ์ด์…˜์ด ๊ฐ์ฒด์— ์ˆ˜ํ–‰๋  ํ•„์š”๊ฐ€ ์žˆ์ง€๋งŒ ์˜คํผ๋ ˆ์ด์…˜์œผ๋กœ ์ธํ•ด ํด๋ž˜์Šค๋“ค์„ ๋ณต์žกํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ.

โ€ข Visitorํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์˜คํผ๋ ˆ์ด์…˜์„ ํ•จ๊ป˜ ์ •์˜ํ•จ์œผ๋กœ์จ ๊ด€๋ จ๋œ ์˜คํผ๋ ˆ์ด์…˜์„ ์œ ์ง€

๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ ํด๋ž˜์Šค๋Š” ๊ฑฐ์˜ ๋ณ€ํ•˜์ง€ ์•Š์ง€๋งŒ ์ „์ฒด ๊ตฌ์กฐ์— ๊ฑธ์ณ ์ƒˆ๋กœ์šด ์˜คํผ๋ ˆ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ชจ๋“  Visitor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์žฌ์ •์˜

- 313 -

Page 314: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Visitor ํŒจํ„ด(3/4)

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 314 -

Visitor

+ visit(ConcreteAcceptorA)+ visit(ConcreteAcceptorB)

ConcreteAcceptorA

+ operation()

ConcreteVisitor

Acceptor

+ accept()

ObjectStructure

Client

ConcreteAcceptorB

+ operation()

Page 315: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

Visitor ํŒจํ„ด(4/4)

Sequence

- 315 -

: ConcreteAcceptorA : ConcreteAcceptorB : ConcreteVisitor

accept(Visitor)

visit(ConcreteAcceptorA)

operation()

: ObjectStructure

accept(Visitor)

visit(ConcreteAcceptorB)

operation()

Page 316: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

5. ํŒจํ„ด๊ธฐ๋ฐ˜ ์„ค๊ณ„

ํŒŒ์ผ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ

ํŒŒ์ผ์‹œ์Šคํ…œ ํŠน์ง•

๊ธฐ๋ณธ ์„ค๊ณ„

์ ์šฉ ํŒจํ„ด โ€“ Composite ํŒจํ„ด

ํ™•์žฅ์š”๊ตฌ โ€“ mkdir

ํ™•์žฅ์š”๊ตฌ โ€“ symbolic link

์ ์šฉํŒจํ„ด โ€“ Proxy ํŒจํ„ด

์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์„ค๊ณ„

ํ™•์žฅ์š”๊ตฌ โ€“ cat,ls

์ ์šฉํŒจํ„ด โ€“ Visitor ํŒจํ„ด

ls,cat ์„ค๊ณ„

์š”์•ฝ

- 316 -

Page 317: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

317

ํŒŒ์ผ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ(1/2)

ํŒŒ์ผ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ

์‚ฌ์šฉ์ž ๊ด€์ 

โ€ข ์ž„์˜์˜ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง„ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

โ€ข ํŒŒ์ผ ๊ตฌ์กฐ์˜ ๊นŠ์ด์™€ ๋„“์ด์— ํ•œ๊ณ„๊ฐ€ ์—†์–ด์•ผ ํ•จ

ํด๋ผ์ด์–ธํŠธ(explorer) ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ด€์ 

โ€ข ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๊ณ  ํ™•์žฅํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•จ

โ€ข ํด๋”์™€ ํŒŒ์ผ์„ ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

โ€ข ์žฌ-๊ตฌํ˜„์—†์ด ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ํŒŒ์ผ(์˜ˆ, symbolic links)์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

Page 318: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒŒ์ผ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ(1/2)

ํƒ์ƒ‰๊ธฐ๋Š” ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ํด๋ผ์ด์–ธํŠธ ์ž„

ํŒŒ์ผ์‹œ์Šคํ…œ์€ ์ปค๋„ ๋‚ด๋ถ€ ๋˜๋Š” ์ปค๋„ ์œ„์— ์กด์žฌํ•˜๋Š” ์‹œ์Šคํ…œ ์„œ๋น„์Šค

- 318 -

Page 319: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

319

ํŒŒ์ผ ์‹œ์Šคํ…œ ํŠน์ง•(1/2)

ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ

ํด๋”๋Š” ํด๋”๋ฅผ ๊ฐ€์ง„๋‹ค.

ํด๋”๋Š” ํŒŒ์ผ์„ ๊ฐ€์ง„๋‹ค.

ํด๋”์™€ ํŒŒ์ผ์€ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ํด๋”๋ฅผ ๊ฐ€์ง„๋‹ค.

๋ฃจํŠธํด๋”

ํด๋” ํด๋” ํด๋”

ํด๋” ํŒŒ์ผ ํŒŒ์ผ ํŒŒ์ผ ํŒŒ์ผ

Page 320: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํŒŒ์ผ ์‹œ์Šคํ…œ ํŠน์ง•(2/2)

์„ค๊ณ„๋ฅผ ์œ„ํ•ด, ํŒŒ์ผ ์‹œ์Šคํ…œ ํŠน์ง•์„ ์ถ”์ƒํ™”ํ•˜์ž

๋ฃจํŠธ ์กด์žฌ

ํด๋”๊ฐ€ ํด๋”๋ฅผ ๊ฐ€์ง€๊ณ 

ํด๋”๊ฐ€ ํŒŒ์ผ์„ ๊ฐ€์ง„๋‹ค.

ํด๋”์™€ ํŒŒ์ผ์€ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

- 320 -

๋ฃจํŠธํด๋”

ํด๋” ํด๋” ํด๋”

ํด๋” ํŒŒ์ผ ํŒŒ์ผ ํŒŒ์ผ ํŒŒ์ผ

Node๋กœ ๊ตฌ์„ฑ๋œ

ํŠธ๋ฆฌ๊ตฌ์กฐ

๋ฃจํŠธ๋…ธ๋“œ

์ค‘๊ฐ„๋…ธ๋“œ์ค‘๊ฐ„๋…ธ๋“œ ๋‹จ๋ง๋…ธ๋“œ

๋‹จ๋ง๋…ธ๋“œ๋‹จ๋ง๋…ธ๋“œ๋‹จ๋ง๋…ธ๋“œ

Page 321: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ธฐ๋ณธ ์„ค๊ณ„ - ํŠธ๋ฆฌ๋…ธ๋“œ

์ถ”์ƒํ™” ๊ฒฐ๊ณผ

ํŒŒ์ผ์€ ๋…ธ๋“œ์ด๋‹ค.

ํด๋”๋„ ๋…ธ๋“œ์ด๋‹ค.

ํด๋”๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ ํด๋”๋ฅผ ๊ฐ€์ง„๋‹ค.

- 321 -

Node

File Folder

Client

public abstract class Node {// ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šคโ€ฆ.protected Node(){

โ€ฆ}โ€ฆ.

}

public class Folder extends Node {public Folder() {

โ€ฆ}// ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์žฌ์ •์˜private List<Node> nodes;

}

public class File extends Node {public File() {

โ€ฆ..}// ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์žฌ์ •์˜

}

- nodes

0..*

1

Page 322: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ธฐ๋ณธ ์„ค๊ณ„ - ๋…ธ๋“œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜

์†์„ฑ

name: ๋…ธ๋“œ์˜ ์ด๋ฆ„

size: ๋…ธ๋“œ ํฌ๊ธฐ(๋ฐ”์ดํŠธ ๋‹จ์œ„)

์˜คํผ๋ ˆ์ด์…˜

getChildren(), getChild(int index): ํ•˜์œ„ ๋…ธ๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ

getSize(): ํฌ๊ธฐ ๊ณ„์‚ฐํ•˜๊ธฐ

getParent(): ๋ถ€๋ชจ ๋…ธ๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ

- 322 -

Node

-name:String

-size:long

+getChildren():List<Node>

+getChild(int):Node

+getSize():long

+getParent():Node

Page 323: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

๊ธฐ๋ณธ ์„ค๊ณ„ - ํŠธ๋ฆฌ๋…ธ๋“œ ํ•ญํ•ด

ํด๋”์˜ ์ž์‹๋…ธ๋“œ(ํŒŒ์ผ/ํด๋”) ๋ชฉ๋ก์„ ์š”์ฒญ

ํด๋”๋Š” ์ž์‹๋…ธ๋“œ๋ฅผ ์—ด๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ํ•„์š”ํ•จ

โ€ข public Node getChild(int index);

โ€ข public List<Node> getChildren();

List<Node>์—๋Š” ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ ๋ชจ๋‘ ํฌํ•จ

๋…ธ๋“œ(ํŒŒ์ผ/ํด๋”)์˜ ํฌ๊ธฐ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํ•„์š”ํ•จ

โ€ข public long size();

- 323 -

public long size() {long total = 0;int childCount = nodes.size(); โ€ฆfor (int i=0; i<childCount; i++) {

total += getChild(i).size();}

return total;}

public long size() {return this.size;

}

ํด๋”์—์„œ

ํŒŒ์ผ์—์„œ

Page 324: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Composite ํŒจํ„ด

์˜๋„

๋ถ€๋ถ„๊ณผ ์ „์ฒด์˜ ๊ณ„์ธต์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐœ๋ณ„ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃธ

๋™๊ธฐ

ํ˜„์žฅ์—์„œ ๋งŒ๋‚œ ๋ฌธ์ œ์ ์„ Composite ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

โ€ข ์ฑ…์ž„์˜ ์œ„์ž„

- 324 -

Page 325: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Composite ํŒจํ„ด

[์˜ˆ์ œ]์ถ”์ƒํ™” ๋˜๋Š” ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

๋ถ€์„œ์™€ ์ง์›์€ ์กฐ์ง ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ์ผ๋ถ€๋กœ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ์ถ”์ƒํ™”๊ฐ€ ๊ฐ€๋Šฅ

ํด๋ผ์ด์–ธํŠธ(ํšŒ์‚ฌ)๊ฐ€ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๋„๋ก ๋™์ผํ•œ ํ–‰์œ„๋ฅผ ์‹๋ณ„

- 325 -

Party

+ getGender() : String

+ add(Party) : void

+ getChildren() : Party[]

+ print() : void

+ findByGener(String) : Party[]

Employee

- name: String

- gender: String

+ print() : void

+ finaByGender(String) : Party[]

Department

- name: String

- location: String

+ add(Party) : void

+ getChildren() : Party[]

+ print() : void

+ findByGener(String) : Party[]

- parties

*Company

+ print() : void

+ findByGender(String) : Party[]

*

ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ๊ฐ ์š”์†Œ๋“ค์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํ–‰์œ„๋ฅผ ์‹๋ณ„ํ•จ์œผ๋กœ์จ ์ถ”์ƒํ™”๋ฅผ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ์ด ํด๋ž˜์Šค๋กœ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.- children

๋ถ€์„œ๋Š” ํ•˜์œ„๋ถ€์„œ์™€ ์ง์›์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€๋Š” ๋ชจ๋‘ Party์ด๋ฏ€๋กœDepartment๋Š” Party๋ฅผ ํฌํ•จํ•˜๋ฉด ๋œ๋‹ค.

public void add(Party unit) {

this.children.add(unit);

}

public List<Party> getChildren() {

return this.children;

}

์ง์›์€ ํ•˜์œ„ Party๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋งŒ overrideํ•œ๋‹ค. ํŠธ๋ฆฌ์˜ ๊ตฌ์„ฑ์š”์†Œ๋“ค์€ ๊ฐ์ž์˜ ํŠน์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ ๋ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

public void add(Party party) {

throw new UnsupportedOperationException();

}

public List<Party> getChildren() {

throw new UnsupportedOperationException();

}

ํŠน์ • ๋ฉ”์†Œ๋“œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค

Page 326: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Composite ํŒจํ„ด

[์˜ˆ์ œ]์ฑ…์ž„์˜ ์œ„์ž„

๋ชจ๋“  ํŠธ๋ฆฌ ์š”์†Œ์— ๋™์ผํ•œ ํ–‰์œ„๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ฐ ์š”์†Œ์—์„œ ํ•ด๋‹น ํ–‰์œ„๋ฅผ ๊ตฌํ˜„

์ฑ…์ž„์„ ์œ„์ž„ํ•จ์œผ๋กœ์จ ๋กœ์ง์ด ๋น„๋Œ€ํ•ด ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•จ.

- 326 -

Company Department Department

Department

Employee

Employee

Party

print print print

print print

public void print(int depth) {

printIndent(depth);

System.out.println("- ๋ถ€์„œ : " + this.name + ", " + this.location);

for(int i = 0; i < children.size(); i++) {

children.get(i).print(depth + 1);

}

}

public void print(int depth) {

printIndent(depth);

System.out.println("- ์ง์› : " + this.name + ", " + this.gender);

}

๊ฐ ํŠธ๋ฆฌ ์š”์†Œ๋Š” ์ž์‹ ์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฑ…์ž„์„ ์ง€๋‹˜

์ž์‹ ์˜ ์ •๋ณด๋Š” ์ž์‹ ์ด ์ถœ๋ ฅํ•˜๋„๋ก ์ฑ…์ž„์˜ ์œ„์ž„

Page 327: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Composite ํŒจํ„ด

[์˜ˆ์ œ]์ฑ…์ž„์˜ ์œ„์ž„

๋ชจ๋“  ํŠธ๋ฆฌ ์š”์†Œ๋“ค์„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃธ์œผ๋กœ์จ ์กฐ์ง์˜ ๊ตฌ์กฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ๊ฐ€ ์šฉ์ด

- 327 -

Company Department Department

Department

Employee

Employee

Party

find find find

find find

public List<Party> findByGender(String gender) {

List<Party> results = new ArrayList<Party>();

for(int i = 0; i < children.size(); i++) {

Party child = children.get(i);

if (gender.equals(child.getGender())) results.add(child);

results.addAll(child.findByGender(gender));

}

return results;

}

public List<Party> findByGender(String gender) {

return new ArrayList<Party>();

}

์ง์›์˜ ๊ฒฝ์šฐ ํ•˜์œ„ ์š”์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜์—†์œผ๋ฏ€๋กœ ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํŠน์ • ํŠธ๋ฆฌ ์š”์†Œ๋Š” ๋ฐ”๋กœ ์ž์‹ ์˜ ํ•˜์œ„๋งŒ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

Page 328: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Composite ํŒจํ„ด

ํ™•์žฅ

์กฐ์ง ๊ตฌ์กฐ์— ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ๊ธฐ์กด ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์—†์ด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

Leaf์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋‚˜ Container์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ๋ชจ๋‘ ์ถ”๊ฐ€ ์šฉ์ด(๋ฌธ์ œ : Container ํ™•์žฅ๋ฐฉ๋ฒ•์€?)

- 328 -

Party

+ getGender() : String

+ add(Party) : void

+ getChildren() : Party[]

+ print() : void

+ findByGener(String) : Party[]

Employee

- name: String

- gender: String

+ print() : void

+ finaByGender(String) : Party[]

Department

- name: String

- location: String

+ add(Party) : void

+ getChildren() : Party[]

+ print() : void

+ findByGener(String) : Party[]

- parties

*Company

+ print() : void

+ findByGender(String) : Party[]

*

- children

PartTime

- name: String

- workingTime: Time

+ print() : void

+ finaByGender(String) : Party[]

Party๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒˆ๋กœ์šด ํƒ€์ž…๋งŒ ๋งŒ๋“ค๋ฉด ๊ธฐ์กด ํด๋ž˜์Šค ๋ณ€๊ฒฝ ์—†์ด ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋Š” ๊ทธ ๊ฐ์ฒด์˜ํŠน์„ฑ์„ ํ‘œํ˜„ํ•˜๋Š” ์†์„ฑ์„ ๋”ฐ๋กœ ๊ฐ€์ง„๋‹ค.

Page 329: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Composite ํŒจํ„ด

๊ตฌ์กฐ

- 329 -

Component

+ operation()

+ add(Component) : void

+ remove(Component) : void

+ getChild(int) : Component

Leaf

+ operation()

Composite

+ operation()

+ add(Component) : void

+ remove(Component) : void

+ getChild(int) : Component

Client*

- children

๋ชจ๋“  children์— ๋Œ€ํ•ดchild.operation() ํ˜ธ์ถœ

Page 330: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

330

์ ์šฉ ํŒจํ„ด - Composite ํŒจํ„ด

๊ธ์ •์ ์ธ ์ธก๋ฉด

์ž„์˜์˜ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ง€์›

๋…ธ๋“œ์˜ ๋ณต์žก์„ฑ์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด์ด์ง€ ์•Š์Œ

๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ƒˆ๋กœ์šด ํƒ€์ž…์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

๋ถ€์ •์ ์ธ ์ธก๋ฉด

์ฝ”๋“œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ ์ง

๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ•์š”ํ•จ

๊ตฌํ˜„ ์ด์Šˆ

์ˆ˜ํ–‰์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ณด๋ฅผ ์–ธ์ œ/์–ด๋””์— ์บ์Šํ•  ๊ฒƒ์ธ๊ฐ€?

์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค์— ํ• ๋‹นํ•  ์ €์žฅ๊ณต๊ฐ„์€ ์–ผ๋งˆ๋‚˜?

Child๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

Child ์ถ”๊ฐ€/์‚ญ์ œ๋ฅผ ์œ„ํ•œ ๋ฉ”์˜๋“œ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค์— ์„ ์–ธ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?

Page 331: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

331

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ - mkdir

์ง€๊ธˆ๊นŒ์ง€ ์ž‘์—… ๊ฒฐ๊ณผ

Composite ํŒจํ„ด์„ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ๋ฐฑ๋ณธ์„ ์„ค๊ณ„ํ•จ

์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ

ํด๋ผ์ด์–ธํŠธ๋Š” ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•œ ๊ณณ์— ๋‘˜ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

ํด๋”๋Š” child ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค(์ฑ…์ž„์ด ์žˆ์Œ)

โ€ข void attach (Node child);

โ€ข void detach (Node child);

Page 332: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

332

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ - mkdir

ํ˜„์žฌ ํด๋”= ํด๋” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ

mkdir์˜ ์ ˆ์ฐจ

์ƒˆ๋กœ์šด ํด๋” ๊ฐœ์ฒด ์ƒ์„ฑ

ํ˜„์žฌ ํด๋”์˜ attach()๋ฅผ ํ˜ธ์ถœ

์ƒˆ๋กœ์šด ํด๋”๋ฅผ ํŒจ๋Ÿฌ๋ฏธํ„ฐ ์ „๋‹ฌ

...

Folder currentFolder; currentFolder.attach (new Folder(โ€œnewFolderโ€));

Page 333: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ - mkdir

mkdir subfolderA/subfolderB/newsubfolder์˜ ๋‚ด๋ถ€ ๋กœ์ง

subfolderA ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š”๋‹ค.

subfolderB ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š”๋‹ค.

subfolderB ๊ฐ์ฒด๊ฐ€ newsubfolder ๊ฐ์ฒด๋ฅผ attach() ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค ์ฝ”๋“œ

- 333 -

public void mkdir (Folder currentFolder, String path) {

String subpath = path;if (subpath == null) {

currentFolder.attach(new Folder(path));} else {

String name = head(path);Node child = find(name, currentFolder);if (child != null) {

mkdir(child, subpath);} else {

// error process

Page 334: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ - mkdir

Child ๊ฐœ์ฒด์˜ ์„ฑ๊ฒฉ

๋””๋ ‰ํ† ๋ฆฌ ๊ฐ์ฒด์ธ๊ฐ€ ํŒŒ์ผ ๊ฐ์ฒด์ธ๊ฐ€?

ํŒŒ์ผ ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ ๋ฐฉ๋ฌธํ•  ํ•„์š” ์—†์Œ

๋”ฐ๋ผ์„œ,

- 334 -

if (node != null) {

try {

Folder child = (Folder)node; //java.lang.ClassCastException(ํŒŒ์ผ ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ)

mkdir(child, subpath)

} catch (java.lang.ClassCaseException cce) {

System.out.println(โ€œ ํด๋”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.โ€);

โ€ฆ..

Page 335: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

335

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ - symbolic link

์‚ฌ์šฉ ์˜ˆ

Symbolic link : Unix

Aliases : Mac Finder parlance

Shortcuts : Windows 95

ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋งํฌ

ํŒŒ์ผ ๋งํฌ : ํŽธ์ง‘, ์ €์žฅ

๋””๋ ‰ํ† ๋ฆฌ ๋งํฌ : ๋…ธ๋“œ ์ถ”๊ฐ€ ์‚ญ์ œ

Page 336: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ - symbolic link

Symbolic link์˜ ๊ฐœ๋…

๋Œ€์ƒ์€ ํด๋”, ํŒŒ์ผ ๋ชจ๋‘ ๊ฐ€๋Šฅ

ํ•˜๋‚˜์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋Š” ํ•˜๋‚˜์˜ ๋Œ€์ƒ๋งŒ์„ ๊ฐ€์ง

ํ•˜๋‚˜์˜ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

๋Œ€์ƒ์ด ์ง€์›Œ์ ธ๋„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋Š” ์กด์žฌํ•จ

- 336 -

ํด๋”

ํŒŒ์ผ

ํด๋”

ํŒŒ์ผ

์‹ฌ๋ณผ๋ฆญ ๋งํฌB

๋งํฌ

์‹ฌ๋ณผ๋ฆญ ๋งํฌC

์‹ฌ๋ณผ๋ฆญ ๋งํฌA

์‹ฌ๋ณผ๋ฆญ ๋งํฌD

์‹ฌ๋ณผ๋ฆญ ๋งํฌE

[์‚ญ์ œ]ํด๋”

ํด๋ผ์ด์–ธํŠธ

Page 337: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

337

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ (symbolic link)

๋ชฉ์  ๋””์ž์ธ ํŒจํ„ด ํŠน์ง•

์ƒ์„ฑ ํŒจํ„ด Abstract Factory ์ƒํ’ˆ ๊ฐ์ฒด๋“ค์˜ ํŒจ๋ฐ€๋ฆฌ

Builder ๋ณตํ•ฉ ๊ฐ์ฒด ์ƒ์„ฑ

Factory Method ์ธ์Šคํ„ด์Šคํ™”๋  ๊ฐ์ฒด์˜ ํ•˜์œ„ ํด๋ž˜์Šค

Prototype ์ธ์Šคํ„ด์Šคํ™” ๋  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค

Singleton ๋‹จ์ผ ์ธ์Šคํ„ด์Šค

๊ตฌ์กฐ ํŒจํ„ด Adapter ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

Bridge ๊ฐ์ฒด์˜ ๊ตฌํ˜„

Composite ๊ฐ์ฒด๊ตฌ์กฐ์™€ ๊ฐ์ฒด์˜ ๋ณตํ•ฉ์ฒด

Decorator ์ƒ์†์—†์ด ๊ฐ์ฒด์— ์ฑ…์ž„์ถ”๊ฐ€

Facade ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ์ธํ„ฐํŽ˜์ด์Šค

Flyweight ๊ฐ์ฒด ์ €์žฅ ๋น„์šฉ

Proxy ๊ฐ์ฒด์˜ ์œ„์น˜์™€ ์ ‘๊ทผ๋ฐฉ๋ฒ•

ํ–‰์œ„ ํŒจํ„ด Chain of Responsibility ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋“ค

Command ์š”์ฒญ์ฒ˜๋ฆฌ ์‹œ์ ๊ณผ ๋ฐฉ๋ฒ•

Interpreter ์–ธ์–ด์˜ ๋ฌธ๋ฒ•๊ณผ ํ•ด์„

Iterator ์ง‘ํ•ฉ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ณ  ํšก๋‹จํ•จ

Mediator ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”๊ฐ€?

Memento ์–ด๋–ค ์‚ฌ์ ์ •๋ณด๋ฅผ ์–ธ์ œ ๊ฐ์ฒด์˜ ๋ฐ–์— ์ €์žฅํ•˜๋Š”๊ฐ€?

Observer ์˜์กด ๊ฐ์ฒด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐฉ๋ฒ•

State ๊ฐ์ฒด์˜ ์ƒํƒœ

Strategy ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

Template Method ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฒ˜๋ฆฌ ์ ƒ์ฐจ

Visitor ์˜คํผ๋ ˆ์ด์…˜ ์ถ”๊ฐ€

์ ์ ƒํ•œ ํŒจํ„ด ์ฐพ๊ธฐ

Page 338: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด - Proxy ํŒจํ„ด

์ฃผ๋ณ€์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์˜ˆ, Proxy ์„œ๋ฒ„

์ปจํ…์ธ  ์บ์‹ฑ

์ปจํ…์ธ  ์ ‘๊ทผ ํ†ต์ œ

์›๊ฒฉ ์„œ๋ฒ„์˜ ๋Œ€๋ฆฌ์ธ ์—ญํ• 

- 338 -

http://docs.huihoo.com/redhat/RHNetwork/RHN-proxy-3.6/figs/rhns-proxy_topology1.png

Page 339: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Proxy ํŒจํ„ด

์˜๋„

๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ๋Œ€๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

๋™๊ธฐ

์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋ฌธ์ œ์ ์„ Proxy ํŒจํ„ด์„ ํ†ตํ•ด ๊ทธ ๋Œ€์•ˆ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

โ€ข ํด๋”์™€ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ ‘๊ทผ ํ†ต์ œ

โ€ข ์ง€์—ฐ ๋กœ๋”ฉ (Lazy Loading)

โ€ข ์˜ํ–ฅ๋„ ์ตœ์†Œํ™”

- 339 -

Page 340: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Proxy ํŒจํ„ด

์ ์šฉ

์›๊ฒฉ ํ˜ธ์ถœ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์›๊ฒฉ Proxy๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ (์˜ˆ: RMI)

์š”์ฒญ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ(์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜)

์›๋ž˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•  ๊ฒฝ์šฐ ๋ณดํ˜ธ์šฉ Proxy๋ฅผ ์‚ฌ์šฉ

- 340 -

Page 341: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Proxy ํŒจํ„ด

๊ตฌ์กฐ

- 341 -

Subject

+ request()

...

RealSubject

+ request()

...

Proxy- realSubject

1

Client

+ request()

......

realSubject.request();

...

Page 342: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Proxy ํŒจํ„ด

Sequence

- 342 -

: Client :Proxy :RealSubject

Request to Proxy

Request to Real Subject

Page 343: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

343

์ ์šฉ ํŒจํ„ด - Proxy ํŒจํ„ด

Proxy ํŒจํ„ด ์˜ˆ์ œ

Page 344: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

344

์‹ฌ๋ณผ๋ง ๋งํฌ ์„ค๊ณ„

๋งํฌ ์†Œ์Šค์ฝ”๋“œ

public class Link extends Node {

public Link(Node node) {

//

โ€ฆ.

}

// ์‹ค์ œ ๊ฐ์ฒด(ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ)์— ๋Œ€ํ•œ ์ฐธ์กฐ

private Node realSubject;

}

Page 345: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

345

์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์„ค๊ณ„

Proxy์˜ ์‹ค์ œ ์ฃผ์ฒด(real subject)

์—ฌ๊ธฐ์„œ๋Š” ํŒŒ์ผ๊ณผ ํด๋”๊ฐ€ ์‹ค์ œ ์ฃผ์ฒด(realSubject)

[GOF]์—์„œ๋Š”

โ€ข Proxy๋Š” ์‹ค์ œ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ฐธ์กฐ(ํฌ์ธํ„ฐ)๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

realSubject๋Š” ๋Œ€์ƒ Node์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ

๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์—†์ด ํŒŒ์ผ๊ณผ ํด๋” ๋ชจ๋‘์— ์ ์šฉ๋˜๋Š” symbolic link๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ค์›€

Page 346: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

346

์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์„ค๊ณ„

์†Œ์Šค์ฝ”๋“œ์—์„œ real subject์˜ ์šฉ๋„

Link ํด๋ž˜์Šค์˜ ์†Œ์Šค์ฝ”๋“œ์—์„œ

โ€ฆ.

public Node getChild(int index) {

// realSubject ๋กœ ์œ„์ž„

return realSubject.getChild(index);

}

Page 347: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

347

์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์„ค๊ณ„

Proxy ํŒจํ„ด ์ ์šฉ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

ํŒŒ์ผ์ด ์‚ญ์ œ๋˜์—ˆ์„ ๊ฒฝ์šฐ

โ€ข Proxy๋Š” ํ—ˆ์ƒ์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค(dangling pointer)

โ€ข Proxy์—๊ฒŒ ์‚ญ์ œ ์‚ฌ์‹ค์„ ์•Œ๋ ค์ค„ Observer๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์œ ๋‹‰์Šค์™€ ๋งคํ‚จํ† ์‹œ

โ€ข Symbolic link๋Š” ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋Œ€์ƒ ํŒŒ์ผ์˜ ์‹ค์ œ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ Proxy๋Š”

โ€ข ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ root์— ๋Œ€ํ•œ ์ฐธ์กฐ์™€ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

โ€ข ์ด๋ฆ„์„ ์ฐพ๋Š”(lookup) ๋น„์šฉ์ด ๋†’์Œ

๋‘๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…

โ€ข 1. ์ด๋ฆ„ ์ฐพ๋Š” ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•˜๊ณ  ์ด๋ฆ„๊ณผ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

โ€ข 2. Observer์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

Page 348: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์„ค๊ณ„

์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ฐ˜์˜ํ•œ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

- 348 -

Node

+getChild(int):Node

+getName():String

+getParent():Node

+attach(Node):void

+detach(Node):void

+streamIn(istream)

+streamOut(ostream)

Folder File Link

-realSubject

1

0..*

-children

0..*

1

+getChild(int):Node

+attach(Node):void

+detach(Node):void

+streamIn(istream)

+streamOut(ostream)

+streamIn(istream)

+streamOut(ostream)

+getRealSubject();

+streamIn(istream)

+streamOut(ostream)

Page 349: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

349

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ โ€“ cat, ls

์š”๊ตฌ์‚ฌํ•ญ์ด ๊ณ„์† ์‹๋ณ„๋จ

์ถ”๊ฐ€ ์†์„ฑ ์ง€์›, ํŒŒ์ผ ์ƒ์„ฑ์ผ์ž, ์ตœ๊ทผ ๋ณ€๊ฒฝ์ผ์ž ๋“ฑ

์ƒˆ๋กœ์šด ์œ ํ˜•์˜ size ๊ณ„์‚ฐ ์ง€์›, ๋ธ”๋ก(512๋ฐ”์ดํŠธ) ๋‹จ์œ„ ํฌ๊ธฐ ๊ณ„์‚ฐ

๋…ธ๋“œ๋ฅผ ์œ„ํ•œ ์•„์ด์ฝ˜ ๋ฆฌํ„ด

๊ฒฐ๊ณผ์ ์œผ๋กœ, Node๋Š” ๊ฑฐ๋Œ€ํ•œ(giant)ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด ๊ฐ

์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€ ์—†์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ž„

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€?

Page 350: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

350

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ โ€“ cat, ls

๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

ํŒŒ์ผ์— ํฌํ•จ๋œ ๋‹จ์–ด ๊ฐœ์ˆ˜ ๋ฆฌํ„ด

โ€ข getWordCount()

๋…ธ๋“œ ํด๋ž˜์Šค์— ์ถ”๊ฐ€?

ํŒŒ์ผ ํด๋ž˜์Šค์— ์ถ”๊ฐ€?

๊ทธ๋Ÿฌ๋ฉด

Stream ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ

stream ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ getWordCount()๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์ถฉ๋ถ„ํ•œ Primitive ์ธํ„ฐํŽ˜์ด์Šค ์ค€๋น„

Primitive ์ธํ„ฐํŽ˜์ด์Šค์˜ ์กฐํ•ฉ์„ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ตฌํ˜„

Page 351: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

351

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ โ€“ cat, ls

์ฃผ์š” ๊ธฐ๋Šฅ, cat ์ถ”๊ฐ€

์œ ๋‹‰์Šค์˜ cat ๋ช…๋ น์–ด

โ€ข ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฆ„

โ€ข ๋”ฐ๋ผ์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ตฌํ˜„์ด ๋˜์–ด์•ผ ํ•จ

๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Œ

์ด ๊ฒฝ์šฐ, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š”

public void cat(Node node) {

Link l;

if class is file // ๋‹ค์šด์บ์ŠคํŒ…

do something;

else if class is Directory // ๋‹ค์šด์บ์ŠคํŒ…

do something;

else if class is Link // ๋‹ค์šด์บ์ŠคํŒ…

do somthing;

โ€ฆ..

์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€

์ƒ๊ธธ ๊ฒฝ์šฐ ???

Page 352: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ โ€“ cat, ls

์‹ค์„ธ๊ณ„์˜ ์˜ˆ๋ฅผ ๋“ค์–ด๋ด…์‹œ๋‹ค.

๋‚˜๋ฅธํ•œ ์ฃผ๋ง ์˜คํ›„,

์•„์ด๋ž‘ ๋†€๋‹ค๊ฐ€ ํ•œ์ฐธ ์ž๊ณ  ์‹ถ์€๋ฐ,

TV๋ฅผ ๊ณ ์ณ๋‹ฌ๋ผ๊ณ  ํ•˜๋Š” ์•„๋‚ด์˜ ์„ฑํ™”๊ฐ€ ๊ณ„์†๋˜๊ณ ...

- 352 -

Page 353: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

353

ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ - cat, ls

๋ชฉ์  ๋””์ž์ธ ํŒจํ„ด ํŠน์ง•

์ƒ์„ฑ ํŒจํ„ด Abstract Factory ์ƒํ’ˆ ๊ฐ์ฒด๋“ค์˜ ํŒจ๋ฐ€๋ฆฌ

Builder ๋ณตํ•ฉ ๊ฐ์ฒด ์ƒ์„ฑ

Factory Method ์ธ์Šคํ„ด์Šคํ™”๋  ๊ฐ์ฒด์˜ ํ•˜์œ„ ํด๋ž˜์Šค

Prototype ์ธ์Šคํ„ด์Šคํ™” ๋  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค

Singleton ๋‹จ์ผ ์ธ์Šคํ„ด์Šค

๊ตฌ์กฐ ํŒจํ„ด Adapter ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

Bridge ๊ฐ์ฒด์˜ ๊ตฌํ˜„

Composite ๊ฐ์ฒด๊ตฌ์กฐ์™€ ๊ฐ์ฒด์˜ ๋ณตํ•ฉ์ฒด

Decorator ์ƒ์†์—†์ด ๊ฐ์ฒด์— ์ฑ…์ž„์ถ”๊ฐ€

Facade ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ์ธํ„ฐํŽ˜์ด์Šค

Flyweight ๊ฐ์ฒด ์ €์žฅ ๋น„์šฉ

Proxy ๊ฐ์ฒด์˜ ์œ„์น˜์™€ ์ ‘๊ทผ๋ฐฉ๋ฒ•

ํ–‰์œ„ ํŒจํ„ด Chain of Responsibility ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋“ค

Command ์š”์ฒญ์ฒ˜๋ฆฌ ์‹œ์ ๊ณผ ๋ฐฉ๋ฒ•

Interpreter ์–ธ์–ด์˜ ๋ฌธ๋ฒ•๊ณผ ํ•ด์„

Iterator ์ง‘ํ•ฉ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ณ  ํšก๋‹จํ•จ

Mediator ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”๊ฐ€?

Memento ์–ด๋–ค ์‚ฌ์ ์ •๋ณด๋ฅผ ์–ธ์ œ ๊ฐ์ฒด์˜ ๋ฐ–์— ์ €์žฅํ•˜๋Š”๊ฐ€?

Observer ์˜์กด ๊ฐ์ฒด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐฉ๋ฒ•

State ๊ฐ์ฒด์˜ ์ƒํƒœ

Strategy ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

Template Method ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฒ˜๋ฆฌ ์ ƒ์ฐจ

Visitor ์˜คํผ๋ ˆ์ด์…˜ ์ถ”๊ฐ€

์ ์ ƒํ•œ ํŒจํ„ด ์ฐพ๊ธฐ

Page 354: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Visitor ํŒจํ„ด

์˜๋„

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

๋™๊ธฐ

ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•ˆ์„ ๋ฐฉ๋ฌธ์ž๊ฐ€ ์ฐพ์•„ ๋‹ค๋‹ˆ๋Š” ํŒŒ์ผ์˜ ์ผ๋žŒ์„ ํ‘œ์‹œํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

- 354 -

Visitor

+ visit(File)

+ visit(Directory)

DirectoryListVisitor

<<interface>>

Acceptor

+ accept()

File

Entry

+ getName()

+ getSize()

+ iterator()

Mainuses

uses

uses

Page 355: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Visitor ํŒจํ„ด

์ ์šฉ

๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ ๊ตฌ์ฒด์  ํด๋ž˜์Šค์— ๋”ฐ๋ผ ์ด๋“ค ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•  ๋•Œ.

๊ตฌ๋ณ„๋˜๊ณ  ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋งŽ์€ ์˜คํผ๋ ˆ์ด์…˜์ด ๊ฐ์ฒด์— ์ˆ˜ํ–‰๋  ํ•„์š”๊ฐ€ ์žˆ์ง€๋งŒ ์˜คํผ๋ ˆ์ด์…˜์œผ๋กœ ์ธํ•ด ํด๋ž˜์Šค๋“ค์„ ๋ณต์žกํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ. Visitorํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์˜คํผ๋ ˆ์ด์…˜์„ ํ•จ๊ป˜ ์ •์˜ํ•จ์œผ๋กœ์จ ๊ด€๋ จ๋œ ์˜คํผ๋ ˆ์ด์…˜์„ ์œ ์ง€์‹œํ‚จ๋‹ค.

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

- 355 -

Page 356: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Visitor ํŒจํ„ด

ํด๋ž˜์Šค ๊ตฌ์กฐ

- 356 -

Visitor

+ visit(ConcreteAcceptorA)

+ visit(ConcreteAcceptorB)

ConcreteAcceptorA

+ operation()

ConcreteVisitor

Acceptor

+ accept()

ObjectStructure

Client

ConcreteAcceptorB

+ operation()

Page 357: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ ์šฉ ํŒจํ„ด โ€“ Visitor ํŒจํ„ด

Sequence

- 357 -

: ConcreteAcceptorA : ConcreteAcceptorB : ConcreteVisitor

accept(Visitor)

visit(ConcreteAcceptorA)

operation()

: ObjectStructure

accept(Visitor)

visit(ConcreteAcceptorB)

operation()

Page 358: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

358

ls,cat ์„ค๊ณ„

Visitor ํŒจํ„ด ์ ์šฉ

Node ํด๋ž˜์Šค์—์„œ

โ€ข abstract void accept (Visitor);

๊ฐ ๊ตฌ์ฒด์ ์ธ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ

โ€ข ํŒŒ์ผ : public void accept(Visitor v) {v.visit(this);}

โ€ข ํด๋” : public void accept(Visitor v) {v.visit(this);}

โ€ข ๋งํฌ : public void accept(Visitor v) {v.visit(this);}

Visitor ํด๋ž˜์Šค

โ€ข public class Visitor {

public Visitor() {โ€ฆ}

public void visit(File file) {file.streamOut(cout);}

public void visit(Folder dir) { some messageโ€ฆ.; }

public void visit(Link link) {link.getSubject().accept(this);}

}

Page 359: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

359

ls,cat ์„ค๊ณ„

ํ•˜์œ„ ๋…ธ๋“œ ๋ฐฉ๋ฌธ(visit)

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ

Visitor catVisitor = new CatVisitor();

node.accept(catVisitor);

๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ : ls

Page 360: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

360

ls, cat ์„ค๊ณ„

CatVisitor

ํด๋ž˜์Šค CatVisitor

ํด๋ผ์ด์–ธํŠธ์—์„œ

public void cat(Node sourceNode, Node targetNode) {

CatVisitor catVisitor = new CatVisitor(sourceNode);

targetNode.accept(catVisitor);

}

class CatVisitor extends Visitor {

private Node sourceNode;

public CatVisitor(Node sourceNode) { โ€ฆ}

public void visit(File file) { // file์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋กœ์ง}

public void visit(Folder dir) { // ํด๋”๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋กœ์ง }

public void visit(Link link) { // ๋งํฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋กœ์ง }

};

๋‹ค์šด์บ์ŠคํŒ… ์—†์Œ

Page 361: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

361

ls, cat ์„ค๊ณ„

LsVisitor

ํด๋ž˜์Šค LsVisitor

ํด๋ผ์ด์–ธํŠธ์—์„œpublic void ls(Node node) {

LsVisitor lsv = new LsVisitor();

Node child;

for (int I=0; node.size(); I++) {

child = node.getChild(I);

System.out.print(child.getName());

child.accept(lsv);

System.out.println(โ€œ โ€œ);

}

class LsVisitor extends Visitor {

public LsVisitor() { โ€ฆ}

public void visit(File file) { ;}

public void visit(Folder dir) { System.out.print( โ€œ/โ€); }

public void visit(Link link) {System.out.print(โ€œ@โ€); }

};

Page 362: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

ls, cat ์„ค๊ณ„

Visitor๋ฅผ ํ™œ์šฉํ•œ ls,cat ์„ค๊ณ„ ๋ชจ๋ธ

- 362 -

Node

+accept(Visitor):void

Folder File Link

-realSubject

1

0..*

-children

0..*

1 Visitor

+visit(File):void

+visit(Folder):void

+visit(Link):void

CatVisitor

+visit(File):void

+visit(Folder):void

+visit(Link):void

LsVisitor

+visit(File):void

+visit(Folder):void

+visit(Link):void

Page 363: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์š”์•ฝ (ํŒจํ„ด ๊ธฐ๋ฐ˜ ์„ค๊ณ„)

ํŒจํ„ด์„ ํ†ตํ•œ ๋ฌธ์ œํ•ด๊ฒฐ์€ ์„ค๊ณ„ ์†๋„๋ฅผ ๋†’์—ฌ์ค€๋‹ค.

ํŒจํ„ด์€ ๋ฌธ์ œ์˜ ๋ณธ์งˆ์„ ๋นจ๋ฆฌ ํŒŒ์•…ํ•˜๋„๋ก ๋„์™€์ค€๋‹ค.

ํŒจํ„ด์€ ์‘์šฉํ•˜๊ฑฐ๋‚˜ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

- 363 -

Page 364: (GoF & POSA) - Tistory

๊ณผ์ •๋ช… : ๋””์ž์ธ ํŒจํ„ด & ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ดCopyright ยฉ 2009 Nextree Soft, All rights reserved

์ค‘์†Œ๊ธฐ์—…์ง์—…ํ›ˆ๋ จ์ปจ์†Œ์‹œ์—„

์ฐธ๊ณ  ๋„์„œ(Reference books)

1. Applied Java Patterns, Stephen Stelting ์™ธ, PH PTR

2. GoF Design Patterns, Erich Gamma ์™ธ, Addison-Wesley

3. Design Patterns Explained 2nd edition, Alan Shallowway์™ธ, Addison-Wesley

4. Head First Design Patterns, Eric Freeman ์™ธ, Oโ€™REILLY

5. Software Architecture Design Patterns in Java, Partha Kuchana, AUERBACH

6. Java Enterprise Design Patterns vol. 3, Mark Grand, WILEY

7. Patterns in Java vol. 2, Mark Grand, WILEY

8. Java Design Patterns, James W. Cooper, Addison-Wesley

9. Pattern Hatching: Design Patterns Applied, John M. Vlissides, Addison-Wesley

- 364 -