Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
Korea
Software
Technology
Association
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด
(GoF & POSA)
๊ธฐ๊ฐ: 2009.02.23 ~ 2009.02.27
๊ฐ์ฌ๋ช : ์ดํฌ๋
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๊ณผ์ ๊ฐ์
๊ต์ก ๋ชฉํ
๋์ ์์ค์ ์ค๊ณ ์ญ๋ ํ๋ณด
๋ํ์ ์ธ ๋ ๊ฐ์ง ํจํด(GoF, POSA) ์๋ฌ
์ค๋ฌด ์์ ๋ฅผ ํตํ ์ค๊ณ ์ญ๋์ ๋ด์ ํ
์ํคํ ํธ๋ก์์ ๊ธฐ๋ณธ ์์ง ํ๋ณด
๊ต์ก ํน์ง
๊ฐ์์ ์ค์ต์ ๋ณํํ์ฌ ์๊ฐ์์ ๋ช ํํ ์ดํด๋ฅผ ๋๋ชจํจ
์๋ฌ ๋ฐ ๊น์ ์ดํด๊ฐ ํ์ํ ๋ถ๋ถ์ ์ค์ต ์ํ
ํ์ฅ ๊ฒฝํ์ด ํ๋ถํ ๊ฐ์ฌ์ง์ผ๋ก ๊ตฌ์ฑ
์ถฉ๋ถํ ํ ์๋ฅผ ํตํ ์ง์ ๋ฐ ๊ฒฝํ ๊ณต์
- 2 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
1. ํจํด ๊ฐ์
1.1 ๊ฐ์ฒด-์งํฅ ๊ฐ๋
1.2 ๊ฐ์ฒด-์งํฅ ์ค๊ณ ์์น
1.3 ๋์์ธ ํจํด ์ ์
1.4 ๋์์ธ ํจํด ๋ถ๋ฅ
1.5 ๋์์ธ ํจํด ์ฌ๋ก์ฐ๊ตฌ
- 4 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
1.1 ๊ฐ์ฒด-์งํฅ ๊ฐ๋
๊ฐ์ฒด-์งํฅ ์ ์
ํจ๋ฌ๋ค์ ์ฐจ์ด(gap)
๊ฐ์ฒด์งํฅ ๊ธฐ์ ์ ์ฅ์
๊ฐ์ฒด์งํฅ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ค
์ถ์ํ (Abstraction)
์บก์ํ (Encapsulation)
๋ชจ๋ํ (Modularity)
๊ณ์ธตํ (Hierarchy)
๋คํ์ฑ (Polymorphism)
- 5 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
6
๊ฐ์ฒด-์งํฅ(Object-Oriented) ์ ์(1/2)
๊ฐ์ฒด (Object)
๋ฌผ๋ฆฌ์ ์ธ ๊ฐ์ฒด
๊ฐ๋ ์ ์ธ ๊ฐ์ฒด
์ํํธ์จ์ด ๊ฐ์ฒด
์งํฅ (Oriented)
๊ฐ์ฒด ์ค์ฌ
๊ธฐ๋ณธ ์ค๊ณ ๋จ์๋ฅผ ๊ฐ์ฒด๋ก ํจ
์ค์ธ๊ณ ๋งคํ
์ค์ธ๊ณ ๋ชจ๋ฐฉ
์ค์ธ๊ณ(real world)๋ ๊ณง ๊ฐ์ฒด-์งํฅ ์ธ๊ณ
O-O์ ๊ทผ๋ณธ ์ทจ์ง๋ ์ค์ธ๊ณ์ ์ธ๊ฐ์ ํ๋ ์์์ ๋ชจ๋ธ๋ง ์ธ๊ณ์๋ ์ ์ฉํจ์ผ๋ก์จ ์ถ์์ ์ด๊ณ ๊ฐ๋ ์ ์ธ ๋ชจ๋ธ๋ง ์ธ๊ณ์ ๋ฌธ์ ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ํด๊ฒฐํ๊ณ ์ ํจ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๊ฐ์ฒด-์งํฅ(Object-Oriented) ์ ์(2/2)
๊ฐ์ฒด-์งํฅ์ ๋ดํฌํ ๋ค๋ฅธ ์๋ฏธ
์กด์ฌํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๊ณ ์ ์ Identity๋ฅผ ๊ฐ์ง๋ค.
๋ชจ๋ ๊ฐ์ฒด๋ ์กด์ฌ ๊ฐ์น๊ฐ ์๋ค.
์กด์ฌ ๊ฐ์น๋ ์์ ์ ์ฃผ์ด์ง ์ฑ ์์ ์ํํ๋ ์ฆ, ์ญํ ์ํ์ ํตํด ์ฆ๋ช ๋๋ค.
๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ์ฑ ์์ด ๋๋ฌด ํฌ๋ฉด ๋ถํ์ ํ๋ค.
๋ถํ์ด ์์ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ํํ๊ธฐ ์ํด์ ์ฑ ์ ์กฐ์ ์ด ํ์ํ๋ค.
์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด-์งํฅ ์ธ๊ณ์์,
๋ชจ๋ ๊ฐ์ฒด๋ ์์ ์ ์กด์ฌ๋ฅผ ์ฆ๋ช ํ ์ ๋์ ์ฑ ์์ ๊ฐ์ง๋ค.
๊ณ ์ ์ Identity๊ฐ ์๋ฏ์ด ๊ณ ์ ์ ์ฑ ์์ด ์กด์ฌํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ ๋ฌธ๊ฐ ๊ฐ์ฒด๋ก ์ธ์๋๋ค.
๊ฐ์ฒด์ ์ ์ ํ ์ฑ ์์ ๋ถ์ฌํ๊ณ , ๊ฐ ๊ฐ์ฒด ๊ฐ์ ์์ ์ ์กฐ์ ํจ์ผ๋ก์จ ์ผ์ด ์ํํ๊ฒ ์งํ๋๋๋ก ํ๋ค.
๊ฐ์ฒด์๊ฒ ๋ค์์ ์ง๋ฌธ์ ํ์ ๋, โYesโ์ฌ์ผ ํ๋ค.
์์ ์ ์ญํ ์ ๋ง์กฑํ๋์?
์์ ์ ์ฑ ์์ด ์ ์ ํ๊ฐ์?
๋๊ตฌ์ ํจ๊ป ์ผ์ ํด์ผ ํ๋์ง ์๊ณ ์๋์?
- 7 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
8
ํจ๋ฌ๋ค์ ์ฐจ์ด(gap)
๋ ธ์ด๋ง ๋ก์ง๊ณผ ์ค์ธ๊ณ
์ฌ๋์ด ๊ฐ์ง ์ ์๋ ์ง์ ํ ํ์ ์ด๋์ ์๋๊ฐ?
์ฌ๋์ด ์ฌ๋๋ต๊ฒ ์ผ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์?
์ค์ธ๊ณ ์๊ณก๊ณผ ์ค์ธ๊ณ ๋งคํ
CPU
์ผ ์ผ์ผ ์ผ
์ผ ์ผ ์ผ ์ผ ์ผ ์ผ ์ผ ์ผ
Brain
์ผ
์ผ
์ผ
์ผ ์ผ ์ผ
์ผ ์ผ ์ผ
์ผ ์ผ ์ผ์ผ ์ผ์ผ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
9
๊ฐ์ฒด์งํฅ ๊ธฐ์ ์ ์ฅ์
๋จ์ผ ํจ๋ฌ๋ค์
๋ถ์ ํด๋์ค(Employee)๊ฐ ๊ตฌํ ํด๋์ค(Employee.java)๊น์ง ์์กดํจ
์ฆ, ์์คํ ๋ถ์์์ ๊ตฌํ์ ์ด๋ฅด๊ธฐ๊น์ง ๋จ์ผ ๊ฐ๋ (๊ฐ์ฒด)์ ์ฌ์ฉํจ
์ถ์ํ์ ํ
๋ค์ํ ๊ฐ์ฒด๋ฅผ ํจ๊ป, ๋๋ ๊ฐ๋ณ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์์
์ฌ์ฌ์ฉ์ฑ
์ฝ๋๋จ์ ๋๋ ์ปดํฌ๋ํธ ๋จ์๋ก ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํจ
์ฝ๊ณ ์ ํํ ๋ชจ๋ธ
์ค์ธ๊ณ๋ฅผ ์๋ ๊ทธ๋๋ก ๋ชจ๋ธ๋ก ๋งคํํ ์ ์์
์ดํดํ๊ธฐ ์ฝ๋ค. ์ค์ธ๊ณ์ ์ฌ๊ณ ๋ฅผ ๋ชจ๋ธ๋ง ์ธ๊ณ๋ก ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ๋ฉด ๋จ
์ ๋ณด์ํ๋ฅผ ํตํ ์์ ์ฑ
์์คํ ์ ํน์ ๊ฐ์ฒด์ ๋ณํ๋ ๊ทธ ๊ฐ์ฒด ์์์๋ง ์ํฅ์ ๋ฏธ์นจ
๊ฐ์ฒด ์ค์ค๋ก ์์ ์ ๋ณดํธํ ์ ์๋ ๋ฉ์ปค๋์ฆ ๊ฐ์ง๊ณ ์์
๋คํ์ฑ์ ํตํ ๋ณํ ์ ์์ฑ
๋ณ๊ฒฝ ๋ฐ ํ์ฅ ์๊ตฌ์ฌํญ์ ์ฝ๊ณ ๋นจ๋ฆฌ ๋์ฒํ ์ ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๊ฐ์ฒด์งํฅ ๊ธฐ์ ์ ์ฅ์
๋จ์ผ ํจ๋ฌ๋ค์์ด ์์ฌ์ํต์ ๊ธ์ ์ ์ธ ์ํฅ์ ์ค ์ ์์
- 10 -http://www.agiledeveloper.com/blog/content/binary/3260585819-project_management.jpg10
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
11
๊ฐ์ฒด์งํฅ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ค
์ถ์ํ (Abstraction)
์บก์ํ (Encapsulation)
๋ชจ๋ํ (Modularity)
๊ณ์ธตํ (Hierarchy)
๋คํ์ฑ (Polymorphism)
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
12
์ถ์ํ (Abstraction) (1/2)
๊ตญ์ด ์ฌ์
์ฌ๋ฌผ์ด๋ ๋์์ผ๋ก๋ถํฐ ์ด๋ค ์ฑ์ง์ด๋ ๊ณตํต์ฑ์ด๋ ๋ณธ์ง์ ์ถ์ถํ์ฌ ํ์ ํ๋ ์ฌ๊ณ ์์ฉ
๊ฐ์ ์๋ฆฌ(???)
์ผ๋ฐ์ ์ธ ์๋ฏธ
ํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๋ก๋ถํฐ ๊ตฌ๋ณํ ์ ์๋ ํน์ง์ ์ถ์ถํ๋ ํ์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ถ์ํ(abstraction) (2/2)
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ด๋ก โ ์ถ์ํ(from wikipedia)
์์คํ ์์์ ์์ ์ ์ํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ๊ณ , ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋ค๋ฅธ ๊ฐ์ฒด์ ์์ฌ์ํต ํ๋ ์ถ์์ ์ธ โ์์ ์โ๋ฅผ ํํํ๋ ๊ฐ์ฒด๋ค์ ์ ์ํ๊ธฐ ์ํ ์ฅ์น๊ฐ ์ถ์ํ์ด๋ค.
์บก์ํ๋ ์ธ๋ถ ์ํ๋ฅผ ์จ๊ธฐ๋ ๊ฒ์ ์๋ฏธํ์ง๋ง, ์ด๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ๋ ์ ํ์์ ์ฐ๊ณํ๋๋ก ํ์ฅํ๋ ๊ฒ๊ณผ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ด ์ํธ์์ฉ ํ๋ ๋ฐฉ์์ ํ์คํ ํ๋ ๊ฒ์ด ์ถ์ํ(abstraction)์ ์ฒซ๊ฑธ์์ด๋ค.
์ถ์ํ๋ฅผ ์ ์๋ ์คํผ๋ ์ด์ ์ผ๋ก ์งํํ๋ฉด, ์๋ก ๋ค๋ฅธ ํ์ ์ ๊ฐ์ฒด๋ค์ ๋์ฒดํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋คํ์ฑ(polymorphism)์ด๋ค.
๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์งํํ๋ฉด, ์ฆ, ํ์ ์ด๋ ํด๋์ค์ ๋ด๋ถ์ ์ด๋ฅด๋ฉด ๋ณต์กํ ๊ด๊ณ ์งํฉ์ ๋จ์ํ ํ๊ธฐ ์ํ ๊ตฌ์กฐํ๋ฅผ ์ํํ๋๋ฐ, ์ด๊ฒ์ด ์์(delegation)์ด๋ ์์(inheritance)์ด๋ค.
- 13 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
14
์บก์ํ(Encapsulation=information hiding) (1/2)
๋ณต์กํ ๊ฒ์ ์จ๊ธด๋ค = ์ ๋ณด๋ฅผ ์จ๊ธด๋ค.
๊ผญ ํ์ํ ์ธํฐํ์ด์ค ๋ง์ ์ธ๋ถ์ ๋ ธ์ถํ๋ค.
์ธํฐํ์ด์ค๋ ๋ด๋ถ๋ก ์ฐ๊ฒฐํ๋ ์ ์ผํ ํต๋ก์ด๋ค.
์ธํฐํ์ด์ค์ ํน์ง
๋จ์ํจ
๋ณ๊ฒฝ์ด ์์ด์ผ ํจ
์ธํฐํ์ด์ค๋ฅผ ํตํ ์ ๋ณด์ํ๋ฅผ ํตํด ์ ์ฐ์ฑ์ ํ๋ณด
๋ด๋ถ ๋ณ๊ฒฝ ๊ฐ๋ฅ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์บก์ํ(Encapsulation=information hiding) (2/2)
์ฉ์ด์ ์ (from wikipedia)
์บก์ํ๋ ํํ ์ ๋ณด์ํ์ ๋์ผํ ์๋ฏธ๋ก ์ฌ์ฉ๋์ง๋ง, ๋ ์ฌ์ด์ ์ฐจ์ด๊ฐ ์๋ค๊ณ ํ๊ธฐ๋ํ๋ค. ํ์ง๋ง, ์ ๋ณด ์ํ๋ ์์น(principal)์ผ๋ก, ์บก์ํ๋ ๊ธฐ์ (technique)๋ก ์ฐจ์ด๋ฅผ ๋๋ ค ํ๋ ์ด๋ฌํ ๊ฒฌํด์ ๋ํ ์๊ฒฌ ์ผ์น๋ ์ด๋ฃจ์ง ๋ชปํ ์ํ์ด๋ค. ์ํํธ์จ์ด ๋ชจ๋์ ์ ๋ณด๋ฅผ ๋ชจ๋์ด๋ ์ธํฐํ์ด์ค๋ก ๋ํ๋๋ ๊ตฌ์ฑ์ฒด ์์ผ๋ก ์บก์ํํจ์ผ๋ก์จ ์ ๋ณด๋ฅผ ์จ๊ธด๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์, ์ ๋ณด ์ํ๋ ๋ถํ์คํ ๊ตฌํ์ ์กด์ฌํ๋ ์ฝ๋ ์์กด์ฑ์ ์ ์ ์๋ ์ธํฐํ์ด์ค ์์ผ๋ก ์ด๋ํจ์ผ๋ก์จ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ํ์ ์ค์ธ๋ค. ์ธํฐํ์ด์ค ํด๋ผ์ด์ธํธ๋ ์จ์ ํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์คํผ๋ ์ด์ ์ ์ํํจ์ผ๋ก์จ, ๊ตฌํ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ํด๋ผ์ด์ธํธ๋ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
โ๋์์ธ ํจํดโ์ ์ ์๋ค์ ์์๊ณผ ์บก์ํ ๊ฐ์ ๊ธด์ฅ์ ๋ํด์ ๊ธธ๊ฒ ํ ์ํ๊ณ ๋ ํ, ๊ทธ๋ค์ ๊ฒฝํ์ ์ํ๋ฉด ์ค๊ณ์๋ค์ด ๋์ฒด๋ก ์์์ ๋จ์ฉํ๋ค๊ณ ์ธ๊ธํ๊ณ ์๋ค. ์์์ ์ํ์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ์๋ค. โ
์์์ ํ์ํด๋์ค์๊ฒ ๋ถ๋ชจํด๋์ค์ ์ธ๋ถ๊ตฌํ์ ๋ ธ์ถํ๋ฏ๋ก, ์์์ ์บก์ํ๋ฅผ ๊นฌ๋ค๊ณ ํ ์ ์๋ค(GoF 1995:19)
- 15 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
16
๋ชจ๋ํ(Modularity) (1/2)
๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๋จ์๋ก ์ชผ๊ฐ๋ ๊ฒ
๋ณต์กํ ์์คํ ์ ์ดํดํ๋๋ฐ ํ์์ ์ด๋ค.
๋ชจ๋ ๋จ์์ ์ฌ์ฌ์ฉ์ ๊ฐ๋ฅ์ผ ํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋ชจ๋ํ(Modularity) (2/2)
์ฉ์ด(from wikipedia)
๋ชจ๋์ ๋ค์ํ๊ฒ ์ ์ํ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋ณด๋ค ํฐ ์์คํ ์ ์ปดํฌ๋ํธ(๋๋ ๋ถํ)์ฌ์ผ ํ๊ณ , ๊ทธ ์์คํ ์์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์คํผ๋ ์ด์ ๊ณผ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ค.
๋ชจ๋์ ์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ ๋ถ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค. ๋ชจ๋ ์ธํฐํ์ด์ค๋ ๋ชจ๋์ด ์๊ตฌํ๊ฑฐ๋ ์ ๊ณตํ๋ ์์๋ฅผ ํํํ๋ค. ์ธํฐํ์ด์ค์์ ์ ์๋ ์์๋ ๋ค๋ฅธ ๋ชจ๋์ด ๋ณผ ์ ์๋ค. ๊ตฌํ์ ์ธํฐํ์ด์ค์์ ์ ์ธ๋ ์์์ ๋์ํ๋ ์๋ ์ฝ๋๋ฅผ ํฌํจํ๋ค.
๋ชจ๋๊ณผ ํด๋์ค์ ์ฐจ์ด์
ํด๋์ค๋ ๊ฐ์ฒด์์ฑ์ ์ํด ์ธ์คํด์คํ ํ ์ ์๋ค.
ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ ๋ฐ์ดํฐ์ ํ์๋ฅผ ์์ํ๋ค.
๋คํ์ฑ์ ํด๋์ค ์ธ์คํด์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ์คํ ์๊ฐ์ ๋ณ๊ฒฝํ๋๋ก ํ์ฉํ๋ค.
๋ชจ๋ ๊ฐ์ ๊ด๊ณ๋ ์ ์ ์ด๋ค.
๋ชจ๋๊ณผ ํด๋์ค์ ์ ์ฌ์
์ธ๋ถ ๊ตฌํ์ ์ธ๋ถ(public) ๋ทฐ๋ก๋ถํฐ ๊ฐ์ถ๋๋ฐ ์ฌ์ฉ๋๋ค.
๋ ๋ค ๊ณ์ธต์ ํ์ฑํ ์ ์๋ค.
- 17 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
18
๊ณ์ธต (Hierarchy)
๊ณ์ธต์ ์์ชฝ์ผ๋ก ๊ฐ์๋ก ์ถ์ํ ์ ๋๊ฐ ์ฌํจ
๊ณ์ธต์ ์์ชฝ์ผ๋ก ๊ฐ์๋ก ๋ถ๋ฅ ๊ธฐ์ค ์์ฑ์ด ์ค์ด ๋ฌ
๊ณ์ธต์ ์๋์ชฝ์ผ๋ก ๊ฐ์๋ก ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด
๋ฐ๋ผ์ ๊ณ์ธต์ด ํํํ๋ ๊ฐ๋ ์,
Generalization / Specialization
Level of abstraction
Aggragation/Composition ๊ด๊ณ๊ฐ ํ์ฑํ๋ ๊ณ์ธต๊ณผ๋ ๋ค๋ฆ
๋๋ฌผ
๋ ์ง์น ๋ค์ง์น ํ์ถฉ๋ฅ
๋ ์๋ฆฌ ๋น๋๊ธฐ ์ฌ์ ํธ๋์ด
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
19
๋คํ์ฑ(Polymorphism) (1/2)
๋คํ์ฑ์ ์ถ์ํ์ ๊ฐ๋ ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ค.
๊ฐ๋จํ ๋ช ๋ น์ผ๋ก ๋ง์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
๋ช ๋ น์ด ์ํ๋๋ ์๊ฐ์ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋ช ๋ น์ ๋ฐ์ ๊ฒ์ธ์ง ์ ๊ฒฝ์ ์ฐ์ง ์๋๋ค.
์คํ์๊ฐ ๋ฐ์ธ๋ฉ(Run time binding, Late binding)
๋ฆฌ๋ชจ์ฝ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋คํ์ฑ(Polymorphism) (2/2)
์ฉ์ด ์ ์ (from wikipedia)
[๊ฐ๋จ์ ์]๋คํ์ฑ์ ์์ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ๋ถ๋ชจํด๋์ค์ ๋ฉค๋ฒ์ฒ๋ผ ๋ค๋ฃจ๋ ๊ฒ
๋คํ์ฑ์ ๋์ผํ ์ด๋ฆ์ ๋ฉ์๋ ํธ์ถ์ ์๋ตํ์ฌ ์๋ก ๋ค๋ฅธ ํ์ ์ ์์๋๋ ๊ฐ์ฒด์ ์ญ๋์ด๋ค. ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด์ ์ ํํ ํ์ ์ ๋ฏธ๋ฆฌ ์ ํ์๊ฐ ์์ผ๋ฉฐ, ๋ฐ๋ผ์ ์ด ํ์๋ ์คํ ์์ ์ ๊ตฌํ๋ ์ ์๋ค(์ด๊ฒ์ ์ง์ฐ ๋ฐ์ธ๋ฉ ๋๋ ๋์ ๋ฐ์ธ๋ฉ์ด๋ผ ํจ).
์ฐธ์ฌํ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ ํด๋ผ์ด์ธํธ์๊ฒ ํธํ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ ๋์ผํ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ํผ๋ธ๋ฆญ ๋ฉ์๋์ฌ์ผ ํ๋ค.
Overriding
์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ, overriding polymorphism ์ด๋ผ๊ณ ํจ.
Overloading
๊ตฌํ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด ํ๋์ ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ์ฌ์ฉํจ, overloading polymorphism ์ด๋ผ๊ณ ํจ. ์ โ+โ ์ฐ์ฐ์.
- 20 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ํตํ ์ค์ธ๊ณ ๋งคํ(1/2)
๊ด๊ณ ์ ํ
Aggregation/Composition
Inheritance/Realization
Dependency
- 22 -
๊ธฐ๋ณธ์ฐจ์ฒด
ํ๋์ฐจ์ฒด
์๋์ฐจ
์๊ฐ์ด์ ์
์์ง
๋ฐํด
์์ง์ค์ผ๊ฒ์ด์ง
ํ์ด์ด
๊ต์ฒด
์์ง์ค์ผ
์ฒดํฌ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ํตํ ์ค์ธ๊ณ ๋งคํ(2/2)
์ํฉ(context)์ ๋ฐ๋ผ ๊ด๊ณ ์ ํ์ด ๋ฌ๋ผ์ง
๊ฐ์ฌ์ฉPC์ ๊ฐ์ฌ
์ค์ต์ฉ๋ ธํธ๋ถ๊ณผ ์๊ฐ์
- 23 -
ํ๊ฐ์ ์
์๊ฐ์
๊ฐ์ฌ
๊ณผ๋ชฉ ์ค์ต์ฉ๋ ธํธ๋ถ
๋นํ๋ก์ ํฐ
ํ์ดํธ๋ณด๋
๊ฐ์ฌ์ฉPC
์ปดํจํฐ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๋ฆฌ์ค์ฝํ ๋์ฒด ๊ท์น์ด ๊นจ์ง ~~
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
OCP(Open Closed Principle)
์์น
์ํํธ์จ์ด ๋ชจ๋์ ๋ณ๊ฒฝ์ ๋ํด ๋ซํ์๊ณ , ํ์ฅ์ ๋ํด ์ด๋ ค์์ด์ผ ํ๋ค.
๋ฐ๋ผ์, ์ํํธ์จ์ด ๋ชจ๋์ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฅํ์ฌ์ผ ํ๋ค.
- 27 -
Customer A BusinessLogic
Customer B [๋ณ๊ฒฝ๋]BusinessLogic
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
OCP(Open Closed Principle)
ํ์ฅ์ฑ์ ๋์ด๊ธฐ ์ํด ๋์จํ ๊ฒฐํฉ ์์น(Loose Coupling)์ ์ค์ํ๋ค.
๋์ถ์์ฒญ ์ฒ๋ฆฌ๊ธฐ์ ๊ฐ์ธ๋์ถ๊ฒ์ฆ ํด๋์ค๋ tight coupling ์ํ
์๋ก์ด ๋์ถ์ธ ์ฌ์ ์ ๋์ถ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ํ์ฅ์ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- 28 -
๋์ถ์์ฒญ์ฒ๋ฆฌ๊ธฐ
+๋์ถ์น์ธ(๊ฐ์ธ๋์ถ๊ฒ์ฆ)
๊ฐ์ธ๋์ถ๊ฒ์ฆ
+isValid(int):boolean
์ฌ์ ์๋์ถ๊ฒ์ฆ
+isValid(int):boolean
?
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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) {
....
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
DIP(Dependency Inversion Principle)
์ค๊ณ ์,
๋จผ์ ๋ชจ๋์ด ๋์ํ๋๋ก ์ค๊ณ๋ฅผ ํ ํ,
๋ชจ๋์ ์ฌ์ฌ์ฉ์ฑ, ์ ์ฐ์ฑ, ๊ฒฌ๊ณ ์ฑ์ ์ดํด๋ณธ๋ค.
์ด ๋, OCP๋ฅผ ์ค์ํ๋์ง ๊ฒํ ํ๋ค.
์์กด์ฑ ์ญ์ ์์น์ OCP๋ฅผ ์ค์ํ๋๋ก ๋์์ค๋ค.
๋์ ์์ค์ ๋ชจ๋์ ๋ฎ์ ์์ค์ ๋ชจ๋์ ์์กดํ์ง ๋ง์์ผ ํ๋ค. ๋ชจ๋ ์ถ์ํ ๋ชจ๋์ ์์กดํ์ฌ์ผ ํ๋ค.
์ถ์ํ ์์ค์ ๋ชจ๋์ ์์ธ ์์ค ๋ชจ๋์ ์์กดํ์ง ๋ง์์ผ ํ๋ค. ์์ธ ์์ค ๋ชจ๋์ ์ถ์ํ ๋ชจ๋์ ์์กดํ์ฌ์ผ ํ๋ค.
- 30 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
- 33 -
1.3 ๋์์ธ ํจํด ์ ์
๋์์ธ ํจํด ์ ์
๋์์ธ ํจํด ์ญํ
๋์์ธ ํจํด ์ ๋
๋์์ธ ํจํด ํ์ฉ
๋์์ธ ํจํด ๋ฌธ์ ์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋ค์ด๊ฐ๊ธฐ ์ ์...
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
ํผ์์ ๊ณ ๋ฏผ์ ํ๋ค.
๋จ์๊ฒ ๋ฌผ์ด๋ณธ๋ค.
๋์ผํ ๋ฌธ์ ๋ฅผ ์ฃผ๋ณ์์ ์ฐพ์๋ณธ๋ค.
๋์ผํ ์ ํ(ํจํด)์ ๋ฌธ์ ๋ฅผ ์ฃผ๋ณ์์ ์ฐพ์๋ณธ๋ค.
์์ด๋์ด๋ ์์ด๋์ด๋ฅผ ๋๊ณ ์ผ์ด์๊ณ , ๊ฐ์ ์ ๊ฐ์ ์ ๋๊ณ ์ผ์ด์ ๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฌธ์ ๊ฐ ์ ์ผํ ํ๋ฅ ์ ๊ฑฐ์ ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฌธ์ ๋ ๋๋ถ๋ถ ๋ณตํฉ์ ์ด๋ค.
์ค์ค๋ก ๊ณ ๋ฏผํ๋ ๊ฒ๋ณด๋ค ๋ฃ๋ ๊ฒ์ด ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋ ๋๊ฐ ์๋ค.
- 34 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋์์ธ ํจํด ์ ์
ํจํด์ ๊ฒ์ฆ๋ ์ค๊ณ ๊ฒฝํ์ ๊ธฐ๋ก
ํจํด์ ์ฃผ์ด์ง ์์คํ ์ํฉ(context)์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ํด์๋ฃจ์ ์ ์
ํจํด์ ๋์์ธ๊ณผ ์ํคํ ์ฒ์ ๋ํ ์ฉ์ด ์ ๊ณต
ํจํด ๊ทธ๋ฃน์ ์ํคํ ์ฒ์ ๊ธฐ๋ฐ
- 35 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋์์ธ ํจํด ์ ์(wikipedia)
์ํํธ์จ์ด ์์ง๋์ด๋ง์์, ๋์์ธ ํจํด์ ์ํํธ์จ์ด ์ค๊ณ์์ ์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํ ์ผ๋ฐ์ ์ด๊ณ ๋ฐ๋ณต ๊ฐ๋ฅํ ์๋ฃจ์ ์ด๋ค.
๋์์ธ ํจํด์ ์๋ฃ๋ ์ค๊ณ๊ฐ ์๋๋ฏ๋ก ์ง์ ์ฝ๋๋ก ๋ณํํ ์ ์๋ค.
๋์์ธ ํจํด์ ์๋ก ๋ค๋ฅธ ์ฌ๋ฌ ์ํฉ(situation)์์ ์ฌ์ฉํ ์ ์๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ํ ๊ธฐ์ (description) ๋๋ ํ ํ๋ฆฟ์ด๋ค.
๊ฐ์ฒด-์งํฅ ๋์์ธ ํจํด์ ์ฐธ์ฌํ ์ต์ข ์ดํ๋ฆฌ์ผ์ด์ ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ๋ช ์ธํ์ง ์๊ณ , ํด๋์ค ๋๋ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ์ ์ํธ์์ฉ์ ๋ณด์ฌ์ค๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณ ๋ฌธ์ ๋ณด๋ค๋ ๊ณ์ฐ๊ด๋ จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฏ๋ก ๋์์ธ ํจํด์ผ๋ก ๊ฐ์ฃผํ์ง ์๋๋ค.
๋ชจ๋ ์ํํธ์จ์ด ํจํด์ด ๋์์ธ ํจํด์ ์๋๋ค. ๋์์ธ ํจํด์ ์ํํธ์จ์ด ์ค๊ณ ์์ค์ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฌ๋ค.
- 36 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋์์ธ ํจํด์ ์ญํ
๊ธฐ์กด์์ํคํ ์ฒ๋ฅผ์ดํดํ๊ณ ๋ฌธ์ํํ๋ค.
ํจํด์ ๊ธฐ์กด์ ์ดํ๋ฆฌ์ผ์ด์ , ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ์๋ด์ ์ญํ ์ํ.
์ค๊ณ๋ฅผ ๋๊ณ ์ค๊ณ ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น๋ค.
ํจํด์ ๋์์ธ ๊ฒฝํ์ ๋ด๊ณ ์์ผ๋ฏ๋ก ํน์ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๊ณต
๋์์ธ์๋ํ ์์ฌ๊ตํ์ ๋๋๋ค.
ํจํด์ ์ค๊ณ์ ๊ฐ์ ์ค์ํ ๊ฒฐ์ ์ ๋๊ณ ์ ๋นํ ํจ.
- 37 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋์์ธ ํจํด ์ ๋
ํจํด์ ๊ฑด์ถ ์ํคํ ์ฒ๋ก๋ถํฐ ์ ๋โฆ
๊ทธ๋ค์ ๊ณผ๊ฑฐ์ ๊ฑด์ถ๋ฌผ์ ์๋ช ์ ๋ถ์ด๋ฃ์๋ ๋น๊ณต์์ ์ธ ๊ฒฝํ ์ค์ ์ผ๋ถ๋ฅผ ์ก์๋ด๋ ค ๋ ธ๋ ฅํ๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ฒ๋ค์ด ํ๋ ๊ฑด์ถ์์๋ ์ ์ ์ํ์ง๊ณ ์๋ค...
ํจํด์ ๋์์ธ ๊ฒฝํ, ๊ด๋ จ ๋ฌธ์ ์ ํด๊ฒฐ์ฑ ์ ํจ๊ป ๋ด๊ณ ์๋ค :
โ๊ฐ ํจํด์ ์ฐ๋ฆฌ ํ๊ฒฝ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๊ธฐ์ ํ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ํต์ฌ๋ง์ ๊ธฐ์ ํ๋ค. ๊ทธ๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก ๊ทธ ์๋ฃจ์ ์ ์์์ด ๋ฐ๋ณตํด์๋ค์ ์ฌ์ฉํ ์ ์๋ค.โ (Christopher Alexander et al, A Pattern Language)
- 38 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋์์ธ ํจํด ํ์ฉ
๋์์ธ ํจํด์ ๊ฒ์ฆ๋ ๊ฐ๋ฐ ํจ๋ฌ๋ค์์ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ผ ์ ์๋ค. ํจ๊ณผ์ ์ธ ์ํํธ์จ์ด ์ค๊ณ๋ ๊ตฌํ์ ๊ฐ์์ผ ๋ณผ ์ ์๋ ์ด์๋ค์ ๊ณ ๋ คํ ๊ฒ์ ์๊ตฌํ๋ค. ๋์์ธ ํจํด ์ฌ์ฌ์ฉ์ ํตํด ๋์ค์ ํฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ๋ฏธ๋ฌํ ์ด์๋ฅผ ์ฌ์ ์ํ์ ํ ์ ์์ผ๋ฉฐ, ํจํด์ ์ต์ํ ๊ฐ๋ฐ์๋ ์ํคํ ํธ๋ฅผ ์ํด ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋ค.
ํํ, ์ฌ๋๋ค์ ์ด๋ค ๋ฌธ์ ์ ์ด๋ค ์ํํธ์จ์ด ์ค๊ณ ๊ธฐ์ (technique)์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ๋ง์ ์ดํดํ๋ค. ์ด๋ฌํ ๊ธฐ์ (technique)์ ๋์ ๋ฒ์์ ๋ฌธ์ ์ ์ ์ฉํ๊ธฐ ์ด๋ ต๋ค. ๋์์ธ ํจํด์ ์ผ๋ฐ์ ์ธ ํด๋ฒ์ ์ ๊ณตํ๋ค. ์ด๋ ํน์ ๋ฌธ์ ๋ก ๋ฒ์๋ฅผ ์ขํ์ง ์๊ณ ๋ฌธ์ํ ํ๋ค.
๋์์ธ ํจํด์ ๋ช ๊ฐ์ง ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ํนํ ์ค์ํ ๋ถ๋ถ์ ๊ตฌ์กฐ(structure), ์ฐธ์ฌ๊ฐ์ฒด(participant), ํ์ (collaboration) ๋ถ๋ถ์ด๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ์ค๊ณ ๋๊ธฐ๋ ์ฃผ์ ๋ฅผ ์์ ํ๋ค(์ด๊ฒ์ ๋ง์ดํฌ๋ก-์ํคํ ์ฒ๋ผ ํจ). ๋ง์ดํฌ๋ก-์ํคํ ์ฒ๋ ํ๋ก๊ทธ๋จ ๊ตฌ์ฑ์ฒด(์, ํด๋์ค, ๋ฉ์๋,...)์ ๊ทธ๋ค์ ๊ด๊ณ ์งํฉ์ด๋ค. ๊ฐ๋ฐ์๋ ์ค๊ณ์ ์ ํ์ ์ธ ๋ง์ดํฌ๋ก-์ํคํ ์ฒ๋ฅผ ๋์ ํจ์ผ๋ก์จ ๋์์ธ ํจํด์ ์ฌ์ฉํ๋ค. ์ด๊ฒ์ ์ค๊ณ์์ ๋ง์ดํฌ๋ก-์ํคํ ์ฒ๋ ์ ํํ ์ค๊ณ ๋๊ธฐ์ ์ ์ฌํ ๊ตฌ์กฐ์ ์กฐ์ง์ฒด๊ณ๋ฅผ ๊ฐ์ง ๊ฒ์์ ์๋ฏธํ๋ค.
ํจํด์ ์ํํธ์จ์ด ์ํธ์์ฉ์ ์ ์๋ ค์ง ๋ฐฉ์์ผ๋ก ์์ฌ์ํต์ ํ๊ฒํด์ค๋ค. - 40 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋์์ธ ํจํด ๋ฌธ์ ์
์ ์ฐ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด, ๋์์ธ ํจํด์ ์ฐํ๊ฒฝ๋ก๋ฅผ ํ ๋จ๊ณ ๋ ๊ฑฐ์น๋ค.
์ด๋ก ์ธํด ๊ฒฐ๊ณผ ๋์์ธ์ ๋ณต์กํด์ง๊ณ ,
์ํ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ค ์ ์๋ค.
- 41 -
Target
+request()
Adaptor
request() {
...
return adaptee.specificRequest();
}
Adaptor
+specificRequest()
Client
adaptee
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๊ตฌ์กฐ ํจํด(structural patterns)
Adapter ํจํด
์ด๋ค ํด๋์ค๋ฅผ ์ํด, ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ๋ํ๋ ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฑํํจ
Bridge ํจํด
์ถ์์ ์ธ ๋ถ๋ถ์ ๊ตฌํ๊ณผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๋ ์์๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅํ๊ฒ ํจ
Composite ํจํด
๊ฐ ๊ฐ์ฒด๊ฐ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ค์ ํธ๋ฆฌ๊ตฌ์กฐ
Decorator ํจํด
์์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ํด๋์ค ๊ฐฏ์๊ฐ ์ง์์ ์ผ๋ก ๋์ด๋ ๊ฒฝ์ฐ, ํด๋์ค์ ๊ธฐ๋ฅ ์ถ๊ฐ
Facade ํจํด
๊ธฐ์กด์ ๋ณต์กํ ์ธํฐํ์ด์ค๋ค์ ์ฌ์ฉํ๊ธฐ ์ฝ๋๋ก ๋จ์ํํ ์ธํฐํ์ด์ค ์์ฑ
Flyweight ํจํด
๊ณต๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด ๊ณตํต์ ์์ฑ์ ๊ณต์ ํ๋ ๋ง์ ์์ ๊ฐ์ฒด
Proxy ํจํด
๋ค๋ฅธ ๊ฒ๋ค์ ์ํ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ ํด๋์ค
- 44 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํ์ ํจํด(behavioral patterns) (1/2)
Chain of responsibility ํจํด
๋ช ๋ น ๊ฐ์ฒด๊ฐ ๋ก์ง์ ํฌํจํ๊ณ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์ ์ํด ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ ๋ฌ๋๊ฑฐ๋ ์ฒ๋ฆฌ๋จ
Command ํจํด
ํ์์ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ๊ณ ์๋ ๋ช ๋ น ๊ฐ์ฒด
Interpreter ํจํด
ํน์ ๋ฌธ์ ์งํฉ์ ์ ์ํ๊ฒ ํ๊ธฐ ์ํด ํน์ํ๋ ์ปดํจํฐ ์ธ์ด๋ฅผ ๊ตฌํํจ
Iterator ํจํด
๊ฐ์ฒด ๋ด๋ถ ํํ๋ฐฉ์์ ๋ ธ์ถํ์ง ์๊ณ ์งํฉ๊ฐ์ฒด์ ์์์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ ๋ ์ฌ์ฉํจ
Mediator ํจํด
ํ์ ์์คํ ์์์ ์ธํฐํ์ด์ค์ ์งํฉ์ ์ํ์ฌ ํตํฉ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต
Memento ํจํด
๊ฐ์ฒด๋ฅผ ์ด์ ์ ์ํ๋ก ๋๋๋ฆด ์ ์๋ ์ญ๋์ ์ ๊ณตํจ(๋กค๋ฐฑ)
Null Object ํจํด
๊ฐ์ฒด์ ๊ธฐ๋ณธ๊ฐ(default value)์ผ๋ก ์๋ํ๋๋ก ์ค๊ณํจ
- 45 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํ์ ํจํด(behavioral patterns) (2/2)
Observer ํจํด
๋ณ์นญ: publish/Subscribe ๋๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋
๋ค๋ฅธ ๊ฐ์ฒด์ ์ํด์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๊ด์ฐฐํ๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ๋ฑ๋ก
State ํจํด
์คํ ์์ ์ ๊ฐ์ฒด์ ํ์ ์ ๋ถ๋ถ์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํ ๊นจ๋ํ ๋ฐฉ๋ฒ
Strategy ํจํด
์คํ ์์ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ ์๋๋ก ํจ
Specification ํจํด
๋ถ์ธ๋ฆฌ์ธ ๋ฐฉ์์ผ๋ก ์ฌ๊ฒฐํฉํ ์ ์๋ ๋น์ฆ๋์ค ๋ก์ง
Template method ํจํด
ํ๋ก๊ทธ๋จ์ ๋ผ๋๋ฅผ ๊ธฐ์ ํจ์ผ๋ก์จ ์ฒ๋ฆฌ ์ ์ฐจ๋ฅผ ๊ณต์ ํจ
Visitor ํจํด
๊ฐ์ฒด๋ก๋ถํฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- 46 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ์์ฑ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ์คํผ๋ ์ด์ ์ถ๊ฐ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
1.5 ๋์์ธ ํจํด ์ฌ๋ก์ฐ๊ตฌ(GoF)
Lexy ์๊ฐ
์ค๊ณ ์ด์
๋ฌธ์๊ตฌ์กฐ
ํฌ๋งทํ
UI ์ฅ์
์ฌ๋ฌ ๋ฃฉ-์ค-ํ ํ์ค ์ง์
์ฌ๋ฌ ์๋์ฐ ์์คํ ์ง์
์ฌ์ฉ์ ์กฐ์
- 49 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Lexi ์๊ฐ
Lexi
WISIWYG(What You See Is What You Get) ๋ฌธ์ ํธ์ง๊ธฐ
ํธ์งํ๋ฉด
ํ ์คํธ/๊ทธ๋ํฝ
๋ค์ํ ํฌ๋งท ์คํ์ผ
ํ๋ค์ด ๋ฉ๋ด
์คํฌ๋กค ๋ฐ
ํ์ด์ง ์์ด์ฝ
- 50 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ค๊ณ ์ด์
๋ฌธ์ ๊ตฌ์กฐ
๋ฌธ์๊ตฌ์กฐ๋ ํธ์ง๊ธฐ์ ๋ค๋ฅธ ๋ชจ๋ ๊ธฐ๋ฅ(ํธ์ง, ํฌ๋งทํ , ๋ณด๊ธฐ, ํ ์คํธ ๋ถ์)์ ์ํฅ์ ๋ฏธ์นจ
ํฌ๋งทํ
ํ ์คํธ์ ๊ทธ๋ํฝ์ ๋ผ์ธ๊ณผ ์นผ๋ผ์ ์ด๋ป๊ฒ ์ ๋ ฌํ๋๊ฐ? ์ฌ๋ฌ ํฌ๋งท ์ ์ฑ ์ ์ฃผ๊ดํ๋ ๊ฐ์ฒด
UI ์ฅ์
์คํฌ๋กค ๋ฐ, ํ ๋๋ฆฌ ๋ฑ์ ์ฝ๊ฒ ์ถ๊ฐ,์ ๊ฑฐ ๊ฐ๋ฅํ์ฌ์ผ ํจ
์ฌ๋ฌ ๋ฃฉ-์ค-ํ ํ์ค ์ง์
์์ ๋ณ๊ฒฝ์ผ๋ก ๋ชจํฐํ๋ PM๊ณผ ๊ฐ์ ๋ฃฉ-์ค-ํ ํ์ค์ผ๋ก ๋ณ๊ฒฝํ์ฌ์ผ ํจ
- 51 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ค๊ณ ์ด์ โ ๋ฌธ์ ๊ตฌ์กฐ (1/2)
๋ฌธ์ ๋ด๋ถํํ
๋ฌธ์์ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ, ํ ์คํธ์ ์ด๋ฏธ์ง๋ฅผ ๋ผ์ธ๊ณผ ์นผ๋ผ, ํ ์ด๋ธ๋ก ์ ๋ ฌํด์ผ ํจ
๋ฌธ์๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํจ
๋ด๋ถ ์์๋ฅผ ๋์คํ๋ ์ด์ ์ง์ ์ผ๋ก ๋งคํ
- 52 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ํจํด
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ค๊ณ ์ด์ โ ํฌ๋งทํ (1/2)
ํฌ๋งทํ
ํน์ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ๊ฒ์ธ๊ฐ?
ํํ(representation)๊ณผ ํฌ๋งท์ ๋ณ๊ฐ์ ์์
โข ํํ: ๋ฌธ์์ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ(๋ณตํฉ๊ตฌ์กฐ)
โข ํฌ๋งท: ํ ์คํธ๋ฅผ ๋ผ์ธ์ผ๋ก ๋๋๊ณ , ๋ผ์ธ์ ์นผ๋ผ์ผ๋ก... ์ข์ฐ์ํ ๊ณต๋ฐฑ, ๋ค์ฌ์ฐ๊ธฐ, ํญ์ ๊ณ ๋ คํจ
ํฌ๋งทํ = ๋ผ์ธ ๋๋๊ธฐ, ์นผ๋ผ ๋๋๊ธฐ
ํฌ๋งทํ ์๊ณ ๋ฆฌ์ฆ
ํ์ง๊ณผ ์๋ ๊ณ ๋ ค
ํฌ๋งทํ ์๊ณ ๋ฆฌ์ฆ์ ๋งค์ฐ ๋ณต์กํจ
์ปดํ์ผ ํ์ ๋๋ ์คํ ์๊ฐ์ ์ฌ์ฉ์๊ฐ ์ ํ ๊ฐ๋ฅํด์ผ ํจ
์๋ก์ด ํฌ๋งทํ ์๊ณ ๋ฆฌ์ฆ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํด์ผ ํจ
์ค๊ณ ๋ฐฉํฅ
ํฌ๋งทํ ์๊ณ ๋ฆฌ์ฆ์ ์บก์ํํ๊ธฐ ์ํ ๊ฐ์ฒด๋ค์ ์ํด ๋ณ๋์ ํด๋์ค ๊ณ์ธต์ ๊ตฌ์ฑ
์ธํฐํ์ด์ค ์ ์
- 54 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ค๊ณ ์ด์ โ UI ์ฅ์ (3/3)
์ ํ
Border๊ฐ Scroller๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ
Scroller๊ฐ Border๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ
Decorator ํจํด
์จ๊น์๋ ๋๋ฌ์ธ๋ ๋ฐฉ์์ผ๋ก ์ฅ์์ ์ง์ํ๋ ๊ฐ์ฒด ๊ด๊ณ
์ฅ์์ ์ด๋ค ๊ฐ์ฒด์ ์ฑ ์์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธํจ
- 58 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ค๊ณ ์ด์ โ ์ฌ๋ฌ ๋ฃฉ-์ค-ํ ์ง์(2/2)
ํฉํ ๋ฆฌ๊ฐ UI ์์ง์งํฉ(product object)์ ์์ฑํจ
Abstract Factory ํจํด
- 60 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์์ฝ (๋์์ธ ํจํด ์ฌ๋ก์ฐ๊ตฌ)
Lexi ๊ฐ๋ฐ์ ์ฌ์ฉํ ํจํด๋ค
Composite ํจํด
Strategy ํจํด
Decorator ํจํด
Abstract Factory ํจํด
- 61 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์์ฝ (๋์์ธ ํจํด ๊ฐ์)
๋์์ธ ํจํด์ ์ค๊ณ์์ ์ฌ๊ณ ๋ฅผ ์ฒด๊ณํ ํ์ฌ ์ค๋ค.
๋์์ธ ํจํด์ ์ ์ํ ํด๊ฒฐ์ฑ ์ฐพ๊ธฐ๋ฅผ ๋์์ค๋ค.
๋์์ธ ํจํด์ ์กฐํฉํ๊ฑฐ๋ ์์ฉํ์ฌ ์ฌ์ฉํ๋ค.
๋์์ธ ํจํด์ Over-engineering์ผ๋ก ์ด๋ ์๋ ์๋ค.
- 62 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋ค์ด๊ฐ๊ธฐ ์ ์...
๊ฐ์ ๊ตฌ์ฑ
Problem ์ ์
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
โข Problem ํด๊ฒฐ ์ ์ ์ฉํ ํจํด ์๊ฐ
โข ๋ชจ๋ธ ๋ฐ ์์ค ๊ฒํ
โข ๋์ผ ๋ฒ์ฃผ๋ด ๋ค๋ฅธ ํจํด๋ค ๊ฐ๋ต ์๊ฐ
- 65 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋ค์ด๊ฐ๊ธฐ ์ ์...
์ค์ต ์ฐธ์กฐ
IDE Tool : Eclipse
Java ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฐ ํจํค์ง ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
- 66 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
2.1 Singleton ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 67 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด
Problem ์ ์
ํ๋ฆฐํฐ ์คํ์ ์์คํ ์ ์ค์ง ํ๋๋ง ์กด์ฌํ์ฌ์ผ ํ๋ค. ํ๋ฆฐํฐ ์คํ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ ํ๋ก๊ทธ๋๋จธ A์จ๋ ๋ฐ๋์ ํ๋๋ง ์์ฑํ๋๋ก ๊ฒ์ฌํ๊ณ ์๋ค. ๋ํ ํธ๋ฆฌํ ์ ๊ทผ์ ์ํด ์ ์ญ๋ณ์(static)๋ก ์ธ์คํด์ค๋ฅผ ์ ๊ทผํ๋๋ก ํ์๋ค. ์ด ์ฌ์ค์ ์ ๋๋ก ์ ๋ฌ๋ฐ์ง ๋ชปํ ๊ฐ๋ฐ์๋ค์ด ํ๋ฆฐํฐ ์คํ ๊ฐ์ฒด๋ฅผ ์์๋ก ์์ฑํ๋ ค๋ค ์๋ฌ๋ฅผ ๋ง๋๊ณค ํด์ ์์ฑ์ด ํฌ๋ค.์ด๋ป๊ฒ ํด๊ฒฐํ ๊ฒ์ธ๊ฐ?
- 68 -
PrintSpool
Client
Client
Client
๋์ผํ ๊ฐ์ฒด ์ฌ์ฉ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ์ ์์ด๋ฒ๋ฆฐ๋ค.
๋๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ์ฝ๋์ ์ํด ๋ค์ ์์ฑ๋ ์ ์๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด
Client ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 71 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
๊ฐ์ฒด ์์ฑ ์ ์ดํ๊ธฐ
โข Spool์ ์ค์ง ํ๋๋ง ์กด์ฌํ๊ธฐ์ ์๋ฌด๋ ์์ฑํ ์ ์์ผ๋ฉด ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โข ์๋ฌด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ก ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ ผ์ํ์์ค.
์ผ๊ด์ฑ ์๋ ๊ฐ์ฒด ์ ๊ทผ ๋ฐฉ๋ฒ ์ ๊ณต
โข ์์คํ ์ ์ค์ง ํ๋๋ง ์กด์ฌํ๋ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ณ ์ผ๊ด์ฑ ์๊ฒ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ๋ ผ์ํ์์ค.
โข ๋ ผ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ๊ณ ๊ตฌํํ์์ค.
- 72 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํํ ๊ฒ.
- 73 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Singleton ํจํด
์๋
ํด๋์ค์์ ๋ง๋ค ์ ์๋ ์ธ์คํด์ค๊ฐ ์ค์ง ํ๋์ผ ๊ฒฝ์ฐ
์ด์ ๋ํ ์ ๊ทผ์ ์ด๋์์๋ ์ง ํ๋๋ก๋ง ํต์ผํ์ฌ ์ ๊ณต
๋๊ธฐ
์์คํ ์ ๋ง์ ํ๋ฆฐํฐ๊ฐ ์๋๋ผ๋ ํ๋ฆฐํฐ ์คํ์ ํ๋์ด์ด์ผ ํจ
์๋์ฐ๊ฐ ๋ง๋๋ผ๋ ์๋์ฐ ๋งค๋์ ๋ ์์คํ ์ ํ๋์ด์ด์ผ ํจ
- 74 -
PrintSpool
- singleton
- PrintSpool
+ getInstance () : PrintSpool
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Singleton ํจํด
์ ์ฉ
ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์ค์ง ํ๋์ด์ด์ผ ํจ์ ๋ณด์ฅ
์ ์ผํ ์ธ์คํด์ค์ ๋ํ ์ ์ ์๋ ์ ๊ทผ ๋ฐฉ์ ์ ๊ณต
- 76 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
2.2 Abstract Factory ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 77 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(1/5)
Problem ์ ์
๋ค์ํ ๊ณ ๊ฐ์ ๋์์ผ๋ก ์์ ํ๋ A์จ๋ ์์ ๋ง์ ๊ณ ๊ฐ๊ด๋ฆฌ๊ฐ ํ์ํจ์ ๋๊ผ๋ค. ์ด๊ธฐ ๋์์ธ์๋ A์จ ๊ณ ๊ฐ์ด ์ฃผ๋ก ๊ตญ๋ด์ธ์ผ๋ก ๋์ด ์์ด์ ์๋์ ๊ฐ์ ํํ๋ก ๊ฐ๋ฐ๋์์ผ๋ ์์ ์ ํ๋ฉด์ ์ธ๊ตญ์ ๊ฑฐ์ฃผํ๋ ๊ณ ๊ฐ์ด ์ ์ฐจ ๋์ด๋๊ฒ ๋์๊ณ , A์จ๋ ์ฃผ์์์ ํ๋ฒํธ๊ฐ ๊ฑฐ์ฃผํ๋ ๊ตญ๊ฐ์ ๋ง๊ฒ ์์ฑ๋๊ธฐ๋ฅผ ์ํ๋ค.
- 78 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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());
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(5/5)
Client ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 82 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
์ถ์ํ ๋๋ ์ผ๋ฐํ ํ๊ธฐ
โข ๋ฏธ๊ตญ์ ๊ฑฐ์ฃผํ๋ ๊ณ ๊ฐ์ด ์ถ๊ฐ๋์์ ๊ฒฝ์ฐ ์ถ์ํ ๋๋ ์ผ๋ฐํ ์์ผ์ผ ํ ๋ถ๋ถ์ ์ด๋์ธ์ง ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ์์ค.
โข ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์ ์ฉํ ์ฌํญ์ ์คํํ์ฌ ์ ๋๋ก ๋์ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์์ค.
๋ณ๊ฒฝ์ ๊ตญ์งํ (Localization of Changes)
โข ๋ณ๊ฒฝ์ด ์์๋๋ ๋ถ๋ถ์ ๊ตญ์งํ์ํด์ผ๋ก์จ ๋น์ฉ์ ์ต์ํํ ์ ์๋ค. ๋ณ๊ฒฝ์ ๊ตญ์งํ ํ ์ ์๋ ๋ถ๋ถ์ ์ฐพ์ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ์์ค.
โข ์์ ์ ๋ค์ด์ด๊ทธ๋จ์ ์์ ์๋ ์ฌ๋๊ณผ ๋น๊ต ํ ์ํ์์ค.
- 83 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํ
- 84 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Abstract Factory ํจํด(1/9)
์๋
๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ์ง์ ํ์ง ์๊ณ ๊ด๋ จ์ฑ์ ๊ฐ๋ ๊ฐ์ฒด๋ค์ ์งํฉ์ ์์ฑํจ
์๋ก ๋ ๋ฆฝ์ ์ธ ๊ฐ์ฒด๋ค์ ์งํฉ์ ์์ฑํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํจ
๋๊ธฐ
Problem์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Abstract Factory ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ์ถ์ํ ๊ฒฐ์ ํ๊ธฐ
โข ๋ณ๊ฒฝ์ ๊ตญ์งํ (Localization of Changes)
- 85 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๋ง์ฝ, ํ๋์ค ๊ฑฐ์ฃผ ๊ณ ๊ฐ์ด ์ถ๊ฐ๋๋ค๋ฉด ???
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๋ณ๊ฒฝ์ฌํญ์ ๋ํ ์ ์ง๋ณด์๋ฅผ ์ํด์ ๋ณ๊ฒฝ์ ๋ํ ๊ตญ์งํ๊ฐ ํ์ํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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์ ํ์ํด๋์ค๋ ๊ฐ๊ฐ ์์ ์ ํ์์ ๋ง๋ ๊ตฌ์ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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());
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Abstract Factory ํจํด(7/9)
์ ์ฉ
์์ฑ๋๊ณ ๊ตฌ์ฑ๋๊ณ ํํ๋๋ ๋ฐฉ์๊ณผ ๋ฌด๊ดํ๊ฒ ์์คํ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ง๋ค๊ณ ์ ํ ๋
ํ๋ ์ด์์ ์ ํ๊ตฐ๋ค ์ค ํ๋๋ฅผ ์ ํํด์ ์์คํ ์ ์ค์ ํด์ผ ํ๊ณ ํ๋ฒ ๊ตฌ์ฑํ ์ ํ์๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒดํ ์ ์์ ๋
๊ด๋ จ๋ ๊ฐ์ฒด๊ตฐ์ ํจ๊ป ์ฌ์ฉํด์ ์์คํ ์ ์ค๊ณํ๊ณ , ์ด ์ ํ์ด ๊ฐ๋ ์ ์ฝ ์ฌํญ์ ๋ฐ๋ผ์ผ ํ ๋
์ ํ์ ๋ํ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ , ๊ทธ๋ค์ ๊ตฌํ์ด ์๋ ์ธํฐํ์ด์ค๋ฅผ ํํํ๊ณ ์ถ์ ๋
- 91 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
2.3 Prototype ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 94 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(1/6)
Problem ์ ์
TV ๋ฆฌ๋ชจ์ปจ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ A์จ๋ ์๋์ ๊ฐ์ด S์ฌ TV์ L์ฌ TV๋ฅผ ์ ์ดํ๋๋ก์๋์ ๊ฐ์ด ๊ฐ๋ฐํ์๋ค. TV๋ฅผ ์ฌ๋ฌ ๋ ์์ ํ ๊ณ ๊ฐ์ TV ๋ณ๋ก ๋ฆฌ๋ชจ์ปจ์ ๊ฐ๊ฒ ๋์ด๋ถํธํจ์ ๋๋ผ๊ณ ์์ด A์จ์๊ฒ ๋ธ๋๋์ ๊ด๊ณ์์ด TV๋ฅผ ์ ์ดํ ์ ์๋๋ก ๋ฆฌ๋ชจ์ปจ์์ ์ํ๋๋ก ์๊ตฌํ์๋ค.
- 95 -
?
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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..."); }
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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..."); }
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(6/6)
SCompanyRemocon ์คํ ๊ฒฐ๊ณผ
LCompanyRemocon ์คํ ๊ฒฐ๊ณผ
- 100 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ???;
...
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํํ ๊ฒ.
- 102 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Prototype ํจํด(1/11)
์๋
๊ฒฌ๋ณธ์ (prototypical) ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ๊ฐ์ฒด์ ์ข ๋ฅ๋ฅผ ๋ช ์ํด์ผ ํจ
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ๊ฒฌ๋ณธ์ ๋ณต์ฌํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑ
๋๊ธฐ
Problem ์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Prototype ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ์ถ์ํ ๊ฒฐ์ ํ๊ธฐ
โข ๋์ ์ค๋ธ์ ํธ ๋ณต์ฌ (Copy of Existing Object)
- 103 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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; }
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ํด๋์ค๋ ๋ค์ค์ฑ๋์ ์ํํ๊ธฐ์ํด ๋์ ์ผ๋ก ์ถ์ํ๋ ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ ์ ์๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() ๋ฉ์๋๋ฅผ ํตํด์ ์ธ์คํด์ค ๋ณต์ฌ ์์์ฑ์ ์ฐธ์กฐ๋ง ๋ณต์ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() ๋ฉ์๋๋ฅผ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ง์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ๋๋จธ์ง ๋ถ๋ถ์ ์ด์ ์์ค์ ๋์ผํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
์ธ์คํด์ค ๋ณต์ฌ
โฃ ๋ณ๊ฒฝ ํ ์๋ณธ๊ณผ๋ณต์ฌ๋ณธ๋ด์ฉ ๋น๊ต ์ถ๋ ฅ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Prototype ํจํด(9/11)
์ ์ฉ
Prototype ํจํด์ ์ธ ๊ฒฝ์ฐ๋ ์ ํ์ ์์ฑ, ํฉ์ฑ, ํํ ๋ฐฉ๋ฒ์ ๋ ๋ฆฝ์ ์ธ ์ ํ์ ๋ง๋ค๊ณ ์ ํ ๋
๋ฐํ์ ์ ๋ง๋ค ์ธ์คํด์ค์ ํด๋์ค๋ฅผ ๋ช ์ธํ ์ ์์ ๋
ํด๋์ค ๊ณ์ธต๋์ ๋ณ๋ ฌ์ฑ์ ๊ฐ๋ ํฉํ ๋ฆฌ ํด๋์ค์ ๊ณ์ธต์ ํผํด์ผ ํ ๊ฒฝ์ฐ
ํด๋์ค์ ์ธ์คํด์ค๋ค์ด ์๋ก ๋ค๋ฅธ ์ํ ์กฐํฉ ์ค์ ์ด๋ ํ๋๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉํ๋ค. ์ด๋ค์ ๋ฏธ๋ฆฌ ํ๋กํ ํ์ ์ผ๋ก ์ด๊ธฐํํด ๋๊ณ , ๋์ค์ ์ด๋ฅผ ๋ณต์ฌํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค๋ฒ ํ์ํ ์ํ ์กฐํฉ์ ๊ฐ๋ค์ ์๋์ ์ผ๋ก ์ด๊ธฐํํ๋ ๊ฒ๋ณด๋ค ํธํ ๊ฒฝ์ฐ
- 111 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Prototype ํจํด(10/11)
ํด๋์ค ๊ตฌ์กฐ
- 112 -
Client
+ operation() : void
Prototype
+ clone() : Prototype
ConcretePrototype1
+clone() : Prototype
ConcretePrototype2
+clone() : Prototype
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Prototype ํจํด(11/11)
Sequence
- 113 -
: Client original : Prototype
cloned : Prototype
cloned = orignal.clone();
create
copy attributes
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
2.4 Builder ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 114 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(1/5)
Problem ์ ์
์๋น์ ์ด์ํ๋ A์จ๋ ๋งค์ผ ์๋จ์ ๋ฐ๊พธ๊ณ ์ด๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์๋ค. ์ต๊ทผ ์นํ์ด์ง๋ฅผ ํตํด ์๋จ์ ํ์ธํ๋ ค๋ ์ฌ๋๋ค์ด ๋ง์์ ธ์ ์๋จ์ ํ ์คํธ ํฌ๋งท์ผ๋ก ๋ฟ๋ง ์๋๋ผ HTML ํฌ๋งท์ผ๋ก๋ ๋ง๋ค๊ธฐ๋ก ํ๊ณ ํ์ฌ ํ๋ก๊ทธ๋จ์ ํ์ฅํ๋ ค๊ณ ํ๋ค
- 115 -
==========================
ใ11์ 27์ผ ์๋จใ
โ ์์นจ์๋จ
-ํ ์คํธ
-์ ์ฐ
-๋ฌ๊ฑ
โ ์ ์ฌ์๋จ
-๋์ฅ์ฐ๊ฒ
-๊น์น
-๊ณ ๋ฑ์ด ์กฐ๋ฆผ
==========================
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด (2/5)
ํ์ฌ Model
์๋จ์ ๊ตฌ์กฐ๋ ์ ๋ชฉ(title), ์์ ๋ชฉ(string), ์๋จ์์ดํ (item)์ผ๋ก ๊ตฌ์ฑ
TodayMenu๋ ์ด๋ฅผ private ๋ฉ์๋๋ก ๋๋ ์ ๊ตฌํํจ
- 116 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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");
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(5/5)
Client ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 119 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
Problem ์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
๊ฒฐ๊ณผ ๊ฐ์ฒด ์์ฑ ํจํด ์ฐพ๊ธฐ
โข ๋ชจ๋ ์ถ๋ ฅ์ด ์์์ ์๊ด์์ด ํด์ผ ํ ์ผ๋ค์ ๋ฌด์์ธ๊ฐ?
โข ์๋จ์ ์ถ๋ ฅํ๋ ์ผ๋ฐ์ ์ธ ํจํด์ ์ฐพ์ผ์์ค.
์ถ์ํํ๊ธฐ
โข ์ถ๋ ฅ ์์์ ๋ฐ๋ผ ๋ณํ์ง ์๋ ๊ณตํต์ ์ ์ฐพ์ ์ด๋ฅผ ์ถ์ํํ๊ณ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ์์ค.
โข ๊ณตํต์ ์ค ๊ตฌํ์ด ๋์ผํ ๊ฒ๊ณผ ๋์ผํ์ง ์์ ๊ฒ์ ๋ถ๋ฆฌํ์์ค.
โข ์ด ๋ ๊ฐ์ง๋ฅผ ์ด๋ป๊ฒ ์ ์ํด์ผ ํ๋์ง ๊ฒฐ์ ํ์์ค.
- 120 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํํ ๊ฒ.
- 121 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Builder ํจํด(1/8)
์๋
๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌ
์๋ก ๋ค๋ฅธ ๊ตฌํ์ด๋ผ๋ ๋์ผํ ๊ตฌ์ถ ๊ณต์ ์ ์ฌ์ฉ
๋๊ธฐ
Problem ์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Builder ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํจ
โข ๋ณต์กํ ๊ฐ์ฒด ์์ฑ ํจํด ์ฐพ๊ธฐ
โข ์์ฑ ํจํด ์ถ์ํ
- 122 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Builder ํจํด(2/8)
๋ณต์กํ ๊ฐ์ฒด ์์ฑ ํจํด ์ฐพ๊ธฐ
์๋จ์ ์๋จ์ ๋ชฉ, ์์ ๋ชฉ, ์์ดํ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๊ทธ ์์์ ์๊ด ์์ด ์ ๊ณต๋์ด์ผ ํ ๊ธฐ๋ฅ์ ์๋์ ๊ฐ์
- 123 -
์๋จ ์ ๋ชฉ
==========================
ใ11์ 27์ผ ์๋จใ
โ ์์นจ์๋จ-ํ ์คํธ-์ ์ฐ-๋ฌ๊ฑ
โ ์ ์ฌ์๋จ-๋์ฅ์ฐ๊ฒ-๊น์น-๊ณ ๋ฑ์ด ์กฐ๋ฆผ==========================
์์ ๋ชฉ
์์ ๋ชฉ
์์ดํ
์์ดํ
์์ดํ
์์ดํ
์ ๋ชฉ์์ฑ (makeTitle)
์์ ๋ชฉ์์ฑ (makeString)
์์ดํ ๋ค ์์ฑ (makeItems)
๊ฒฐ๊ณผ์์ฑ (getResult)
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() {...}
์์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ ์ค์ ๊ตฌํํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ํ์ผ)
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 + ")");
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Builder ํจํด(6/8)
Client ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 127 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Builder ํจํด(7/8)
์ ์ฉ
๋ณตํฉ ๊ฐ์ฒด์ ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ํฉ์ฑํ๋ ์์์ ๋ ๋ฆฝ์ ์ผ ๋
โข ํฉ์ฑํ๋ ์์๊ฐ ๋ฌด์์ธ์ง๋ ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ๊ด์ฌํ์ง ์์
โข ํฉ์ฑํ๋ ์์๊ฐ ๋ฌด์์ธ์ง๋ ๋์ค์ ๋์ ์ผ๋ก ๊ฒฐ์
ํฉ์ฑํ ๊ฐ์ฒด๋ค์ ํํ์ด ๋ค๋ฅด๋๋ผ๊ณ ๋์ผํ ๊ตฌ์ถ ๊ณต์ ์ ๊ฐ์ ธ์ผ ํ ๋
๊ณ ๋ ค์ฌํญ
์ ์๊ตฌ ์ฌํญ์ Template Method ํจํด์ผ๋ก ํด๊ฒฐํด ๋ณด์
Builder ํจํด๊ณผ ์ด๋ค ์ ์ด ๋ค๋ฅธ๊ฐ?
- 128 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Builder ํจํด(8/8)
๊ตฌ์กฐ
- 129 -
Director
+ construct()
Builder
+ buildPart
+ getResult()
ConcreteBuilder
+ buildPart
+ getResult()
Product
- builder
๋ณตํฉ๊ฐ์ฒด์ ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ ๋ด๋นํ๋ค.
๋ณตํฉ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๋จ์๊ฐ์ฒด๋builder์๊ฒ ์์ํ๋ค.
builder . buildPart
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
2.5 ๊ธฐํ ์์ฑ ํจํด ์๊ฐ
Factory Method ํจํด
- 130 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Factory Method ํจํด (1/4)
์๋
๊ฐ์ฒด ์์ฑ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ง๋ง ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ง๋ ์๋ธ ํด๋์ค์์ ์ด๋ฃจ์ด์ง
์๋ธ ํด๋์ค์๊ฒ ์ธ์คํด์ค ์์ฑ์ ์ฑ ์์ ์์
๋๊ธฐ
์ ๋ถ์ฆ(ID ์นด๋)์ ๋ง๋๋ ๊ณต์ฅ์ ์์ฑ
์ ํ์ ์์ฑํ๋ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ์ฌ ํฅํ ๋ค๋ฅธ ์ข ๋ฅ์ ์ ํ์ด ๋์ค๋๋ผ๋ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋๋ก ๊ตฌ์ฑ
- 131 -
ID ์นด๋๊ณต์ฅ
ID ์นด๋
์ด์ ๊ณต์ฅ ์ด์
์์ฑ ํ ๋ฑ๋ก
์์ฑ ํ ๋ฑ๋ก
๊ณต์ฅ ์ ํ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
๋์ผํ ์์ฑ๊ณผ์ ์๊ณ ๋ฆฌ์ฆ ์์ฑ
๊ฐ์ฒด ์์ฑ์ ์๋ธ ํด๋์ค์๊ฒ ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Factory Method ํจํด(3/4)
์ ์ฉ
์์ฑํ ๊ฐ์ฒด ํ์ ์ ์์ธกํ ์ ์์ ๋
์์ฑํ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ ํ๋ ์ฑ ์์ ์๋ธํด๋์ค์ ์ ์ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ
๊ฐ์ฒด ์์ฑ์ ์ฑ ์์ ์๋ธ ํด๋์ค์๊ฒ ์์ํ๊ณ ์๋ธ ํด๋์ค ์ ๋ณด๋ฅผ ์๋
- 133 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Factory Method ํจํด(4/4)
๊ตฌ์กฐ
- 134 -
Creator
+ factoryMethod()
+ anOperation()
ConcreteCreator
+ factoryMethod()
Product
ConcreteProductCreate
...
Product = factoryMethod();
...
Return new ConcreteProduct()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
3. GoF ๊ตฌ์กฐ ํจํด
3.1 Composite ํจํด
3.2 Proxy ํจํด
3.3 Bridge ํจํด
3.4 ๊ธฐํ ๊ตฌ์กฐ ํจํด ์๊ฐ
- 135 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
3.1 Composite ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 136 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด(1/7)
Problem ์ ์
๋ฏธ๋๊ฐ ๋ฐ์ ๋ฏธ๋์ํํธ ํ์ฌ๋ ์ผ์ชฝ๊ทธ๋ฆผ ๊ฐ์ ์กฐ์ง ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํ์ฌ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ์๋์ ๊ฐ์ ๋จ์ํ ๊ตฌ์กฐ๋ก๋ ์ธ์ฌ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.์ธ์ฌ๊ด๋ฆฌ์ A์จ๋ ๋ถ์์ ์กฐ์ง์ด ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ด๋ฆฌ๋๊ธธ ์ํ๋ฉฐ ํฅํ ์๋ก์ด์กฐ์ง๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ๋๋๋ผ๋ ์์ฉํ ์ ์๋ ์์คํ ์ ์ํ๋ค.
- 137 -
ํ์ฌ
๊ฐ๋ฐ๋ถ์ ๊ฐ๋ฐ๋ถ์
์ง์ ์ง์ ์ง์ ์ง์
ํ์ฌ
๊ฐ๋ฐ๋ถ์ ๊ฐ๋ฐ๋ถ์
์ง์ ์ง์ ์ง์ ์ง์
์ ํA ์ ํB ๊ตญ๋ด ํด์ธ
์ง์ ์ง์ ์ง์์ง์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
*
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() + ...);
}
...
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด(7/7)
Main ํด๋์ค ์ํ ๊ฒฐ๊ณผ
- 143 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
์ถ์ํ ๋๋ ์ผ๋ฐํ ํ๊ธฐ
โข ๋ถ์ ๋ฐ์ ํ์ ๋ถ์๊ฐ ์กด์ฌํ ์ ์๋ ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ถ์ํํด์ผ ํ ๋ถ๋ถ์์ฐพ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ์์ค.
โข ์ถ์ํ๊ฐ ๊ฒฐ์ ๋๋ฉด ๊ณตํต์ผ๋ก ๊ฐ์ง ์ ์๋ ์ฑ ์์ ์ฐพ์ ์์ ํด๋์ค์ ์ถ๊ฐํ์์ค.
์ฑ ์์ ์์
โข ์กฐ์ง์ ์ถ๋ ฅํ๊ธฐ ์ํ ์ฑ ์์ ๊ฐ์ง print ๋ฉ์๋์ ๋ก์ง์ด ํ ๊ณณ์ ์ง์ค๋์ง ์๋๋ก ์ฑ ์์ ์์ํ์์ค.
โข ํ์ฌ์์ ์ฌ์์ง์๋ค์ ๋ชจ์์ ๊ฐ๊ธฐ ์ํด ์ฌ์์ง์๋ค์ ๋ชฉ๋ก์ ์ป์ด์ค๊ณ ์ ํ๋ค. ์ ์ ํ ์ฑ ์์ ์์์ ํตํด ์ด๋ฅผ ๊ตฌํํ์์ค.
โข ๊ฐ ํด๋์ค์ ๋๋ ์ฑ ์์ด ์์ ์๋ ์ฌ๋๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๋น๊ต ํ ์ํ์์ค.
- 144 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํ
- 145 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Composite ํจํด(1/10)
์๋
๋ถ๋ถ๊ณผ ์ ์ฒด์ ๊ณ์ธต์ ํํํ๊ธฐ ์ํด ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ
ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฃธ
๋๊ธฐ
Problem์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Composite ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ์ถ์ํ ๋๋ ์ผ๋ฐํ ํ๊ธฐ
โข ์ฑ ์์ ์์
- 146 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
ํน์ ๋ฉ์๋๋ํ์ ํด๋์ค์์๊ตฌํํ์ง ์์๊ฒฝ์ฐ ์ฌ์ฉํ ์์๋ค
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
๊ฐ ํธ๋ฆฌ ์์๋ ์์ ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ์ฑ ์์ ์ง๋
์์ ์ ์ ๋ณด๋ ์์ ์ด ์ถ๋ ฅํ๋๋ก์ฑ ์์ ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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>();
}
์ง์์ ๊ฒฝ์ฐ ํ์ ์์๋ฅผ ๊ฐ์ง ์์์ผ๋ฏ๋ก ํ์์ ํ์ง ์๋๋ค.
ํน์ ํธ๋ฆฌ ์์๋ ๋ฐ๋ก ์์ ์ ํ์๋ง ๊ฒ์ํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Composite ํจํด(6/10)
Main ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 151 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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๋ฅผ ์์๋ฐ์ ์๋ก์ด ํ์ ๋ง ๋ง๋ค๋ฉด ๊ธฐ์กด ํด๋์ค ๋ณ๊ฒฝ ์์ด ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค.
์๋ก์ด ํด๋์ค๋ ๊ทธ ๊ฐ์ฒด์ํน์ฑ์ ํํํ๋ ์์ฑ์ ๋ฐ๋ก ๊ฐ์ง๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Composite ํจํด(8/10)
์ ์ฉ
๋ถ๋ถ-์งํฉ ๊ด๊ณ์ ๊ณ์ธต๋๋ฅผ ํํํด์ผ ํ ๋
๋ณตํฉ ๊ฐ์ฒด์ ๋จ์ผ ๊ฐ์ฒด ๊ฐ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ฐจ์ด๋ฅผ ๋๊ณ ์ถ์ง ์์ ๋
๊ณ์ธต๊ด๊ณ์ ์์๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ํ์๊ฐ ์์ ๋
- 153 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() ํธ์ถ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
3.2 Proxy ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 156 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด(1/6)
Problem ์ ์
ํ๋ฆฐํฐ ๊ด๋ฆฌ ์๋ฃจ์ ์ ๊ฐ๋ฐํ๋ A์จ๋ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ํ๋ฆฐํฐ ๊ด๋ฆฌ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ์๋ค. ํ๋ฆฐํธ ๊ด๋ฆฌ์๋ ํ๋ฆฐํฐ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ฆฐํธ๋ฅผ ๋ด๋นํ๋Printer ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์๊ฐ์ด ๋ง์ ๊ณ ๋ฏผ์ด๋ค. Printable ์ธํฐํ์ด์ค๋ ํ์ค์ด๋ฉฐPrinter ๊ฐ์ฒด๋ ๋ ์ด์ ์์ ํ ์ ์๋ค. ๋ํ ๋ณดํต์ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ๊ธฐ๋ณธ ํ๋ฆฐํฐ๋ง์ฌ์ฉํ๋ค. ์ฑ๋ฅํฅ์ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
- 157 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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(" ์๋ฃ.");
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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];
}
...
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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");
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด(6/6)
Main ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 162 -
20์ด ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
๋ฌธ์ ๊ฐ ๋๋ ์ง์ ์ฐพ๊ธฐ
โข ์ ์ฒด ํด๋์ค๋ค ์ค ์ฑ๋ฅ์ด ์ข์ง ์์ ๋ถ๋ถ์ ์๋ณํ๋ค.
โข ๋ฌธ์ ๊ฐ ๋๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค์ ํจํด์ ๋ถ์ํ๋ค.
์ง์ฐ ๋ก๋ฉ (Lazy Loading)
โข ๋ฌธ์ ๊ฐ ๋๋ ์ฝ๋๋ฅผ ์ต๋ํ ์ง์ฐํด์(ํ์ํ ๋) ์คํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋๋ค.
โข ๋ฌธ์ ํด๊ฒฐ ํ ๋ช ๊ฐ์ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์๋์ง ์์ ์๋ ์ฌ๋๊ณผ ๋น๊ต ํ ์ํ์์ค.
์ ํ ์ฌํญ
โข Printable ์ธํฐํ์ด์ค๋ ์ฐ์ ํ์ค์ด๋ผ ๋ฐ๊ฟ ์ ์๋ค.
โข Print ๊ฐ์ฒด๋ ์ถฉ๋ถํ ํ๋ ๋์ด ๋ ์ด์ ๋ฐ๊ฟ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
โข ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋๋ผ๋ ํด๋ผ์ด์ธํธ(Main) ํด๋์ค์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํ ํ๋ผ.
- 163 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํ
- 164 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Proxy ํจํด(1/14)
์๋
๋ค๋ฅธ ๊ฐ์ฒด์ ์ ๊ทผํ๊ธฐ ์ํด ์ค๊ฐ ๋๋ฆฌ ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ
๋๊ธฐ
Problem์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Proxy ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ๋ฌธ์ ๊ฐ ๋๋ ์ง์ ์ฐพ๊ธฐ
โข ์ง์ฐ ๋ก๋ฉ (Lazy Loading)
โข ์ํฅ๋ ์ต์ํ
- 165 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ๊ฐ์ฒด์ ์์ฑ์ด ๋ถ๊ฐํผํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Proxy ํจํด(5/14)
๋์ ๋ฐฉ๋ฒ
- 169 -
: Main :PrinterManager :PrinterProxy :Printer
์์ฑ
PrinterProxy ์์ฑ
์ค์ ํ๋ฆฐํฐ ํ๋
์์ฑ
ํ๋ฆฐํฐ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
๊ธฐ๋ณธ ํ๋ฆฐํฐ ์ค์ ๋๋ ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
์ถ๋ ฅ
PrinterProxy ๋ชฉ๋ก ๋ฐํ
์ถ๋ ฅ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Proxy ํจํด(6/14)
Main ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 170 -
ํ์ํ ์์ ์ ํ๋ฒ๋ง ์์ฑ
5์ด ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
์ด๋ค Printer๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ ์ ์๋๊ตฌ๋ถ์๊ฐ ํ์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ํด๋์ค๋ ์์ฑํ์ง ์๋๋ค
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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("๊ด๋ฆฌ๋ถ")))
};
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Proxy ํจํด(12/14)
์ ์ฉ
์๊ฒฉ ํธ์ถ์ด ํ์ํ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์๊ฒฉ Proxy๋ฅผ ํตํด ํธ์ถ (์: RMI)
์์ฒญ์ด ์์ ๊ฒฝ์ฐ์๋ง ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์์ ๊ฒฝ์ฐ(์ฑ๋ฅ์ด ๋จ์ด์ง๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ฑฐ๋)
์๋ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ ๊ฒฝ์ฐ ๋ณดํธ์ฉ Proxy๋ฅผ ์ฌ์ฉ
- 176 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Proxy ํจํด(13/14)
๊ตฌ์กฐ
- 177 -
Subject
+ request()
...
RealSubject
+ request()
...
Proxy- realSubject
1
Client
+ request()
...
...
realSubject.request();
...
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Proxy ํจํด(14/14)
Sequence
- 178 -
: Client :Proxy :RealSubject
Request to Proxy
Request to Real Subject
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
3.3 Bridge ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 179 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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|
+--------------------------------------+
ํ์ฌ๋ชจ์ต
์๊ตฌ์ฌํญ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด(2/7)
ํ์ฌ Model๋ค์ํ ์์์ ์ง์ํ๊ธฐ ์ํ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ธ์ ๋ง๋ค์๋ค.Formatter ํด๋์ค์ Header, Body, Tail ์์ผ๋ก ์ฃผ์๋ฅผ ์ถ๋ ฅํ๋ค.์๋ก์ด ์์์ ๋ง๋ค๊ธฐ ์ํด์๋ Formatter๋ฅผ ์์ํ๋ฉด ๋๋ค.
- 181 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() {
...
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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>");
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ ์ดํด(7/7)
Main ํด๋์ค ์ํ ๊ฒฐ๊ณผ
- 186 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
์์์ ํตํ ๊ธฐ๋ฅ ์ถ๊ฐ ํ๊ธฐ
โข ๋ชจ๋ Formatter๊ฐ ๋์ผํ๊ฒ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ์๋ ๋ฐฉ๋ฒ์ ์์์ ํตํด ํ์ด ๋ณด์์ค.
โข ์ด๋ ํด๋์ค์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด์ผ ํ๋์ง ๋ชจ๋ธ์ ํํํ๊ณ ๊ตฌํํ์์ค.
ํ์ฅ ์ค๋น ํ๊ธฐ
โข ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋ ๋ง๋ค ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ ํ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ ํ ์ํ์์ค.
โข ๊ธฐ์กด ํด๋์ค๋ฅผ ์์ ํ์ง ์๊ณ ์์์ ์ด์ฉํ์ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์์ค.
โข ํ์ฌ ์ํ์์ ์์์ ํตํด ํ์ฅํ ๊ฒฝ์ฐ ๋ฌธ์ ์ ์ ํ ์ํ์์ค.
์์์ ๋ ๊ฐ์ง ์ฉ๋
โข ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒฝ์ฐ ์์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ?
โข ์์ ํด๋์ค์ ์ ์๋ ๊ธฐ๋ฅ์ ์๋ก์ด ๊ตฌํ์ ์ถ๊ฐํ ๋ ์์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ?
- 187 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํ
- 188 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Bridge ํจํด(1/9)
์๋
์ถ์ํ์ ๊ตฌํ์ ๊ฐ๋ ์ ๋ถ๋ฆฌ
๊ตฌํ ์์ฒด๋ ํ๋์ ์ถ์ํ ๊ฐ๋ ์ผ๋ก ๋ค์ํ ๋ณํ์ด ๊ฐ๋ฅ
๊ตฌํ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์ธํฐํ์ด์ค๋ ๋ค์ํจ์ ๊ฐ์ง ์ ์์
๋๊ธฐ
Problem์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Bridge ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ์์์ ํตํ ๊ธฐ๋ฅ ์ถ๊ฐ์ ๋ฌธ์ ์
โข ์์ธก์ด ์ด๋ ค์ด ๊ธฐ๋ฅ ํ์ฅ ์ ๋ฌธ์ ์
โข ์ถ์ํ์ ๊ตฌํ์ ๋ถ๋ฆฌ
- 189 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
์ฃผ์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ถ๋ ฅํ๋ ๋ฉ์๋ ๊ตฌํ์ ์์ ํด๋์ค์ ์ถ๊ฐํ๋ค. ๋ชจ๋ ํ์ ํด๋์ค๋ ์ด ๊ตฌํ์ ์์๋ฐ์๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
์ค๋ณต์ด ๋ฐ์ํจ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ธฐ๋ฅ์ ์ํ ํด๋์ค ๊ณ์ธต ๊ตฌํ์ ์ํ ํด๋์ค ๊ณ์ธต
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Bridge ํจํด(6/9)
Main ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 194 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด ์๊ฐ โ Bridge ํจํด(8/9)
์ ์ฉ
์ถ์ํ ๊ฐ๋ ๊ณผ ์ด์ ๋ํ ๊ตฌํ ๊ฐ์ ์ข ์์ฑ์ ์์ ๊ณ ์ถ์ ๋
์ถ์ํ ๊ฐ๋ ๊ณผ ๊ตฌํ ๋ชจ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์์์ ์ํด ํ์ฅ์ด ๊ฐ๋ฅํ ๋
์ถ์ํ ๊ฐ๋ ์ ๋ํ ๊ตฌํ ๋ด์ฉ ๋ณ๊ฒฝ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ํฅ์ ์ฃผ์ง ์์
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๊ตฌํ์ ์๋ฒฝํ๊ฒ ์๋ํ๊ธธ ์ํ ๋
โข ์์ค๋ฅผ ๋ณด๋๋ผ๋ ๊ตฌํ์ ๋ถ๋ฆฌ๋์ด ๋ณผ ์ ์์
ํด๋์ค์ ์๊ฐ ๊ธ์ฆํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ ํ ๋
โข ํด๋์ค ๊ณ์ธต ์์ ๋ณํ๋ก ์ฌ๋ฌ ๊ฐ์ ํด๋์ค๋ฅผ ์ ์ํด์ผ ํ๋ ์ํฉ (์ค์ฒฉ๋ ์ผ๋ฐํ)
์ฌ๋ฌ ๊ฐ์ฒด๋ค์ ๊ฑธ์ณ ๊ตฌํ์ ๊ณต์ ํ๊ณ ์ ํ ๋
- 196 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
3.4 ๊ธฐํ ๊ตฌ์กฐ ํจํด
Decorator ํจํด
Adaptor ํจํด
Facade ํจํด
Flyweight ํจํด
- 198 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Decorator ํจํด(1/5)
์๋
๊ฐ์ฒด์ ๋์ ์ผ๋ก ์๋ก์ด ์๋น์ค๋ฅผ ์ถ๊ฐ
๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ์ํด ์๋ธํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ ๋ณด๋ค ์ตํต์ฑ์ด ์์
๋๊ธฐ
๋จ์ํ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ์ธ๊ฐ์ ์ ๊พธ๋ฏธ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ
๊ธฐ์กด์ ํด๋์ค๋ฅผ ์์ํ๊ธฐ ๊ณค๋ํจ
ํด๋ผ์ด์ธํธ๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋๋ผ๋ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฃฐ ์ ์์ด์ผ ํจ
- 199 -
์๋ ํ์ธ์.
+---------+
| |
+---------+
+
+---------------+
| * ์๋ ํ์ธ์. * |
+---------------+
* * * ์๋ ํ์ธ์. * +
์์ชฝ ์ฅ์
์ฃผ๋ณ ์ฅ์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Decorator ํจํด(4/5)
์ ์ฉ
๋์ ์ผ๋ก ํฌ๋ช ํ๊ฒ ๊ฐ์ฒด์ ์๋ก์ด ์๋น์ค๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์ ๋์ด ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ด๋ ํ ์ํฅ๋ ์ฃผ์ง ์์์ผ ํจ
์ ๊ฑฐ๋ ์ ์๋ ์๋น์ค ์ผ ๋
์์์ผ๋ก ์๋น์ค๋ฅผ ํ์ฅํ ๊ฒฝ์ฐ ์๋ธํด๋์ค์ ์๊ฐ ๋๋ฌด ๋ง์์ ธ์ ๊ณค๋ํ ๋
- 202 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
...
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Adapter ํจํด(1/6)
์๋
ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ํํ์ ์ธํฐํ์ด์ค๋ก ๋ณํ
์๋ก ์ผ์นํ์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐ๊ฒฐํจ
๋๊ธฐ
๋ค๋ฅธ ๋ง๋ก Wrapper๋ผ๊ณ ๋ ํจ
์๋์ ๊ฐ์ด ์ํ๋ ๊ธฐ๋ฅ์ ์์ผ๋ ์ธํฐํ์ด์ค๊ฐ ๋ง์ง ์์ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํจ
- 204 -
ํ์๋ง
๊ดํธ๋ก ๋ณด์ฌ์ฃผ๊ธฐ
๋ณํ๋ก ๋ณด์ฌ์ฃผ๊ธฐ
์ฝํ๊ฒ ์ถ๋ ฅํ๊ธฐ
๊ฐ์กฐํ์ฌ์ถ๋ ฅํ๊ธฐ ์ถ๋ ฅ ์ธํฐํ์ด์ค๋ด ํ๋ก๊ทธ๋จ
X
X(๋์์ธํจํด ์คํ)
*๋์์ธํจํด ์คํ*
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Adapter ํจํด(2/6)
๋๊ธฐ
์์์ ์ด์ฉํ ๋ฐฉ๋ฒ
- 205 -
<<interface>>
+ 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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Adapter ํจํด(3/6)
๋๊ธฐ
์์์ ์ด์ฉํ ๋ฐฉ๋ฒ
- 206 -
<<interface>>
+ 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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Adapter ํจํด(4/6)
๋๊ธฐ
- 207 -
: Main :PrintBanner :Banner
์ฝํ๊ฒ ์ถ๋ ฅํ๊ธฐ
๊ดํธ๋ก ๋ณด์ฌ์ฃผ๊ธฐ
๊ฐ์กฐํ์ฌ์ถ๋ ฅํ๊ธฐ
๋ณํ๋ก ๋ณด์ฌ์ฃผ๊ธฐ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Adapter ํจํด(5/6)
์ ์ฉ
๊ธฐ์กด์ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ธํฐํ์ด์ค๊ฐ ์์ ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ
๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๊ฐ ๋ง์ง ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ ๊ฒฝ์ฐ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ ์ด ๋ถ๊ฐํ ๊ฒฝ์ฐ
- 208 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
์์์ ์ด์ฉํ ๋ฐฉ๋ฒ ์์์ ์ด์ฉํ ๋ฐฉ๋ฒ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Faรงade ํจํด(1/5)
์๋
์๋ธ์์คํ ์ ์ด๋ฃจ๋ ๋ค์ ๊ฐ์ฒด๋ค์ ์ธํฐํ์ด์ค ์งํฉ์ ๋ํด ์ผ๊ด๋ ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต
๋ณต์กํ ๋ด์ฉ์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ํ๋์ ์ฐฝ๊ตฌ(์ธํฐํ์ด์ค)๋ก ์ฝ๊ฒ ์ฌ์ฉ
๋๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค, HTML ์์ฑ๊ธฐ, ์ ์๋ฉ์ผ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์ผ์ ๋ณด๋ด๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ ์ ํจ.
Client ํ๋ก๊ทธ๋จ ์์ฑ์๋ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฆ
- 210 -
๋ฉ์ผ ์ ์กํ๋ก๊ทธ๋จ
๋ฐ์ดํฐ๋ฒ ์ด์ค HTML ์์ฑ๊ธฐ ์ ์๋ฉ์ผ์๋ฒ
JDBC
๋์คํฌ
๋ฉ์์ง์๋ฒ
XML ํ์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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๋ก ๋ฉ์ผ์ ์ ์กํ๋ ๋ก์ง์ ์ํํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Faรงade ํจํด(3/5)
๋๊ธฐ
- 212 -
: Main :PageMaker : Database
๋ฉ์ผ์ ์ก๋ฐ ๊ฒฐ๊ณผ ๋ณด์ฌ์ฃผ๊ธฐ
๋ฉ์ผ ์ ๋ณด ์กฐํ
: HtmlGenerator :MailServer
๋ฉ์ผ ๋ด์ฉ ๋ง๋ค๊ธฐ
๋ฉ์ผ ์ ์ก
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Faรงade ํจํด(4/5)
์ ์ฉ
๋ณต์กํ ์๋ธ์์คํ ์ ๋ํ ๋จ์ํ ์ธํฐํ์ด์ค ์ ๊ณต์ด ํ์ํ ๋
โข ์์คํ ์ด ๋ฐ์ ํ๋ฉด ์ฌ์ฌ์ฉ์ ์ํด ํด๋์ค๊ฐ ์์์ง๊ฑฐ๋ ๋ง์์ง
โข ์๋ธ ์์คํ ์ด ๋ณต์กํด์ง๋ฉด ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ์ถฉ๋ถํ ์ดํดํ์ง ๋ชปํ ์ ์์
ํด๋ผ์ด์ธํธ์ ๊ตฌํ ํด๋์ค ๊ฐ์ ๋๋ฌด ๋ง์ ์ข ์์ฑ์ด ์กด์ฌํ ๋
โข Faรงade๋ฅผ ์ฌ์ฉํจ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ธ์์คํ ๊ฐ์ ๊ฒฐํฉ์ ์ค์
โข ์๋ธ ์์คํ ๋ณ๊ฒฝ ์ Faรงade ๋ง ์ํฅ์ ๋ฐ์
์๋ธ์์คํ ๋ค์ ๊ณ์ธตํ๋ฅผ ์ด๋ฃจ๊ณ ์ ํ ๋ (Layered)
โข Faรงade๋ ๊ณ์ธต๋ณ ์ ๊ทผ์ ์ ์ ๊ณต
โข ๊ณ์ธต๊ฐ ์ข ์์ฑ์ ์ค์ผ ์ ์์
โข ์๋ธ์์คํ ์ ๋ด๋ถ ์ค๊ณ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์์คํ ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์ด๋ฃจ์ด ์ง ์ ์์
- 213 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Faรงade ํจํด(5/5)
๊ตฌ์กฐ
- 214 -
Faรงade
์๋ธ์์คํ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Flyweight ํจํด(1/7)
์๋
๋๊ท๋ชจ์ ์์ ๊ฐ์ฒด๋ค์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๊ณต์ ํจ
์์ ๊ฐ์ฒด๋ค๋ ๋๊ท๋ชจ์ผ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์
๋๊ธฐ
๊ธ์์ ํฐํธ์ ์ ๋ณด๋ฅผ ๊ฐ์ง ๋ค์ ๋ฌด๊ฑฐ์ด ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์ถ๋ ฅ ์์คํ ์ ๋ง๋ค๊ณ ์ ํจ
๊ฐ ๊ธ์๋ ์์ฉ๋ ฅ์ ๋์ด๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ
์์ ๋ฉ๋ชจ๋ฆฌ์ ์์คํ ์์๋ ์ํํ๊ฒ ๋์ํ๊ธฐ ์ํจ
- 215 -
0 1 9 - 9 1 8 9 ...
๊ฐ ๊ธ์๋ ์์ฉ๋ ฅ์ ๋์ด๊ธฐ ์ํด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ์ฌ์ฉํจ
๊ฐ์ฒด ํ๋๊ฐ 100 byte๋ก ๊ฐ์ ํ ๋ 1,000๊ฐ์๋ฌธ์๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ 100 Kbyte๊ฐ ํ์ํจ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ๊ฐ์ฒด๋ ๋ฌธ์์ ๋ณธ์ง์ ์ธํน์ฑ์ธ ํฐํธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Flyweight ํจํด(3/7)
๋๊ธฐ
- 217 -
: Main :BigString : BigCharFactory
์์ฑ
BigChar ๊ฐ์ฒด ์์ฒญ
: BigChar
pool ๊ฒ์ฌ
์์ ๊ฒฝ์ฐ ์์ฑ
๊ณต์ BigChar ๊ฐ์ฒด ๋ฐํ
์ถ๋ ฅ
๋ชจ๋ BigChar ์ถ๋ ฅ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Flyweight ํจํด(5/7)
์ ์ฉ
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํ ๋
๊ฐ์ฒด ์๊ฐ ๋๋ฌด ๋ง์์ ์ ์ฅ ๋น์ฉ์ด ๋๋ฌด ๋์์ง ๋
๋๋ถ๋ถ์ ๊ฐ์ฒด ์ํ๋ฅผ ๋ถ๊ฐ์ ์ธ ๊ฒ์ผ๋ก ๋ง๋ค ์ ์์ ๋
์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ์ฒด ์๋ณ์์ ๋น์ค์ ๋์ง ์๋ ๊ฒฝ์ฐ
โข ๊ฐ์ฒด ์๋ณ์๋ฅผ ์ทจ๊ธํ ๊ฒฝ์ฐ ๊ณต์ ํ ์ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก Flyweight๋ฅผ ์ ์ฉํ์ง ๋ชปํจ
๊ณ ๋ ค์ฌํญ
๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ผ ํ๋ฏ๋ก ๊ณต์ ํ๋ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ์ ๊ฒฝ ์จ์ผ ํจ
โข ์ฌ์ด ํจํด์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก immutable ๊ฐ์ฒด๋ก ๋ง๋ฆ
๊ณต์ ํ ์ ๋ณด์ ๊ณต์ ํ์ง ๋ง์์ผ ํ ์ ๋ณด๋ฅผ ๋ช ํํ ๊ตฌ๋ถ
โข ๋ณธ์ง์ ์ ๋ณด : ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ณณ์์ ๋์ผํ ๊ฐ์ฒด์ ๋ณธ์ง์ ์ธ ์ ๋ณด (๊ณต์ )
โข ๋ถ๊ฐ์ ์ ๋ณด : ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋๋ context์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ ์ ๋ณด (๊ณต์ ๋ชปํจ)
- 219 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Flyweight ํจํด(7/7)
๊ตฌ์กฐ
๊ฐ์ฒด ๊ณต์ ๋ฐฉ๋ฒ
- 221 -
aFlyweightFactory
flyweights
aConcreteFlyweight
intrinsic State
aConcreteFlyweight
intrinsic State
aClient aClient
flyweight
pool
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
4. GoF ํ์ ํจํด
4.1 Chain of Responsibility ํจํด
4.2 Strategy ํจํด
4.3 Template Method ํจํด
4.4 ๊ธฐํ ์์ฑ ํจํด ์๊ฐ
- 223 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋ค์ด๊ฐ๊ธฐ ์ ์...
๊ฐ์ ๊ตฌ์ฑ
Problem ์ ์
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
์๋ฃจ์ ๋ฐํ
ํจํด ๊ฐ์
โข Problem ํด๊ฒฐ์ ์ ์ฉํ ํจํด ์๊ฐ
โข ๋ชจ๋ธ ๋ฐ ์์ค ๊ฒํ
โข ๋์ผ ๋ฒ์ฃผ๋ด ๋ค๋ฅธ ํจํด๋ค ๊ฐ๋ต ์๊ฐ
- 224 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
๋ค์ด๊ฐ๊ธฐ ์ ์...
์ค์ต ์ฐธ์กฐ
IDE Tool : Eclipse
Java ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฐ ํจํค์ง ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
- 225 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
4.1 Chain of Responsibility ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 226 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(1/5)
Problem ์ ์
์์ ํ๋ ์ค ๊ณ ๊ฐ์ ๋ถ๋ง์ฌํญ์ ์ ์ ๋ฐ์ A์จ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์์คํ ์ ํ์์ฑ์ ๋๋ผ๊ฒ ๋์๋ค. A์จ๋ ์ฌ๋ฌ ์ํฉ์ ๋ง๋ ์ ์ ํ ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ๋ฅผ ์์คํ ๊ฐ๋ฐ์์๊ฒ ์๊ตฌํ๊ณ ์๋์ ๊ฐ์ด ๋์์ธ๋ ์์คํ ์ด ๊ฐ๋ฐ๋์๋ค.
- 227 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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; }
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(5/5)
Client ์คํ ๊ฒฐ๊ณผ
- 231 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
์ฑ ์ ํ ๋น (Assigning responsibilities to Object)
โข ๊ณ ๊ฐ์ ๋ถ๋ง์ฌํญ์ ๋ํ ์ ํ์ด ๋์ด๋ ์๋ก ํน์ ํด๋์ค์ ๋ง์ ์ฑ ์์ด ์ง์ค๋์ด ์ง๋ค. ์ฑ ์์ด ์ง์ค๋๋ ํด๋์ค๋ ์ด๋ค ํด๋์ค์ธ๊ฐ?
โข ๋ํ, ์ง์ค๋ ์ฑ ์์ ๋ถ๋ฆฌํ์ฌ ์ ๋นํ ์์ค์ผ๋ก ํ ๋นํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ๋ค์ด์ด๊ทธ๋จ์ผ๋กํํํ์์ค.
โข ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์ ์ฉํ ๋ถ๋ฆฌ๋ ์ฑ ์์ด ์ ๋๋ก ๋์ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์์ค.
ํ์์ ๊ฒฐํฉ๋ ๊ฐ์(Reduce behavioral coupling)
โข ํ์์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ์์ฒญ์ ์ฒ๋ฆฌํ๋์ง ์ ํ์๊ฐ ์๋ค. ๊ฒฐํฉ๋๋ฅผ ๊ฐ์์ํฌ ๋ถ๋ถ์ ์ฐพ์ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ์์ค.
โข ์์ ์ ๋ค์ด์ด๊ทธ๋จ์ ์์ ์๋ ์ฌ๋๊ณผ ๋น๊ต ํ ์ํ๊ณ ๊ตฌํํ์์ค.
- 232 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํ
- 233 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Chain of Responsibility ํจํด(1/9)
์๋
๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๊ฐ์ฒด์ ์ด๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ์์ ๊ธฐ ์ํด
ํ๋์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋ฐ๋์ ํ ๊ฐ์ฒด์์๋ง ์ด๋ฃจ์ด์ง์ง ์๊ณ , ์ฌ๋ฌ ๊ฐ์ฒด์๊ฒ ๊ทธ์ฒ๋ฆฌ์ ๊ธฐํ๋ฅผ ์ฃผ๋ ค๋ ๊ฒ
์ฆ, ์ด ํจํด์์๋ ํ๋์ ์๋น์ค ์ฒ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ฐ์ฒด์ ๋๋ ์ ์๋๋ก ํจ
๋ฉ์์ง๋ฅผ ์์ ํ์ฌ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ ๊ฐ์ฒด๋ค์ ํ๋์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ก ๋ง๋ค๊ณ , ์ค์ ๋ก ์์ฒญ์์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋๊น์ง ๊ณ์ํด์ ์์ฒญ์ ์ ๋ฌ
๋๊ธฐ
Problem์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Chain of Responsibility ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ์ฑ ์ ํ ๋น (Assigning responsibilities to Object)
โข ํ์์ ๊ฒฐํฉ๋ ๊ฐ์(Reduce behavioral coupling)
- 234 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ~๋ฌธ์ ์ ๊ฑฐํ์โฆ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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์์๋ ๋ถ๋ง์ฌํญ ์ฒ๋ฆฌ๋ฅผ ์ํด ํญ์ ๋์ผํ ์ธํฐํ์ด์ค๋ง์ ๋ฐ๋ผ๋ณผ ์ ์๋ค. ๋์จํ ๊ฒฐํฉ์ ์ํด์ ํ์์ ๋ํ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณด์.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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>>
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Chain of Responsibility ํจํด(7/9)
์ ์ฉ
ํ๋ ์ด์์ ๊ฐ์ฒด๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ, ํธ๋ค๋ฌ๋ ๋๊ฐ ์ ํ์์ธ์ง๋ฅผ ๋ชจ๋ฅผ ๋, ํธ๋ค๋ฌ๋ ์๋์ผ๋ก ๊ฒฐ์ ํด์ผ ํจ.
๋ฉ์์ง๋ฅผ ๋ฐ์ ๊ฐ์ฒด๋ฅผ ๋ช ์ํ์ง ์์ ์ฑ ์ฌ๋ฌ ๊ฐ์ฒด ์ค ํ๋์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๊ณ ์ถ์๋
์์ฒญ์ ์ฒ๋ฆฌํ ๊ฐ์ฒด ์งํฉ์ ๋์ ์ผ๋ก ์ ์ํ๊ณ ์ ํ ๋
- 240 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Chain of Responsibility ํจํด(9/9)
Sequence
- 242 -
: Client : ConcreteHandler1 : ConcreteHandler2
handleRequest() : void
handleRequest() : void
handleRequest() : void
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
4.2 Strategy ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 243 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(1/7)
- 244 -
Problem ์ ์
๋ฌด์ญํ์ฌ์์ ํด์ธ ์์ ์ ๋ด๋นํ๊ณ ์๋ A์จ๋ ์ฃผ๋ฌธ๊ด๋ฆฌ ์์คํ ์ด ํ์ํจ์ ๋๊ผ๋ค. ์ฌ๋ฌ ๊ตญ๊ฐ์์ ์ ํ์ ๋ํด ์ฃผ๋ฌธ์ ํ๋ฉด ํด๋น ๊ตญ๊ฐ์ ๊ด์ธ์ ํ์จ์ ์ ์ฉํ์ฌ ๊ฐ๊ฒฉ์ ๊ณ์ฐํด ์ฃผ๋ ๊ฒ์ด ํ์ํ์ฌ ์์คํ ๊ฐ๋ฐ์์๊ฒ ํ์ํ ๋ด์ฉ์ ์๊ตฌํ์ฌ ์๋์๊ฐ์ด ๋์์ธ๋ ์์คํ ์ด ๊ฐ๋ฐ๋์๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()));
...
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(7/7)
TaskController ์คํ ๊ฒฐ๊ณผ
- 250 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
Is-A ์ Has-A ๊ด๊ณ
โข ํด์ธ ์์ ๋ง์ด ๋์ด์ง๋ฉด์ ์๊ตญ๊ณผ ํ๋์ค๊ฐ ์ฃผ๋ฌธ์ ํ๊ธฐ ์์ํ๋ค. ์ด๋ค์ ๊ด๊ณ๋ฅผ ๋ค์ด์ด๊ทธ๋จ์ ์ถ๊ฐํ์ฌ ํํํ์์ค.
โข ์ถ๊ฐ๋ ๋ค์ด์ด๊ทธ๋จ์ ๊ธฐ์ค์ผ๋ก ๊ตฌํํ๊ณ ์ ๋๋ก ๋์ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์์ค.
ํ์ ๋ฐ ์๊ณ ๋ฆฌ์ฆ๊ตฐ ํ์ฑ
โข ์์์ ํตํด์ ๊ตฌํํ ๊ฒฝ์ฐ ๋ํ๋๋ ๋ฌธ์ ์ ์ ํ์ ํ๊ณ ์์์ด ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ ๋ฐ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฆฌํ์ฌ ๊ตฌํํ๋๋ก ํ๋ค.
โข ์์์ ํตํ ๊ตฌํ๊ณผ ํ์ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฆฌํด์ ๊ตฌํํ์ ๋์ ์ฐจ์ด์ ์ ๋น๊ตํด ๋ณด์๋ผ.
- 251 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํ
- 252 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Strategy ํจํด(1/9)
์๋
๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด ์กด์ฌํ๋ฉด ์ด๋ค ๊ฐ๊ฐ์ ํ๋์ ํด๋์ค๋ก ์บก์ํํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋์ฒด๊ฐ ๊ฐ๋ฅํ๋๋ก ํจ
Strategy ํจํด์ ์ด์ฉํ๋ฉด ํด๋ผ์ด์ธํธ์ ๋ ๋ฆฝ์ ์ธ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ณํ
์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๊พธ๋๋ผ๋ ํด๋ผ์ด์ธํธ๋ ์๋ฌด๋ฐ ๋ณ๊ฒฝ์ ํ ํ์๊ฐ ์์
๋๊ธฐ
Problem์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Strategy ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข Is-A ์ Has-A ๊ด๊ณ
โข ํ์ ๋ฐ ์๊ณ ๋ฆฌ์ฆ๊ตฐ ํ์ฑ
- 253 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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ํด๋์ค๋ฅผ ์์๋ฐ์ ํ์ํด๋์ค๋ ๊ณ์ํด์ ์ฆ๊ฐํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ๋ณ๊ฒฝํ์ฌ ํ์ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฉ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Strategy ํจํด(7/9)
์ ์ฉ
ํ์๋ค์ด ์กฐ๊ธ์ฉ ๋ค๋ฅผ ๋ฟ ๊ฐ๋ ์ ์ผ๋ก ๊ด๋ จ๋ ๋ง์ ํด๋์ค๋ค์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๊ฐ๊ฐ์์๋ก ๋ค๋ฅธ ํ์ ๋ณ๋ก ํด๋์ค๋ฅผ ์์ฑ
โข ์ฆ, ๊ฐ๋ ์ ํด๋นํ๋ ํด๋์ค๋ ํ๋๋ง ์ ์
โข ์๋ก ๋ค๋ฅธ ํ์๋ค์ ๋ณ๋์ ํด๋์ค๋ก ๋ง๋ฆ
์๊ณ ๋ฆฌ์ฆ์ ๋ณํ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์
โข ๊ธฐ์ต ๊ณต๊ฐ๊ณผ ์ฒ๋ฆฌ ์๋ ๊ฐ์ ์ ์ถฉ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์์
โข Strategy๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ฅผ ํด๋์คํํ๊ณ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ด๊ณ๋ก ์ ์
์ฌ์ฉ์๊ฐ ๋ชจ๋ฅด๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์์ ๋๋ ํ์
โข ์ฌ์ฉ์๊ฐ ๋ชฐ๋ผ๋ ๋๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ Strategy ํด๋์ค์๋ง ๋๋๋ก ํจ
๋ง์ ํ์๋ฅผ ์ ์ํ๊ธฐ ์ํด ํด๋์ค ์์ ๋ณต์กํ ๋ค์ค ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ฐ ์ ํ๋ฌธ๋ณด๋ค๋ Strategy ํด๋์ค๋ก ๋ง๋๋ ๊ฒ์ด ๋ฐ๋์งํจ
- 259 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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)
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
4.3 Template Method ํจํด
์ํฉ์ดํด
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ๋ฐํ
ํจํด ์๊ฐ
- 262 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(1/6)
Problem ์ ์
์ํ๊ธฐ ์ฌ์ ์ ์๋ก ์์ํ A์จ๋ ์ปคํผ์ ๋ ๋ชฌ์ฐจ๋ฅผ ํ๋งคํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ์ด๋ฅผ ์ ์ดํ ์ํ๊ธฐ ์ ์ด ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋๋ก ์์คํ ๊ฐ๋ฐ์์๊ฒ ์๊ตฌํ๊ณ ์๋์ ๊ฐ์ด ์์คํ ์ด ๊ฐ๋ฐ๋์๋ค.
- 263 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(2/6)
Coffee & Tea ์กฐ๋ฆฌ ๋งค๋ด์ผ
Coffee ์กฐ๋ฆฌ๋ฒ
โข ๋ฌผ์ ๋์ธ๋ค.
โข ๋์ธ ๋ฌผ์ ์ปคํผ๋ฅผ ๋ฃ๋๋ค.
โข ์ปต์ ์ปคํผ๋ฅผ ๋ถ๋๋ค.
โข ์คํ ๋ฐ ์ฐ์ ๋ฅผ ์ถ๊ฐํ๋ค.
Tea ์กฐ๋ฆฌ๋ฒ
โข ๋ฌผ์ ๋์ธ๋ค.
โข ๋์ธ ๋ฌผ์ Tea๋ฅผ ์ฐ๋ ค๋ธ๋ค.
โข ์ปต์ Tea๋ฅผ ๋ถ๋๋ค.
โข ๋ ๋ชฌ์ ์ถ๊ฐํ๋ค.
- 264 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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...");
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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...");
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ํฉ์ดํด(6/6)
Client ํด๋์ค ์คํ ๊ฒฐ๊ณผ
- 268 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ์ฐพ๊ธฐ
์๋ฃจ์ ์ฐพ๊ธฐ (๋ฌธ์ ํด๊ฒฐ ์ค์ต)
์ถ์ํ ๋๋ ์ผ๋ฐํ ํ๊ธฐ
โข ์ปคํผ์ ๋ ๋ชฌ์ฐจ๋ฅผ ์กฐ๋ฆฌํ๋ ์กฐ๋ฆฌ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ถ์ํ ํ ์ ์๋ ๋ถ๋ถ์ ์ฐพ์ ์ด๋ค์ ๊ด๊ณ๋ฅผ๋ค์ด์ด๊ทธ๋จ์ ํํํ์์ค.
โข ํํ๋ ๋ค์ด์ด๊ทธ๋จ์ ๊ธฐ์ค์ผ๋ก ๊ตฌํํ๊ณ ์ ๋๋ก ๋์ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์์ค.
์๊ณ ๋ฆฌ์ฆ ์บก์ํ ํ๊ธฐ
โข ์ปคํผ์ ๋ ๋ชฌ์ฐจ์ ์กฐ๋ฆฌ๋ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ๋จ๊ณ๋ฅผ ์ ์ํ๊ณ ํ์ ํด๋์ค์์ ํ๋ ๋๋ ๊ทธ ์ด์์ ๋จ๊ณ๋ฅผ ๊ตฌํํ๋๋ก ํ๋ค.
โข ์๊ณ ๋ฆฌ์ฆ ์บก์ํ ํ๊ธฐ ์ด์ ๊ณผ ์ดํ๋ฅผ ๋น๊ตํด ๋ณด์๋ผ.
- 269 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์๋ฃจ์ ๋ฐํ
๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋์์ธํ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ๋ฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐํ
- 270 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Template Method ํจํด(1/9)
์๋
์คํผ๋ ์ด์ ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ์ ์
๊ตฌ์ฒด์ ์ธ ๋จ๊ณ๋ ํ์ํด๋์ค์ ์ ์
Template Method ํด๋์ค์ ํ์ํด๋์ค๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ์ฌ์ ์
๋๊ธฐ
Problem์ ํตํด์ ๋ํ๋ ๋ฌธ์ ์ ์ Template Method ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ์ถ์ํ ๋๋ ์ผ๋ฐํ ํ๊ธฐ
โข ์๊ณ ๋ฆฌ์ฆ ์บก์ํ ํ๊ธฐ (Encapsulating Algorithms)
- 271 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค..
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ํด๋์ค
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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...");
}
์ปคํผํด๋์ค์์ ์ปคํผ๋ฅผ ๋ฃ๊ณ ์คํ๊ณผ ์ฐ์ ๋ฅผ ์ฒจ๊ฐํ๋ ํ์๋ฅผ๊ตฌํํ๋ค.
์ฐจํด๋์ค์์ ์ฐจ๋ฅผ ์ฐ๋ ค๋ด๊ณ ๋ ๋ชฌ์ ์ฒจ๊ฐํ๋ ํ์๋ฅผ ๊ตฌํํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() ๋ฉ์๋๋ํ์ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ ๋ณํ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ตฌํํ ์ ์๋ค. ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ด ์์ผ๋ฏ๋ก ์๊ณ ๋ฆฌ์ฆ ์ํ์ ์ํฅ์ด ์๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ํจํด์์๋ ํ ํ๋ฆฟ
๋ฉ์๋๋ฅผ ํฌํจํ๊ณ ์๋ ์์ํด๋์ค๊ฐ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์ ์ดํ๊ณ ์๊ณ ํ์ํด๋์ค๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๋จ๊ณ๋ฅผ ๊ตฌํํ๊ณ ์์ด ํ ๋ฆฌ์ฐ๋ ์์น์ ์ ์ฉํ ์ข์์์ด๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๊ฒฝํ ๊ฒฐ๊ณผ์ด๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Template Method ํจํด(8/9)
์ ์ฉ
์๊ณ ๋ฆฌ์ฆ์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ ํ ๋ฒ ์ ์ํ๊ณ ๋ค์ํด์ง ์ ์๋ ๋ถ๋ถ์ ํ์ํด๋์ค์์ ์ ์ํ ์ ์๋๋ก ๊ตฌํํ๊ณ ์ ํ ๋
ํ์ํด๋์ค ์ฌ์ด์ ๊ณตํต์ ์ธ ํ์๋ฅผ ์ถ์ถํ์ฌ ํ๋์ ๊ณตํต ํด๋์ค๋ก ์ ์ํ ๋
โข ์ผ๋ฐํ๋ฅผ ์ํ ๋ฆฌํํ ๋ง์ ์๋ผ๊ณ ๋ณผ ์ ์์
โข ๊ธฐ์กด ์ฝ๋์์์ ์ฐจ์ด๋ฅผ ์๋ณํ ํ ์ด๋ฅผ ์๋ก์ด ์คํผ๋ ์ด์ ์ผ๋ก ๊ตฌ๋ณํ ์ ์์
โข ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ๋ถ๋ถ์ ํ ํ๋ฆฟ๋ฉ์๋๋ก ์ ์ํ๊ณ ๋์ค์ ์์๋ฐ์ ํ์ํด๋์ค๊ฐ ์ ์ํ๋ ์คํผ๋ ์ด์ ์ ํธ์ถํ๊ฒ ํจ
ํ์ํด๋์ค ํ์ฅ์ ์ ์ดํ ์ ์์
โข ํ ํ๋ฆฟ ๋ฉ์๋๊ฐ ์ด๋ค ํน์ ํ ์์ ์ ํ (Hook) ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ์ ์
โข ์ค์ ๋ก ์ด ํ (Hook) ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์๊ฐ ์๋ก์ด ํ์ฅ์ด ์ด๋ฃจ์ด์ง
- 278 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํจํด์๊ฐ โ Template Method ํจํด(9/9)
ํด๋์ค ๊ตฌ์กฐ
- 279 -
AbstractClass
+ templateMethod()
+ primitiveOperation1()
+ primitiveOperataon2()
ConcreteClass
+ primitiveOperation1()
+ primitiveOperataon2()
public void templateMethod() {
...
primitiveOperation1();
primitiveOperation2();
...
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
4.4 ๊ธฐํ ์์ฑ ํจํด ์๊ฐ
Command ํจํด
Interpreter ํจํด
Iterator ํจํด
Mediator ํจํด
Memento ํจํด
Observer ํจํด
State ํจํด
Visitor ํจํด
- 280 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Command ํจํด(1/6)
์๋
์์ฒญ ์์ฒด๋ฅผ ๊ฐ์ฒดํํ๋ ๊ฒ
์๋ก ๋ค๋ฅธ ์์ฒญ์ ๊ฐ์ฒดํํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ํ๋ผ๋ฉํฐ๋ก ๋๊ฒจ์ค ์ ์๊ฒ ํจ
๋๊ธฐ
๊ฐ๋จํ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ ์์ ๋ก ๋ง์ฐ์ค๋ฅผ ๋๋ฉด ๋นจ๊ฐ ์ ์ด ์ฐ๊ฒฐ๋์ด ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง
[clear] ๋ฒํผ์ ๋๋ฅด๋ฉด ์ ์ด ๋ชจ๋ ์ง์ ์ง
- 281 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
๊ทธ๋ฆฌ๊ธฐ ํธ์ถ
๊ทธ๋ฆผ๊ทธ๋ฆฌ๊ธฐ ๋ช ๋ น ํด๋์ค
์ฌ๋ฌ ๋ช ๋ น์ ๋ชจ์ ๋ช ๋ น ํด๋์ค
๋ช ๋ นํํ ์ธํฐํ์ด์ค
๋์ํ ์คํธ์ฉ ํด๋์ค
๊ทธ๋ฆฌ๊ธฐ ๋์ ํด๋์ค
๊ทธ๋ฆฌ๊ธฐ ๋์ ์ธํฐํ์ด์ค
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Command ํจํด(4/6)
์ ์ฉ
์ํํ ํ์ ์์ฒด๋ฅผ ๊ฐ์ฒด๋ก ํ๋ผ๋ฉํฐํํ๊ณ ์ ํ ๋ Commandํจํด์ ์ฌ์ฉํ๋ค.
์๋ก ๋ค๋ฅธ ์๊ฐ์ ์์ฒญ์ ๋ช ์ํ๊ณ ์ ์ฅํ๊ณ ์ํํ ์ ์๋ค. Command ๊ฐ์ฒด๋ ์๋์์์ฒญ๊ณผ๋ ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋๋ค.
๋ช ๋ น์ด ๊ฐ์ฒด ์์ฒด์ ์คํ ์ทจ์์ ํ์ํ ์ํ๋ฅผ ์ ์ฅํ ์ ์๋ค.
๋ณ๊ฒฝ ๊ณผ์ ์ ๋ํ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ ๋๋ฉด ์์คํ ์ด ๊ณ ์ฅ ๋ฌ์ ๋ ์์ํ๋ก ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ธฐ๋ณธ์ ์ธ ์คํผ๋ ์ด์ ์ ์กฐํฉ์ผ๋ก ์ข ๋ ๊ณ ๋์ด๋์ ์คํผ๋ ์ด์ ์ ๊ตฌ์ฑํ ์ ์๋ค. ์ ๋ณด์์คํ ์ ์ผ๋ฐ์ ์ธ ํน์ฑ์ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. Command ํจํด์ ์ด๋ฐํธ๋์ญ์ ์ ๋ชจ๋ธ๋ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- 284 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Command ํจํด(5/6)
ํด๋์ค ๊ตฌ์กฐ
- 285 -
Client
<<interface>>
Command
+ execute()
Receiver
+ action()
ConcreteCommand
+ execute()
Invoker
- receiver
creates
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Command ํจํด(6/6)
Sequence
- 286 -
: Client
: ConcreteCommand
: Reciever
// create
execute()
action()
: Invoker
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() ๋ฉ์๋ ๊ตฌํ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Interpreter ํจํด(3/5)
๋ฏธ๋ ์ธ์ด ํ๋ก๊ทธ๋จ ๊ตฌ๋ฌธ ํธ๋ฆฌ
- 289 -
: ProgramNode
: CommandListNode
: RepeatCommandNode
: CommandListNode
go : PrimitiveCommandNode right : PrimitiveCommandNode
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Interpreter ํจํด(4/5)
์ ์ฉ
ํด์์ด ํ์ํ ์ธ์ด๊ฐ ์กด์ฌํ๊ฑฐ๋ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ก ์ธ์ด์ ์ ์๋ ๋ฌธ์ฅ์ ํํํ๊ณ ์ ํ๋ค๋ฉด Interpreter ํจํด์ ์ฌ์ฉ
์ ์ํ ์ธ์ด์ ๋ฌธ๋ฒ์ด ๊ฐ๋จ
โข ๋ฌธ๋ฒ์ด ๋ณต์กํ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ฌธ๋ฒ์ ์ ์ํ๋ ํด๋์ค ๊ณ์ธต๋๊ฐ ๋ณต์กํด์ง๊ณ ๊ด๋ฆฌํ ์ ์์
โข ์ด๋ด ๋๋ Interpreter ํจํด์ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค ํ์ ์์ฑ๊ธฐ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋๋์ ๋ฐฉ๋ฒ
ํจ์จ์ฑ์ ๋ณ๋ก ๊ณ ๋ ค์ฌํญ์ด ๋์ง ์์
โข ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ธํฐํ๋ฆฌํฐ๋ ํ์ค ํธ๋ฆฌ๋ฅผ ์ง์ ํด์ํ๋๋ก ๊ตฌํํ๋ ๋ฐฉ์์ด ์๋๊ณ ํ์ค ํธ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํํ๋ก ๋ณํ์ํค๋ ๊ฒ
โข ์๋ฅผ ๋ค์ด์ ์ ๊ท ํํ์์ ๊ฒฝ์ฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ํ ์ํ ๊ธฐ๊ณ(Finite State Machine) ๊ฐ๋ ์ผ๋ก ๋ณํ
โข ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ ๊ท ํํ์์ ์ ํ ์ํ ๊ธฐ๊ณ๋ก ๋ณํํ๋ ๋ฒ์ญ๊ธฐ๋ฅผ ๊ตฌํํด์ผ ํ๋๋ฐ, Interpreter ํจํด์ ์ฌ์ฉํ ์ ์์
- 290 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Interpreter ํจํด(5/5)
ํด๋์ค ๊ตฌ์กฐ
- 291 -
Client
AbstractExpression
+ interpret(Context)
TerminalExpression
+ interpret(Context)
createsContext
+ getInfoToInterpret()
NonterminalExpression
+ interpret(Context)
uses
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Iterator ํจํด(1/4)
์๋
๋ณตํฉ ๊ฐ์ฒด ์์์ ๋ด๋ถ ํํ ๋ฐฉ์์ ๊ณต๊ฐํ์ง ์๊ณ ๋ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณต
๋๊ธฐ
์๊ฐ(BookShelf)์ ์ฑ (Book)์ ๋ฃ๊ณ ์ฑ ์ด๋ฆ์ ์์๋๋ก ํ์ํ๋ ์์
- 292 -
BookShelf
Book
BookShelfIterator
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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์ ๋ฆฌํดํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Iterator ํจํด(3/4)
์ ์ฉ
๊ฐ์ฒด ๋ด๋ถ ํํ ๋ฐฉ์์ ๋ชจ๋ฅด๊ณ ๋ ์งํฉ ๊ฐ์ฒด์ ๊ฐ ์์๋ฅผ ์ํ
์งํฉ ๊ฐ์ฒด๋ฅผ ์ํํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ์
์๋ก ๋ค๋ฅธ ์งํฉ ๊ฐ์ฒด ๊ตฌ์กฐ์ ๋ํด์๋ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์ํ
- 294 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Iterator ํจํด(4/4)
ํด๋์ค ๊ตฌ์กฐ
- 295 -
<<interface>>
Aggregate
+ iterator()
creates
ConcreteIterator
+ hasNext()+ next()
- aggregateConcreteAggregate
+ iterator()
<<interface>>
Iterator
+ hasNext()+ next()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ์ธํฐํ์ด์ค ๊ตฌํ์ฒด
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Mediator ํจํด(3/5)
์ ์ฉ
์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์ ์ ์๋ ํํ์ด๊ธฐ๋ ํ์ง๋ง ๋ณต์กํ ์ํธ์์ฉ์ ๊ฐ๋ ๊ฒฝ์ฐ, ๊ฐ์ฒด๋ค ๊ฐ์์์กด์ฑ์ ์ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ๋
๊ฐ์ฒด์ ์ฌ์ฌ์ฉ์ด ๋ค๋ฅธ ๊ฐ์ฒด์์ ์ฐ๊ฒฐ ๊ด๊ณ์ ๋ณต์กํจ์ผ๋ก ์ธํด ๋ฐฉํด๋ฅผ ๋ฐ์ ๋
์ฌ๋ฌ ํด๋์ค์ ๋ถ์ฐ๋ ํ์๋ค์ด ์์ ์์ด ์์ ๋์ด์ผ ํ ๋
- 298 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Mediator ํจํด(5/5)
๊ฐ์ฒด ๊ฐ์ ๋ฉ์์ง ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
- 300 -
aColleague
mediator
aConcreteMediator
aColleague
mediator
aColleague
mediator
aColleague
mediator
aColleague
mediator
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Memento ํจํด(1/4)
์๋
์บก์ํ๋ฅผ ์๋ฐฐํ์ง ์์ผ๋ฉด์ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ํ์ ํ๊ณ ํํํจ
๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ฅํด ๋ ์ํ๋ก ๋ค์ ๋ณต๊ตฌํ ์ ์๊ฒ ํจ
๋๊ธฐ
์ฃผ์ฌ์ ๊ฒ์์ผ๋ก ๊ณผ์ผ ๋ชจ์ผ๊ธฐ ๊ฒ์ ์์
์ฃผ์ฌ์๋ฅผ ๋์ ธ ๋์จ ์๊ฐ ๋ค์ ์ํ๋ฅผ ๊ฒฐ์ ํ๊ณ , ์ข์ ์ซ์๊ฐ ๋์ค๋ฉด ๋๊ณผ ๊ณผ์ผ์ ๋ฐ๋๋ค. ๋์ ์๊ฐ ๋์ค๋ฉด ๋์ด ์ค๊ณ ๋์ด ์์ผ๋ฉด ๊ฒ์์ ์ข ๋ฃ
- 301 -
requests
Memento
+ getMoney()# addFruit()
creates
Main Gamer
+ getMoney()bet()createMemento()restoreMemento()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Memento ํจํด(2/4)
์ ์ฉ
๊ฐ ์์ ์์์ ๊ฐ์ฒด ์ํ๋ฅผ ์ ์ฅํ ํ ๋์ค์ ์ด ์ํ๋ก ๋ณต๊ตฌํด์ผ ํ ๋
์ํ๋ฅผ ์ป๋๋ฐ ํ์ํ ์ง์ ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ์์ธํ ๊ตฌํ ๋ด์ฉ์ ๋๋ฌ๋๊ฒ ํ๊ณ ๊ฐ์ฒด์ ์บก์ํ๋ฅผ ์๋ฐฐํ๋ ๊ฒ์ด๋ฏ๋ก ์ด๋ฅผ ํด๊ฒฐํ ๋
- 302 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Memento ํจํด(3/4)
ํด๋์ค ๊ตฌ์กฐ
- 303 -
requests
Memento
+ setMemento(Memento) : void+ createMemento() : Memento
creates
Caretaker Originator
+ createMemento()+ restoreMemento()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Memento ํจํด(4/4)
Sequence
- 304 -
: Originator
: Memento// create
createMemento()
: Caretaker
setState()
setMemento(Memento)
getState()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Observer ํจํด(2/4)
์ ์ฉ
์ถ์ํ ๊ฐ๋ ์ด ๋ ๊ฐ์ง์ ์ธก๋ฉด์ ๊ฐ๊ณ ํ๋๊ฐ ๋ค๋ฅธ ํ๋์ ์ข ์์ ์ผ ๋.
โข ์ด๋ฐ ์ข ์ ๊ด๊ณ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌ์์ผ ์ด๋ค ๊ฐ๊ฐ์ ์ฌ์ฌ์ฉ
ํ ๊ฐ์ฒด์ ๊ฐํด์ง ๋ณ๊ฒฝ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋ ํ๋ก๊ทธ๋๋จธ๋ค์ ์ผ๋ง๋ ๋ง์๊ฐ์ฒด๋ค์ด ๋ณ๊ฒฝ๋์ด์ผ ํ๋์ง๋ฅผ ๋ชฐ๋ผ๋ ๋จ
๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ณํ๋ฅผ ํต๋ณดํ ์ ์๋๋ฐ, ๋ณํ์ ๊ด์ฌ ์์ดํ๋ ๊ฐ์ฒด๋ค์ด ๋๊ตฌ์ธ์ง์ ๋ํ ๊ฐ์ ์์ด๋ ์ด๋ฃจ์ด์ ธ์ผ ํ ๋
- 306 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
*
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Observer ํจํด(4/4)
Sequence
- 308 -
: ConcreteObserver : ConcreteObserver
setSubjectStatus()
: ConcreteSubject
notifyObserver()
update()
update()
getSubjectStatus()
getSubjectStatus()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
State ํจํด(2/3)
์ ์ฉ
๊ฐ์ฒด์ ํ์๋ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ์ํ์ ๋ฐ๋ผ์ ๋ฐํ์ ์์ํ์๊ฐ ๋ฐ๋์ด์ผ ํจ
๊ฐ์ฒด์ ์ํ์ ๋ฐ๋ผ ์๋ง์ ์กฐ๊ฑด ๋ฌธ์ฅ์ ๊ฐ๋๋ก ์คํผ๋ ์ด์ ์ ๊ตฌํ
โข ๊ฐ์ฒด์ ์ํ๋ฅผ ํํํ๊ธฐ ์ํด ์ํ๋ฅผ ํ๋ ์ด์์ ์ด๊ฑฐํ ์์(enumerated constant)๋ก ์ ์
โข ์ด๋ค ๊ฒฝ์ฐ๋ ๋์ผํ ์กฐ๊ฑด ๋ฌธ์ฅ๋ค์ ํ๋ ์ด์์ ์คํผ๋ ์ด์ ์ ์ค๋ณต ์ ์ํด์ผ ํ ์๋ ์์
โข ์ด๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๋์ ๊ฐ์ฒด๋ก ์ ์ํจ์ผ๋ก์จ ๋ค๋ฅธ ๊ฐ์ฒด์ ์๊ด์์ด ๋ค์ํ
- 310 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
State ํจํด(3/3)
ํด๋์ค ๊ตฌ์กฐ
- 311 -
Context
+ request()
ConcreteState1
+ handle()
- stateState
+ handle()
ConcreteState2
+ handle()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
Visitor ํจํด(2/4)
์ ์ฉ
๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ํด๋์ค๋ค์ ํฌํจํ๊ณ ์์ด์ ๊ตฌ์ฒด์ ํด๋์ค์ ๋ฐ๋ผ ์ด๋ค ์คํผ๋ ์ด์ ์ ์ํํ๊ณ ์ ํ ๋.
๊ตฌ๋ณ๋๊ณ ๊ด๋ จ๋์ง ์์ ๋ง์ ์คํผ๋ ์ด์ ์ด ๊ฐ์ฒด์ ์ํ๋ ํ์๊ฐ ์์ง๋ง ์คํผ๋ ์ด์ ์ผ๋ก ์ธํด ํด๋์ค๋ค์ ๋ณต์กํ๊ฒ ํ๊ณ ์ถ์ง ์์ ๋.
โข Visitorํด๋์ค๋ ํ๋์ ํด๋์ค์ ๊ด๋ จ๋์ง ์์ ๋ชจ๋ ์คํผ๋ ์ด์ ์ ํจ๊ป ์ ์ํจ์ผ๋ก์จ ๊ด๋ จ๋ ์คํผ๋ ์ด์ ์ ์ ์ง
๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ ์ํ ํด๋์ค๋ ๊ฑฐ์ ๋ณํ์ง ์์ง๋ง ์ ์ฒด ๊ตฌ์กฐ์ ๊ฑธ์ณ ์๋ก์ด ์คํผ๋ ์ด์ ์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ชจ๋ Visitor ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ ์
- 313 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
5. ํจํด๊ธฐ๋ฐ ์ค๊ณ
ํ์ผ์์คํ ์๊ตฌ์ฌํญ
ํ์ผ์์คํ ํน์ง
๊ธฐ๋ณธ ์ค๊ณ
์ ์ฉ ํจํด โ Composite ํจํด
ํ์ฅ์๊ตฌ โ mkdir
ํ์ฅ์๊ตฌ โ symbolic link
์ ์ฉํจํด โ Proxy ํจํด
์ฌ๋ณผ๋ฆญ ๋งํฌ ์ค๊ณ
ํ์ฅ์๊ตฌ โ cat,ls
์ ์ฉํจํด โ Visitor ํจํด
ls,cat ์ค๊ณ
์์ฝ
- 316 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
317
ํ์ผ์์คํ ์๊ตฌ์ฌํญ(1/2)
ํ์ผ์์คํ ์๊ตฌ์ฌํญ
์ฌ์ฉ์ ๊ด์
โข ์์์ ํฌ๊ธฐ์ ๋ณต์ก์ฑ์ ๊ฐ์ง ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํจ
โข ํ์ผ ๊ตฌ์กฐ์ ๊น์ด์ ๋์ด์ ํ๊ณ๊ฐ ์์ด์ผ ํจ
ํด๋ผ์ด์ธํธ(explorer) ํ๋ก๊ทธ๋๋จธ ๊ด์
โข ํด๋ผ์ด์ธํธ๊ฐ ํ์ผ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ฝ๊ณ ํ์ฅํ๊ธฐ ์ฌ์์ผ ํจ
โข ํด๋์ ํ์ผ์ ์ด๋ฆ์ ์ด์ฉํ์ฌ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์์ด์ผ ํจ
โข ์ฌ-๊ตฌํ์์ด ์๋ก์ด ์ ํ์ ํ์ผ(์, symbolic links)์ ์์ฉํ ์ ์์ด์ผ ํจ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํ์ผ์์คํ ์๊ตฌ์ฌํญ(1/2)
ํ์๊ธฐ๋ ํ์ผ์์คํ ์ ํด๋ผ์ด์ธํธ ์
ํ์ผ์์คํ ์ ์ปค๋ ๋ด๋ถ ๋๋ ์ปค๋ ์์ ์กด์ฌํ๋ ์์คํ ์๋น์ค
- 318 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
319
ํ์ผ ์์คํ ํน์ง(1/2)
ํ์ผ์์คํ ์ ๊ตฌ์กฐ
ํด๋๋ ํด๋๋ฅผ ๊ฐ์ง๋ค.
ํด๋๋ ํ์ผ์ ๊ฐ์ง๋ค.
ํด๋์ ํ์ผ์ ํ๋์ ๋ถ๋ชจ ํด๋๋ฅผ ๊ฐ์ง๋ค.
๋ฃจํธํด๋
ํด๋ ํด๋ ํด๋
ํด๋ ํ์ผ ํ์ผ ํ์ผ ํ์ผ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํ์ผ ์์คํ ํน์ง(2/2)
์ค๊ณ๋ฅผ ์ํด, ํ์ผ ์์คํ ํน์ง์ ์ถ์ํํ์
๋ฃจํธ ์กด์ฌ
ํด๋๊ฐ ํด๋๋ฅผ ๊ฐ์ง๊ณ
ํด๋๊ฐ ํ์ผ์ ๊ฐ์ง๋ค.
ํด๋์ ํ์ผ์ ํ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค.
- 320 -
๋ฃจํธํด๋
ํด๋ ํด๋ ํด๋
ํด๋ ํ์ผ ํ์ผ ํ์ผ ํ์ผ
Node๋ก ๊ตฌ์ฑ๋
ํธ๋ฆฌ๊ตฌ์กฐ
๋ฃจํธ๋ ธ๋
์ค๊ฐ๋ ธ๋์ค๊ฐ๋ ธ๋ ๋จ๋ง๋ ธ๋
๋จ๋ง๋ ธ๋๋จ๋ง๋ ธ๋๋จ๋ง๋ ธ๋
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
}
ํด๋์์
ํ์ผ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Composite ํจํด
์๋
๋ถ๋ถ๊ณผ ์ ์ฒด์ ๊ณ์ธต์ ํํํ๊ธฐ ์ํด ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ
ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฃธ
๋๊ธฐ
ํ์ฅ์์ ๋ง๋ ๋ฌธ์ ์ ์ Composite ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ์ถ์ํ ๋๋ ์ผ๋ฐํ ํ๊ธฐ
โข ์ฑ ์์ ์์
- 324 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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();
}
ํน์ ๋ฉ์๋๋ ํ์ ํด๋์ค์์ ๊ตฌํํ์ง ์์ ๊ฒฝ์ฐ์ฌ์ฉํ ์ ์๋ค
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);
}
๊ฐ ํธ๋ฆฌ ์์๋ ์์ ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ์ฑ ์์ ์ง๋
์์ ์ ์ ๋ณด๋ ์์ ์ด ์ถ๋ ฅํ๋๋ก ์ฑ ์์ ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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>();
}
์ง์์ ๊ฒฝ์ฐ ํ์ ์์๋ฅผ ๊ฐ์ง ์์์ผ๋ฏ๋ก ํ์์ ํ์ง ์๋๋ค.
ํน์ ํธ๋ฆฌ ์์๋ ๋ฐ๋ก ์์ ์ ํ์๋ง ๊ฒ์ํ๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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๋ฅผ ์์๋ฐ์ ์๋ก์ด ํ์ ๋ง ๋ง๋ค๋ฉด ๊ธฐ์กด ํด๋์ค ๋ณ๊ฒฝ ์์ด ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค.
์๋ก์ด ํด๋์ค๋ ๊ทธ ๊ฐ์ฒด์ํน์ฑ์ ํํํ๋ ์์ฑ์ ๋ฐ๋ก ๊ฐ์ง๋ค.
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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() ํธ์ถ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
330
์ ์ฉ ํจํด - Composite ํจํด
๊ธ์ ์ ์ธ ์ธก๋ฉด
์์์ ๋ณต์ก์ฑ์ ๊ฐ์ง ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ง์
๋ ธ๋์ ๋ณต์ก์ฑ์ด ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด์ด์ง ์์
๊ธฐ์กด์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋๊ณ ์๋ก์ด ํ์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ ์ ์์
๋ถ์ ์ ์ธ ์ธก๋ฉด
์ฝ๋๊ฐ ์ดํดํ๊ธฐ ์ด๋ ค์ ์ง
๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ํจ
๊ตฌํ ์ด์
์ํ์ฑ๋ฅ์ ํฅ์ํ๊ธฐ ์ํด ์ ๋ณด๋ฅผ ์ธ์ /์ด๋์ ์บ์ํ ๊ฒ์ธ๊ฐ?
์ปดํฌ๋ํธ ํด๋์ค์ ํ ๋นํ ์ ์ฅ๊ณต๊ฐ์ ์ผ๋ง๋?
Child๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ด๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๊ฐ?
Child ์ถ๊ฐ/์ญ์ ๋ฅผ ์ํ ๋ฉ์๋๊ฐ ์ปดํฌ๋ํธ ํด๋์ค์ ์ ์ธ๋์ด์ผ ํ๋๊ฐ?
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
331
ํ์ฅ ์๊ตฌ์ฌํญ - mkdir
์ง๊ธ๊น์ง ์์ ๊ฒฐ๊ณผ
Composite ํจํด์ ์ด์ฉํ์ฌ ํ์ผ์์คํ ์ ๋ฐฑ๋ณธ์ ์ค๊ณํจ
์ถ๊ฐ ์๊ตฌ์ฌํญ
ํด๋ผ์ด์ธํธ๋ ํ์ผ๊ณผ ํด๋๋ฅผ ์์ฑํ๊ณ ํ์ํ ๊ณณ์ ๋ ์ ์์ด์ผ ํจ
ํด๋๋ child ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค(์ฑ ์์ด ์์)
โข void attach (Node child);
โข void detach (Node child);
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
332
ํ์ฅ ์๊ตฌ์ฌํญ - mkdir
ํ์ฌ ํด๋= ํด๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ
mkdir์ ์ ์ฐจ
์๋ก์ด ํด๋ ๊ฐ์ฒด ์์ฑ
ํ์ฌ ํด๋์ attach()๋ฅผ ํธ์ถ
์๋ก์ด ํด๋๋ฅผ ํจ๋ฌ๋ฏธํฐ ์ ๋ฌ
...
Folder currentFolder; currentFolder.attach (new Folder(โnewFolderโ));
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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(โ ํด๋๊ฐ ์๋๋๋ค.โ);
โฆ..
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
335
ํ์ฅ ์๊ตฌ์ฌํญ - symbolic link
์ฌ์ฉ ์
Symbolic link : Unix
Aliases : Mac Finder parlance
Shortcuts : Windows 95
ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ์ ๋ํ ๋งํฌ
ํ์ผ ๋งํฌ : ํธ์ง, ์ ์ฅ
๋๋ ํ ๋ฆฌ ๋งํฌ : ๋ ธ๋ ์ถ๊ฐ ์ญ์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํ์ฅ ์๊ตฌ์ฌํญ - symbolic link
Symbolic link์ ๊ฐ๋
๋์์ ํด๋, ํ์ผ ๋ชจ๋ ๊ฐ๋ฅ
ํ๋์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ํ๋์ ๋์๋ง์ ๊ฐ์ง
ํ๋์ ๋์์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ง๋ค ์ ์์
๋์์ด ์ง์์ ธ๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ์กด์ฌํจ
- 336 -
ํด๋
ํ์ผ
ํด๋
ํ์ผ
์ฌ๋ณผ๋ฆญ ๋งํฌB
๋งํฌ
์ฌ๋ณผ๋ฆญ ๋งํฌC
์ฌ๋ณผ๋ฆญ ๋งํฌA
์ฌ๋ณผ๋ฆญ ๋งํฌD
์ฌ๋ณผ๋ฆญ ๋งํฌE
[์ญ์ ]ํด๋
ํด๋ผ์ด์ธํธ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ์คํผ๋ ์ด์ ์ถ๊ฐ
์ ์ ํ ํจํด ์ฐพ๊ธฐ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Proxy ํจํด
์๋
๋ค๋ฅธ ๊ฐ์ฒด์ ์ ๊ทผํ๊ธฐ ์ํด ์ค๊ฐ ๋๋ฆฌ ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ
๋๊ธฐ
์ฌ๋ณผ๋ฆญ ๋งํฌ ๋ฌธ์ ์ ์ Proxy ํจํด์ ํตํด ๊ทธ ๋์์ ์ฐพ๊ณ ์ ํ๋ค.
โข ํด๋์ ํ์ผ์ ๋ํ ์ ๊ทผ ํต์
โข ์ง์ฐ ๋ก๋ฉ (Lazy Loading)
โข ์ํฅ๋ ์ต์ํ
- 339 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Proxy ํจํด
์ ์ฉ
์๊ฒฉ ํธ์ถ์ด ํ์ํ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์๊ฒฉ Proxy๋ฅผ ํตํด ํธ์ถ (์: RMI)
์์ฒญ์ด ์์ ๊ฒฝ์ฐ์๋ง ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์์ ๊ฒฝ์ฐ(์ฑ๋ฅ์ด ๋จ์ด์ง๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ฑฐ๋)
์๋ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ ๊ฒฝ์ฐ ๋ณดํธ์ฉ Proxy๋ฅผ ์ฌ์ฉ
- 340 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Proxy ํจํด
๊ตฌ์กฐ
- 341 -
Subject
+ request()
...
RealSubject
+ request()
...
Proxy- realSubject
1
Client
+ request()
......
realSubject.request();
...
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Proxy ํจํด
Sequence
- 342 -
: Client :Proxy :RealSubject
Request to Proxy
Request to Real Subject
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
343
์ ์ฉ ํจํด - Proxy ํจํด
Proxy ํจํด ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
344
์ฌ๋ณผ๋ง ๋งํฌ ์ค๊ณ
๋งํฌ ์์ค์ฝ๋
public class Link extends Node {
public Link(Node node) {
//
โฆ.
}
// ์ค์ ๊ฐ์ฒด(ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ)์ ๋ํ ์ฐธ์กฐ
private Node realSubject;
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
345
์ฌ๋ณผ๋ฆญ ๋งํฌ ์ค๊ณ
Proxy์ ์ค์ ์ฃผ์ฒด(real subject)
์ฌ๊ธฐ์๋ ํ์ผ๊ณผ ํด๋๊ฐ ์ค์ ์ฃผ์ฒด(realSubject)
[GOF]์์๋
โข Proxy๋ ์ค์ ๊ฐ์ฒด์ ์ ๊ทผํ๊ธฐ ์ํ ์ฐธ์กฐ(ํฌ์ธํฐ)๋ฅผ ์ ์งํ๋ค.
realSubject๋ ๋์ Node์ ๋ํ ํฌ์ธํฐ
๊ณตํต ์ธํฐํ์ด์ค ์์ด ํ์ผ๊ณผ ํด๋ ๋ชจ๋์ ์ ์ฉ๋๋ symbolic link๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ค์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
346
์ฌ๋ณผ๋ฆญ ๋งํฌ ์ค๊ณ
์์ค์ฝ๋์์ real subject์ ์ฉ๋
Link ํด๋์ค์ ์์ค์ฝ๋์์
โฆ.
public Node getChild(int index) {
// realSubject ๋ก ์์
return realSubject.getChild(index);
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
347
์ฌ๋ณผ๋ฆญ ๋งํฌ ์ค๊ณ
Proxy ํจํด ์ ์ฉ ์ ๊ณ ๋ ค์ฌํญ
ํ์ผ์ด ์ญ์ ๋์์ ๊ฒฝ์ฐ
โข Proxy๋ ํ์์ ์ฐธ์กฐํ๊ฒ ๋๋ค(dangling pointer)
โข Proxy์๊ฒ ์ญ์ ์ฌ์ค์ ์๋ ค์ค Observer๊ฐ ํ์ํ๋ค.
์ ๋์ค์ ๋งคํจํ ์
โข Symbolic link๋ ์ฐธ์กฐํ๊ณ ์๋ ๋์ ํ์ผ์ ์ค์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ค.
๋ฐ๋ผ์ Proxy๋
โข ํ์ผ ์์คํ ์ root์ ๋ํ ์ฐธ์กฐ์ ํ์ผ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ค.
โข ์ด๋ฆ์ ์ฐพ๋(lookup) ๋น์ฉ์ด ๋์
๋๊ฐ์ง ํด๊ฒฐ์ฑ
โข 1. ์ด๋ฆ ์ฐพ๋ ๋น์ฉ์ ๊ฐ์ํ๊ณ ์ด๋ฆ๊ณผ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์
โข 2. Observer์ ๋ํ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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)
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
349
ํ์ฅ ์๊ตฌ์ฌํญ โ cat, ls
์๊ตฌ์ฌํญ์ด ๊ณ์ ์๋ณ๋จ
์ถ๊ฐ ์์ฑ ์ง์, ํ์ผ ์์ฑ์ผ์, ์ต๊ทผ ๋ณ๊ฒฝ์ผ์ ๋ฑ
์๋ก์ด ์ ํ์ size ๊ณ์ฐ ์ง์, ๋ธ๋ก(512๋ฐ์ดํธ) ๋จ์ ํฌ๊ธฐ ๊ณ์ฐ
๋ ธ๋๋ฅผ ์ํ ์์ด์ฝ ๋ฆฌํด
๊ฒฐ๊ณผ์ ์ผ๋ก, Node๋ ๊ฑฐ๋ํ(giant)ํด๋์ค๊ฐ ๋์ด ๊ฐ
์ธํฐํ์ด์ค ์ถ๊ฐ ์์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ์ผ ํ๋ ์ํฉ์
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋๊ฐ?
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
350
ํ์ฅ ์๊ตฌ์ฌํญ โ cat, ls
๋จ์ํ ๊ธฐ๋ฅ ์ถ๊ฐ
ํ์ผ์ ํฌํจ๋ ๋จ์ด ๊ฐ์ ๋ฆฌํด
โข getWordCount()
๋ ธ๋ ํด๋์ค์ ์ถ๊ฐ?
ํ์ผ ํด๋์ค์ ์ถ๊ฐ?
๊ทธ๋ฌ๋ฉด
Stream ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฏ๋ก
stream ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ๋จ์์ getWordCount()๋ฅผ ๊ตฌํํ๋ค.
์ถฉ๋ถํ Primitive ์ธํฐํ์ด์ค ์ค๋น
Primitive ์ธํฐํ์ด์ค์ ์กฐํฉ์ ํตํด ์ํ๋ ๊ธฐ๋ฅ์ ํด๋ผ์ด์ธํธ ์ธก์์ ๊ตฌํ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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;
โฆ..
์๋ก์ด ๋ ธ๋๊ฐ
์๊ธธ ๊ฒฝ์ฐ ???
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
ํ์ฅ ์๊ตฌ์ฌํญ โ cat, ls
์ค์ธ๊ณ์ ์๋ฅผ ๋ค์ด๋ด ์๋ค.
๋๋ฅธํ ์ฃผ๋ง ์คํ,
์์ด๋ ๋๋ค๊ฐ ํ์ฐธ ์๊ณ ์ถ์๋ฐ,
TV๋ฅผ ๊ณ ์ณ๋ฌ๋ผ๊ณ ํ๋ ์๋ด์ ์ฑํ๊ฐ ๊ณ์๋๊ณ ...
- 352 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 ์คํผ๋ ์ด์ ์ถ๊ฐ
์ ์ ํ ํจํด ์ฐพ๊ธฐ
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Visitor ํจํด
์ ์ฉ
๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ํด๋์ค๋ค์ ํฌํจํ๊ณ ์์ด์ ๊ตฌ์ฒด์ ํด๋์ค์ ๋ฐ๋ผ ์ด๋ค ์คํผ๋ ์ด์ ์ ์ํํ๊ณ ์ ํ ๋.
๊ตฌ๋ณ๋๊ณ ๊ด๋ จ๋์ง ์์ ๋ง์ ์คํผ๋ ์ด์ ์ด ๊ฐ์ฒด์ ์ํ๋ ํ์๊ฐ ์์ง๋ง ์คํผ๋ ์ด์ ์ผ๋ก ์ธํด ํด๋์ค๋ค์ ๋ณต์กํ๊ฒ ํ๊ณ ์ถ์ง ์์ ๋. Visitorํด๋์ค๋ ํ๋์ ํด๋์ค์ ๊ด๋ จ๋์ง ์์ ๋ชจ๋ ์คํผ๋ ์ด์ ์ ํจ๊ป ์ ์ํจ์ผ๋ก์จ ๊ด๋ จ๋ ์คํผ๋ ์ด์ ์ ์ ์ง์ํจ๋ค.
๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ ์ํ ํด๋์ค๋ ๊ฑฐ์ ๋ณํ์ง ์์ง๋ง ์ ์ฒด ๊ตฌ์กฐ์ ๊ฑธ์ณ ์๋ก์ด ์คํผ๋ ์ด์ ์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ชจ๋ Visitor ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค.
- 355 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Visitor ํจํด
ํด๋์ค ๊ตฌ์กฐ
- 356 -
Visitor
+ visit(ConcreteAcceptorA)
+ visit(ConcreteAcceptorB)
ConcreteAcceptorA
+ operation()
ConcreteVisitor
Acceptor
+ accept()
ObjectStructure
Client
ConcreteAcceptorB
+ operation()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์ ์ฉ ํจํด โ Visitor ํจํด
Sequence
- 357 -
: ConcreteAcceptorA : ConcreteAcceptorB : ConcreteVisitor
accept(Visitor)
visit(ConcreteAcceptorA)
operation()
: ObjectStructure
accept(Visitor)
visit(ConcreteAcceptorB)
operation()
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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);}
}
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
359
ls,cat ์ค๊ณ
ํ์ ๋ ธ๋ ๋ฐฉ๋ฌธ(visit)
ํด๋ผ์ด์ธํธ ์ฝ๋
Visitor catVisitor = new CatVisitor();
node.accept(catVisitor);
๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์ถ๊ฐ : ls
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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) { // ๋งํฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ก์ง }
};
๋ค์ด์บ์คํ ์์
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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(โ@โ); }
};
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํดCopyright ยฉ 2009 Nextree Soft, All rights reserved
์ค์๊ธฐ์ ์ง์ ํ๋ จ์ปจ์์์
์์ฝ (ํจํด ๊ธฐ๋ฐ ์ค๊ณ)
ํจํด์ ํตํ ๋ฌธ์ ํด๊ฒฐ์ ์ค๊ณ ์๋๋ฅผ ๋์ฌ์ค๋ค.
ํจํด์ ๋ฌธ์ ์ ๋ณธ์ง์ ๋นจ๋ฆฌ ํ์ ํ๋๋ก ๋์์ค๋ค.
ํจํด์ ์์ฉํ๊ฑฐ๋ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ค.
- 363 -
๊ณผ์ ๋ช : ๋์์ธ ํจํด & ์ํคํ ์ฒ ํจํด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 -