์ด ๊ธฐ์‚ฌ๋Š” ๋””์ž์ธ ํŒจํ„ด์˜ ๊ฐœ๋…์„ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ, ์‹ฑ๊ธ€ํ†ค ์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ๋“ค์–ด ๋ณธ ์ ์ด ์žˆ๋Š” ์‚ฌ๋žŒ ๋˜๋Š” ์–ด๋–ป๊ฒŒ๋“  ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํ™˜์˜! CodeGym ํ•™์ƒ๋“ค์€ ๋ ˆ๋ฒจ 15์—์„œ ์ฒ˜์Œ์œผ๋กœ ๋””์ž์ธ ํŒจํ„ด์„ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ๊ธฐ์žฅ์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ง€์—ฐ ๊ตฌํ˜„์œผ๋กœ Java ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ดํ•ด๋ฅผ "๊ฐ•ํ™”"ํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์— ๋Œ€ํ•ด ์ฒ˜์Œ ๋“ฃ๋Š” ํ•™์ƒ๋“ค์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋งŽ์€ ์งˆ๋ฌธ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋„๋Œ€์ฒด ๋””์ž์ธ ํŒจํ„ด์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์™œ ํ•„์š”ํ•œ๊ฐ€์š”? ์‹ฑ๊ธ€ํ†ค ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ ? ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฒŒ์œผ๋ฅธ ๊ตฌํ˜„์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์งˆ๋ฌธ์— ์ˆœ์„œ๋Œ€๋กœ ๋‹ตํ•ด ๋ด…์‹œ๋‹ค.

์„ธ์ƒ์— ๋””์ž์ธ ํŒจํ„ด์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ์งˆ๋ฌธ์— ๊ฐ€์žฅ ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฝ๊ฐ„์˜ ์—ญ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด๋ฅผ ๋‚ด๋†“์€ 4๋ช…์˜ ์œ ๋ช…ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ €์ž(Erich Gamma, John Vlissides, Ralph Johnson, Richard Helm)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋“ค์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ „ํ˜•์ ์ธ ํŒจํ„ด์„ ์„ค๋ช…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ฑ…์€ Design Patterns: Elements of Reusable Object-Oriented Software๋ผ๋Š” ์ œ๋ชฉ์œผ๋กœ 1994๋…„์— ์ถœํŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ฑ…์˜ ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ˆœํžˆ ๊ทธ ์ฑ…์„ 4์ธ๋ฐฉ์˜ ์ฑ…์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดˆํŒ์—๋Š” 23๊ฐœ์˜ ํŒจํ„ด์ด ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ ์ˆ˜์‹ญ ๊ฐœ์˜ ๋‹ค๋ฅธ ํŒจํ„ด์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋””์ž์ธ ํŒจํ„ด์€ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ‘œ์ค€ํ™”๋œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
์‹ฑ๊ธ€ ํ†ค ํŒจํ„ด์€ ๊ทธ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋””์ž์ธ ํŒจํ„ด์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

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

  2. ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ „์—ญ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ ์ง€์ ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋””์—์„œ๋‚˜ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์‰ฝ๊ฒŒ๋„ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์“ฐ๊ธฐ ๊ธˆ์ง€๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ์ฒด์˜ ์ „์—ญ ์•ก์„ธ์Šค ์ง€์ ์ด ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Singleton ์˜ ์ด๋Ÿฌํ•œ ์†์„ฑ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฐœ์ฒด๊ฐ€ ์žˆ๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Singleton ์€ ์•„๋ฌด๋„ ์ด์ „์— ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ Singleton ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—๋Š” ํŠน์ • ์ข…๋ฅ˜์˜ ๊ฐœ์ฒด ์ค‘ ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผ ํ•˜๊ณ  ์ „์—ญ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ 15์˜ ์˜ˆ์—์„œ ์„ ์žฅ์€ ๋‹ค์Œ ์ž‘์—…์— ๋Œ€ํ•ด ์ด ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  1. ์ง€์—ฐ ์ดˆ๊ธฐํ™”๊ฐ€ ์žˆ๋Š” ์‹ฑ๊ธ€ํ†ค ์˜ ์˜ˆ๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค .

  2. ๋™์ผํ•œ ์›์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„๋„์˜ ํŒŒ์ผ์— ์„ธ ๊ฐœ์˜ ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค(Sun, Moon, Earth)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  3. ๊ตฌํ˜„ํ•˜๋‹คํ–‰์„ฑSun , Moon ๋ฐ Earth ํด๋ž˜์Šค ์˜ ์ธํ„ฐํŽ˜์ด์Šค .

  4. ์†”๋ฃจ์…˜ ํด๋ž˜์Šค ์˜ ์ •์  ๋ธ”๋ก์—์„œreadKeyFromConsoleAndInitPlanet๋ฐฉ๋ฒ•.

  5. ๊ตฌํ˜„readKeyFromConsoleAndInitPlanet๋ฉ”์†Œ๋“œ ๊ธฐ๋Šฅ:

    • 5.1. ์ฝ˜์†”์—์„œ ํ•˜๋‚˜ ์˜ ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฝ๊ธฐ

    • 5.2. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์™€ ๊ฐ™์œผ๋ฉดํ–‰์„ฑ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์ˆ˜, ์ ์ ˆํ•œ thePlanet ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ž‘์—… ์กฐ๊ฑด์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์€ ํ›„ ์—ฌ๊ธฐ์—์„œ Singleton์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Sun , Moon , Earth ํด๋ž˜์Šค ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค . ํƒœ์–‘/๋‹ฌ/์ง€๊ตฌ๋ฅผ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌผ๋ก  ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ์Šคํƒ€์›Œ์ฆˆ ๋ฒ„์ „์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ์šฐ๋ฆฌ๋Š” ํ„ฐ๋ฌด๋‹ˆ์—†๋Š” ์ƒํ™ฉ์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„ธ ๋‹จ๊ณ„๋กœ Java์—์„œ Singleton ํŒจํ„ด ๊ตฌํ˜„ํ•˜๊ธฐ Java์—์„œ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ•ญ์ƒ ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Singleton ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Singleton ์˜ ๋ชจ๋“  ๊ตฌํ˜„์€์ƒ์„ฑ์ž๋ฅผ ์ˆจ๊ธฐ๊ณ  ์‹ฑ๊ธ€ํ†ค ๊ฐœ์ฒด์˜ ์ˆ˜๋ช…์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ณต๊ฐœ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒˆ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ๋“  ๊ฐœ์ฒด๋ฅผ "ํŒŒ๊ธฐ"ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. Singleton ์— ์•ก์„ธ์Šค ํ•˜๋ฉด ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜(ํ”„๋กœ๊ทธ๋žจ์— ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ) ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.
  1. ํด๋ž˜์Šค์— ๋‹จ์ผ ๊ฐœ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ์ „์šฉ ์ •์  ํ•„๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. (๊ธฐ๋ณธ) ์ƒ์„ฑ์ž๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance;
    private LazyInitializedSingleton(){} // #2
    } 
    
  3. ์‹ฑ๊ธ€ํ†ค์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ •์  ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

    
    public class LazyInitializedSingleton {
        private static LazyInitializedSingleton instance;
            private LazyInitializedSingleton() {}
            public static LazyInitializedSingleton getInstance() { // #3
            if (instance == null) { // If the object has not yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
    
์œ„์˜ ์˜ˆ์ œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ˆจ๊ธฐ๊ณ  ํ‘œ์ค€ ์ƒ์„ฑ์ž ๋Œ€์‹  ์ž์ฒด ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ์„œํˆฌ๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๋Š” CodeGym ํ•™์ƒ๋“ค์ด ์ด ํŒจํ„ด(๋ฐ ์ผ๋ฐ˜์ ์ธ ๋””์ž์ธ ํŒจํ„ด)๊ณผ ์ ‘์ด‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ณต์žกํ•œ ์‹ฑ๊ธ€ํ†ค ๊ตฌํ˜„์˜ ๋‰˜์•™์Šค๋Š” ์—ฌ๊ธฐ์—์„œ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ ์ด ํŒจํ„ด์„ ๋” ๋‹ค๋“ฌ์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ(์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ ์ฐธ์กฐ)์—์„œ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹ฑ๊ธ€ํ†ค ๋ฉ”์„œ๋“œ์— ๋™์‹œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ์˜ ๊ฐœ๋ณ„ ์Šค๋ ˆ๋“œ๊ฐ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ์‹ฑ๊ธ€ํ†ค์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ์ „ํžˆ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค =)

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ... ๊ธฐ์žฅ์ด ๋ฌผ์–ด๋ณธ ์ด ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™”๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ง€์—ฐ ์ดˆ๊ธฐํ™”๋Š” ์ง€์—ฐ ์ดˆ๊ธฐํ™”๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ธ ์ž‘์—…(๋ฐ ๊ฐœ์ฒด ์ƒ์„ฑ์€ ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ธ ์ž‘์—…)์ด ์‚ฌ์ „์ด ์•„๋‹Œ ์š”์ฒญ์— ๋”ฐ๋ผ ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŠธ๋ฆญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Singleton Java ์ฝ”๋“œ์—์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ์š”? ์ฆ‰, ์šฐ๋ฆฌ์˜ ๊ฐ์ฒด๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•ก์„ธ์Šค๋˜๋Š” ์‹œ์ ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™”๊ฐ€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ์— ๋‹จ๋‹จํžˆ ๋ฌถ์—ฌ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค . Lazy initialization์€ Proxy๋‚˜ Factory Method์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ƒ์„ฑ ๋””์ž์ธ ํŒจํ„ด์—์„œ๋„ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ด๊ฒƒ๋„ ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค =)