JavaRush /Java Blog /Random-KO /ํ”„๋ก์‹œ ๋””์ž์ธ ํŒจํ„ด

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

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๊ณ„ํšํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์—†์–ด์„œ๋Š” ์•ˆ๋  ๋„๊ตฌ๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” Proxy, ์ฆ‰ Deputy์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์™œ ๋Œ€๋ฆฌ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ด ํŒจํ„ด์€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œ์–ด์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. "์™œ ์ด๋ ‡๊ฒŒ ํ†ต์ œ๋œ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?"๋ผ๋Š” ์งˆ๋ฌธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹ค์‹œ์˜ˆ 1

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ณด๊ณ ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ์˜ค๋ž˜๋œ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ํฌํ•จ๋œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์ „์ฒด ์‹œ์Šคํ…œ์ด ์œ ํœด ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ํ‰๊ท ์ ์œผ๋กœ ๋ณด๊ณ ์„œ๋Š” 30๋ถ„ ์•ˆ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ์—…๋กœ๋“œ๋Š” 00:30๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋ฉฐ, ๊ฒฝ์˜์ง„์€ ์˜ค์ „์— ์ด ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ๊ฒฐ๊ณผ, ๋ณด๊ณ ์„œ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ์ฆ‰์‹œ, ์ฆ‰ ํ•˜๋ฃจ ์ด๋‚ด์— ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๋‹ค์‹œ ์˜ˆ์•ฝํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์—…๋กœ๋“œ ๋ฐ ๋ณด๊ณ ์„œ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•˜์—ฌ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ํ‰์†Œ๋Œ€๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฒฝ์˜์ง„์€ ์ƒˆ๋กœ์šด ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ณด๊ณ ์„œ ์—…๋กœ๋“œ ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๊ณ  ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๋ฉฐ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” Deputy ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๊ฐ„ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ๋ชจ๋‘๊ฐ€ ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์‹œ์˜ˆ 2

๊ฐœ๋ฐœํŒ€์€ ํฌ์Šคํ„ฐ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ทธ๋“ค์€ ํŠน์ˆ˜ ํ์‡„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ ์ž‘์šฉ์ด ๊ตฌํ˜„๋˜๋Š” ํƒ€์‚ฌ ์„œ๋น„์Šค๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํƒ€์‚ฌ ์‹œ์Šคํ…œ์ด ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์น  ๋•Œ๋งˆ๋‹ค ์ด์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋งŽ์€ ์ˆ˜์˜ ์š”์ฒญ์ด ์ƒ์„ฑ๋˜๊ณ  ์„œ๋น„์Šค๊ฐ€ ์‘๋‹ต์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ์„œ๋น„์Šค ์‘๋‹ต์„ ์บ์‹œํ•˜๊ณ  ์žฌ๋ถ€ํŒ…ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ•„์š”์— ๋”ฐ๋ผ ์ด ์บ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Deputy ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์™„์„ฑ๋œ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํƒ์›”ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

ํŒจํ„ด ์ž‘๋™ ๋ฐฉ์‹

์ด ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋™์ž‘์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ ๊ฐ์ฒด ๋Œ€์‹  ํด๋ผ์ด์–ธํŠธ๋Š” ํ”„๋ก์‹œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ์š”์ฒญ์€ ์„œ๋น„์Šค ํด๋ž˜์Šค๋กœ ์ „๋‹ฌ๋˜์ง€๋งŒ ํ˜ธ์ถœ ์ „ํ›„์— ์ถ”๊ฐ€ ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์ด ํ”„๋ก์‹œ ๊ฐœ์ฒด๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์™€ ๋Œ€์ƒ ๊ฐœ์ฒด ์‚ฌ์ด์˜ ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ๋Š๋ฆฐ ์˜ค๋ž˜๋œ ๋””์Šคํฌ์—์„œ ์š”์ฒญ์„ ์บ์‹ฑํ•˜๋Š” ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ ์›๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ณ ๋Œ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ „๊ธฐ ์—ด์ฐจ ์ผ์ •์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ์ผ์ •์˜ ๋””์Šคํฌ๊ฐ€ ๋งค์ผ ์ •ํ•ด์ง„ ์‹œ๊ฐ„์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š”:
  1. ์ƒํ˜ธ ์ž‘์šฉ TimetableTrains.
  2. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค TimetableElectricTrains์ž…๋‹ˆ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋””์Šคํฌ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ์ž…๋‹ˆ๋‹ค.
  4. ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค DisplayTimetable. ๊ทธ ๋ฉ”์†Œ๋“œ๋Š” printTimetable()ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค TimetableElectricTrains.
๊ตฌ์„ฑํ‘œ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก์‹œ ๋””์ž์ธ ํŒจํ„ด - 2ํ˜„์žฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค printTimetable()ํด๋ž˜์Šค๋Š” TimetableElectricTrains๋””์Šคํฌ์— ์•ก์„ธ์Šคํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ๋กœ๋“œํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์€ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋ก์‹œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก์‹œ ๋””์ž์ธ ํŒจํ„ด - 3์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ž˜์Šค๋Š” ์ด์ „ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ DisplayTimetableํด๋ž˜์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์กฐ์ฐจ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค . TimetableElectricTrainsProxy์ƒˆ๋กœ์šด ๊ตฌํ˜„์—์„œ๋Š” ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ ์ผ์ •์„ ๋กœ๋“œํ•˜๊ณ , ๋ฐ˜๋ณต ์š”์ฒญ ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ด๋ฏธ ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ž‘์—…์— ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‚˜์š”?

๋‹ค์Œ์€ ์ด ํŒจํ„ด์ด ํ™•์‹คํžˆ ์œ ์šฉํ•  ๋ช‡ ๊ฐ€์ง€ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.
  1. ์บ์‹ฑ.
  2. ๊ฒŒ์œผ๋ฅธ ๊ตฌํ˜„์€ ๊ฒŒ์œผ๋ฅธ ๊ตฌํ˜„์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ๊ฐœ์ฒด๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋กœ๋“œํ•ฉ๋‹ˆ๊นŒ?
  3. ์š”์ฒญ ๋กœ๊น….
  4. ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ๋ฐ ์•ก์„ธ์Šค ํ™•์ธ.
  5. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  6. ํ†ตํ™” ๋‚ด์—ญ์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด ์ด๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๊ธฐ์— Deputy๋Š” Facade ์™€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋ก์‹œ ๋Š” ์„œ๋น„์Šค ๊ฐœ์ฒด์™€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒจํ„ด์„ Decorator ๋˜๋Š” Adapter ์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค . Decorator๋Š” ํ™•์žฅ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ˜๋ฉด Adapter๋Š” ๋Œ€์ฒด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ ๊ณผ ๋‹จ์ 

  • + ์›ํ•˜๋Š” ๋Œ€๋กœ ์„œ๋น„์Šค ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • + ์„œ๋น„์Šค ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
  • + ์„œ๋น„์Šค ๊ฐœ์ฒด ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • + ์ฝ”๋“œ ์„ฑ๋Šฅ๊ณผ ๋ณด์•ˆ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • - ์ถ”๊ฐ€์ ์ธ ์‹œ์ˆ ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • - ํ”„๋กœ๊ทธ๋žจ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋Œ€์ฒด ํŒจํ„ด

๋””์Šคํฌ์—์„œ ์—ด์ฐจ ์‹œ๊ฐ„ํ‘œ๋ฅผ ์ฝ๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
public interface TimetableTrains {
   String[] getTimetable();
   String getTrainDepartureTime();
}
๋ฉ”์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค:
public class TimetableElectricTrains implements TimetableTrains {

   @Override
   public String[] getTimetable() {
       ArrayList<String> list = new ArrayList<>();
       try {
           Scanner scanner = new Scanner(new FileReader(new File("/tmp/electric_trains.csv")));
           while (scanner.hasNextLine()) {
               String line = scanner.nextLine();
               list.add(line);
           }
       } catch (IOException e) {
           System.err.println("Error:  " + e);
       }
       return list.toArray(new String[list.size()]);
   }

   @Override
   public String getTrainDepartureTime(String trainId) {
       String[] timetable = getTimetable();
       for(int i = 0; i<timetable.length; i++) {
           if(timetable[i].startsWith(trainId+";")) return timetable[i];
       }
       return "";
   }
}
๋ชจ๋“  ์—ด์ฐจ์˜ ์ผ์ •์„ ์–ป์œผ๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค ํ”„๋กœ๊ทธ๋žจ์€ ๋””์Šคํฌ์—์„œ ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๊ฝƒ์ž…๋‹ˆ๋‹ค. ๋‹จ ํ•œ ์—ด์ฐจ์˜ ์ผ์ •์„ ํ™•์ธํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ํŒŒ์ผ์„ ์ฝ์–ด๋ณด์„ธ์š”! ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์œ ์˜ˆ์—๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค. :) ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค:
public class DisplayTimetable {
   private TimetableTrains timetableTrains = new TimetableElectricTrains();

   public void printTimetable() {
       String[] timetable = timetableTrains.getTimetable();
       String[] tmpArr;
       System.out.println("ะŸะพะตะทะด\tะžั‚ะบัƒะดะฐ\tะšัƒะดะฐ\t\tะ’ั€ะตะผั ะพั‚ะฟั€ะฐะฒะปะตะฝะธั\tะ’ั€ะตะผั ะฟั€ะธะฑั‹ั‚ะธั\tะ’ั€ะตะผั ะฒ ะฟัƒั‚ะธ");
       for(int i = 0; i < timetable.length; i++) {
           tmpArr = timetable[i].split(";");
           System.out.printf("%s\t%s\t%s\t\t%s\t\t\t\t%s\t\t\t%s\n", tmpArr[0], tmpArr[1], tmpArr[2], tmpArr[3], tmpArr[4], tmpArr[5]);
       }
   }
}
์˜ˆ์‹œ ํŒŒ์ผ:

9B-6854;ะ›ะพะฝะดะพะฝ;ะŸั€ะฐะณะฐ;13:43;21:15;07:32
BA-1404;ะŸะฐั€ะธะถ;ะ“ั€ะฐั†;14:25;21:25;07:00
9B-8710;ะŸั€ะฐะณะฐ;ะ’ะตะฝะฐ;04:48;08:49;04:01;
9B-8122;ะŸั€ะฐะณะฐ;ะ“ั€ะฐั†;04:48;08:49;04:01
ํ…Œ์ŠคํŠธํ•ด๋ณด์ž:
public static void main(String[] args) {
   DisplayTimetable displayTimetable = new DisplayTimetable();
   displayTimetable.printTimetable();
}
๊ฒฐ๋ก :

ะŸะพะตะทะด  ะžั‚ะบัƒะดะฐ  ะšัƒะดะฐ   ะ’ั€ะตะผั ะพั‚ะฟั€ะฐะฒะปะตะฝะธั ะ’ั€ะตะผั ะฟั€ะธะฑั‹ั‚ะธั    ะ’ั€ะตะผั ะฒ ะฟัƒั‚ะธ
9B-6854  ะ›ะพะฝะดะพะฝ  ะŸั€ะฐะณะฐ    13:43         21:15         07:32
BA-1404  ะŸะฐั€ะธะถ   ะ“ั€ะฐั†   14:25         21:25         07:00
9B-8710  ะŸั€ะฐะณะฐ   ะ’ะตะฝะฐ   04:48         08:49         04:01
9B-8122  ะŸั€ะฐะณะฐ   ะ“ั€ะฐั†   04:48         08:49         04:01
์ด์ œ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  1. ์›๋ณธ ๊ฐœ์ฒด ๋Œ€์‹  ์ƒˆ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์˜ˆ์—์„œ๋Š” ์ž…๋‹ˆ๋‹ค TimetableTrains.

  2. ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž์—์„œ ์ „๋‹ฌ).

    ๋‹ค์Œ์€ ํ”„๋ก์‹œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

    public class TimetableElectricTrainsProxy implements TimetableTrains {
       // ะกัั‹ะปะบะฐ ะฝะฐ ะพั€ะธะณะธะฝะฐะปัŒะฝั‹ะน an object
       private TimetableTrains timetableTrains = new TimetableElectricTrains();
    
       private String[] timetableCache = null
    
       @Override
       public String[] getTimetable() {
           return timetableTrains.getTimetable();
       }
    
       @Override
       public String getTrainDepartureTime(String trainId) {
           return timetableTrains.getTrainDepartureTime(trainId);
       }
    
       public void clearCache() {
           timetableTrains = null;
       }
    }

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

  3. ์šฐ๋ฆฌ๋Š” ํ”„๋ก์‹œ ํด๋ž˜์Šค์˜ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜ธ์ถœ์€ ํ•ญ์ƒ ์›๋ž˜ ๊ฐœ์ฒด๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.

    public class TimetableElectricTrainsProxy implements TimetableTrains {
       // ะกัั‹ะปะบะฐ ะฝะฐ ะพั€ะธะณะธะฝะฐะปัŒะฝั‹ะน an object
       private TimetableTrains timetableTrains = new TimetableElectricTrains();
    
       private String[] timetableCache = null
    
       @Override
       public String[] getTimetable() {
           if(timetableCache == null) {
               timetableCache = timetableTrains.getTimetable();
           }
           return timetableCache;
       }
    
       @Override
       public String getTrainDepartureTime(String trainId) {
           if(timetableCache == null) {
               timetableCache = timetableTrains.getTimetable();
           }
           for(int i = 0; i < timetableCache.length; i++) {
               if(timetableCache[i].startsWith(trainId+";")) return timetableCache[i];
           }
           return "";
       }
    
       public void clearCache() {
           timetableTrains = null;
       }
    }

    ์ด ๋ฉ”์„œ๋“œ๋Š” getTimetable()์ผ์ • ๋ฐฐ์—ด์ด ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐœํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ ๋•๋ถ„์— getTrainDepartireTime() ๋ฉ”์„œ๋“œ๋ฅผ ์›๋ž˜ ๊ฐœ์ฒด๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ๊ทธ ๊ธฐ๋Šฅ์„ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณต์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

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

  4. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ์›๋ž˜ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋Œ€์ฒด ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    public class DisplayTimetable {
       // ะ˜ะทะผะตะฝะตะฝะฝะฐั link
       private TimetableTrains timetableTrains = new TimetableElectricTrainsProxy();
    
       public void printTimetable() {
           String[] timetable = timetableTrains.getTimetable();
           String[] tmpArr;
           System.out.println("ะŸะพะตะทะด\tะžั‚ะบัƒะดะฐ\tะšัƒะดะฐ\t\tะ’ั€ะตะผั ะพั‚ะฟั€ะฐะฒะปะตะฝะธั\tะ’ั€ะตะผั ะฟั€ะธะฑั‹ั‚ะธั\tะ’ั€ะตะผั ะฒ ะฟัƒั‚ะธ");
           for(int i = 0; i<timetable.length; i++) {
               tmpArr = timetable[i].split(";");
               System.out.printf("%s\t%s\t%s\t\t%s\t\t\t\t%s\t\t\t%s\n", tmpArr[0], tmpArr[1], tmpArr[2], tmpArr[3], tmpArr[4], tmpArr[5]);
           }
       }
    }

    ์‹œํ—˜

    
    ะŸะพะตะทะด  ะžั‚ะบัƒะดะฐ  ะšัƒะดะฐ   ะ’ั€ะตะผั ะพั‚ะฟั€ะฐะฒะปะตะฝะธั ะ’ั€ะตะผั ะฟั€ะธะฑั‹ั‚ะธั    ะ’ั€ะตะผั ะฒ ะฟัƒั‚ะธ
    9B-6854  ะ›ะพะฝะดะพะฝ  ะŸั€ะฐะณะฐ    13:43         21:15         07:32
    BA-1404  ะŸะฐั€ะธะถ   ะ“ั€ะฐั†   14:25         21:25         07:00
    9B-8710  ะŸั€ะฐะณะฐ   ะ’ะตะฝะฐ   04:48         08:49         04:01
    9B-8122  ะŸั€ะฐะณะฐ   ะ“ั€ะฐั†   04:48         08:49         04:01

    ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์›๋ž˜ ๊ฐœ์ฒด์™€ ๋Œ€์ฒด ๊ฐœ์ฒด๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์  ๋Œ€์‹  ์œ ์šฉํ•œ ๋งํฌ

  1. ํŒจํ„ด์— ๊ด€ํ•œ ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ์™€ "Deputy"์— ๊ด€ํ•œ ์•ฝ๊ฐ„์˜ ๊ธฐ์‚ฌ

์˜ค๋Š˜์€ ๊ทธ๊ฒŒ ๋‹ค์•ผ! ์‹ค์Šต์œผ๋กœ ๋Œ์•„๊ฐ€ ์ƒˆ๋กœ์šด ์ง€์‹์„ ํ•™์Šตํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION