Java

[JAVA] ๋””์ž์ธ ํŒจํ„ด - Visitor ํŒจํ„ด

HHRR 2024. 1. 18. 18:15

Visitor ํŒจํ„ด

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

Visitor ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์™€ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋™์ž‘์„ ๊ธฐ์กด ๊ฐ์ฒด ๊ตฌ์กฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ SOLID ์›์น™ ์ค‘ ํ•˜๋‚˜์ธ "๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open-Closed Principle, OCP)"์„ ๋”ฐ๋ฅด๋ฉฐ, ๊ธฐ์กด ์ฝ”๋“œ์˜ ์ˆ˜์ • ์—†์ด ์ƒˆ๋กœ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง(์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ณด๋‹ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋” ์ž์ฃผ ๋ณ€๊ฒฝ๋  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•

  • ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์™€ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • "๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)"์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ฝ”๋“œ ์ˆ˜์ •์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ถ„๋ฆฌ๋˜์–ด ๋ฐ์ดํ„ฐ์˜ ๋…๋ฆฝ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

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

๋‹จ์ 

  • ์ƒˆ๋กœ์šด ์ž‘์—… ๋Œ€์ƒ(๋ฐฉ๋ฌธ ๊ณต๊ฐ„)์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ž‘์—… ์ฃผ์ฒด(๋ฐฉ๋ฌธ์ž)๋„ ์ด์— ๋Œ€ํ•œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ์ฒด(๋ฐฉ๋ฌธ์ž์™€ ๋ฐฉ๋ฌธ ๊ณต๊ฐ„)์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Visitor ํŒจํ„ด UML

  • Visitor ํด๋ž˜์Šค: ๋ฐฉ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • Element ์ธํ„ฐํŽ˜์ด์Šค: ๋ฐฉ๋ฌธ์ž๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, accept ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • Entry ํด๋ž˜์Šค: ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋””๋ ‰ํ† ๋ฆฌ ์—”ํŠธ๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, Element ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹ค์ œ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • File ํด๋ž˜์Šค: ํŒŒ์ผ์„ ํ‘œํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ, ์ด๋ฆ„๊ณผ ํฌ๊ธฐ๋ฅผ ๋ถ€์—ฌํ•ด File ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Directory ํด๋ž˜์Šค: ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ, ์ด๋ฆ„๊ณผ ํฌ๊ธฐ๋ฅผ ๋ถ€์—ฌํ•ด Directory ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ListVisitor ํด๋ž˜์Šค: ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋Œ์•„๋‹ค๋‹ˆ๋ฉด์„œ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

Visitor ํŒจํ„ด Sequence Diagram

  1. Main ํด๋ž˜์Šค๊ฐ€ ListVisitor์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. Main์€ Directory์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด accept ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. Directory์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ListVisitor์˜ visit(Directory) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  4. ListVisitor์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์„ ์‚ดํŽด๋ณด๊ณ  ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์˜ accept ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  5. File์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ListVisitor์˜ visit(File) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. (ListVisitor๋Š” ์—ฌ์ „ํžˆ visit(Directory)๋ฅผ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.)
  6. visit(File)์—์„œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
  7. accept์—์„œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
  8. ๋‹ค๋ฅธ File์˜ ์ธ์Šคํ„ด์Šค์˜ accept ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  9. File์˜ ์ธ์Šคํ„ด์Šค๋Š” visit(File)์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  10. ๊ฐ ๋ฉ”์†Œ๋“œ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” Main์˜ accept ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ง€์ ์—์„œ๋„ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

  • ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•ˆ์„ visitor๊ฐ€ ๋Œ์•„๋‹ค๋‹ˆ๋ฉฐ ํŒŒ์ผ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] ๋””์ž์ธํŒจํ„ด - Proxy ํŒจํ„ด  (0) 2024.01.18
[JAVA] ๋””์ž์ธํŒจํ„ด - State ํŒจํ„ด  (0) 2024.01.18