์ด ๊ธฐ์ฌ๋ ๋์์ธ ํจํด์ ๊ฐ๋
์ ์ฒ์ ์ ํ๋ ์ฌ๋,
์ฑ๊ธํค ์ด๋ผ๋ ์ฉ์ด๋ฅผ ๋ค์ด ๋ณธ ์ ์ด ์๋ ์ฌ๋ ๋๋ ์ด๋ป๊ฒ๋ ์ฑ๊ธํค ํจํด์ ๊ตฌํํ์ง๋ง ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํดํ์ง ๋ชปํ๋ ์ฌ๋์ ๋์์ผ๋ก ํฉ๋๋ค. ํ์! 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์ ๋ฏธ๋ ํ๋ก๊ทธ๋จ์ด ์กด์ฌํ๋ค๋ ์ฌ์ค์กฐ์ฐจ ๋ชจ๋ฅธ ์ฑ ์ด๋ฏธ ์๋ฐฑ ๊ฐ์ ๋ฏธ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋์์ธ ํจํด์ด ๋ง์คํฐ์ ์๋ง์ถ์ด๋ฅผ ๊ตฌ๋ณํ๋ ์ผ์ข
์ ๋๊ตฌ์์ ์์ฌํฉ๋๋ค. ๋์์ธ ํจํด์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ์ ์ ํ๊ฒ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค. ์ฆ, ํจํด์ ์๋ฉด ์๊ฐ์ด ์ ์ฝ๋ฉ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ๊ทธ๋ค์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ธ๋์ญ๊ณผ ์ซ์๋ก ์์ ๋ง์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ํ ์ ํ๊ฑฐ๋ ์ค๋ซ๋์ ์ดํด๋๊ณ ์ค๋ช
๋ ๊ฒ์ ๊ตฌํํ ์ ์์ต๋๋ค. ๋์์ธ ํจํด๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ํ ๋์์ธ ํจํด์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ ํ์คํ๋๊ณ ์ ์ ํ ํจํด์ ์ฌ์ฉํ ๋ ํจํด์ ์ผ๋ฐ์ ์ธ ํจ์ ์ด ์ค๋ ์ ์ ์๋ณ๋๊ณ ์ ๊ฑฐ๋์๊ธฐ ๋๋ฌธ์ ์ค์ํ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค. ๋ฌด์๋ณด๋ค๋ ํจํด์ ๋ํ ์ง์์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ก๋ฅผ ๋ ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋๋ฃ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ธด ์ค๋ช
์ ์ ๊ณตํ๋ ๋์ ๋จ์ํ ํจํด์ ์ด๋ฆ์ ๋งํ ์ ์์ต๋๋ค. ์์ฝํ๋ฉด ๋์์ธ ํจํด์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช
ํ์ง ๋ง๊ณ ๋์ ํ์ค ์๋ฃจ์
์ ์ฌ์ฉํ์ญ์์ค.
- ์ฝ๋ ํ์คํ;
- ์ฉ์ด ํ์คํ;
|
์ด ์น์
์ ๋ง๋ฌด๋ฆฌํ๊ธฐ ์ํด ๋์์ธ ํจํด์ ์ ์ฒด ๋ณธ๋ฌธ์ ์ธ ๊ฐ์ ํฐ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฑ๊ธํค ํจํด
์ฑ๊ธํค์ ์์ฑ ํจํด ์
๋๋ค . ์ด ํจํด์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์๋์ง ํ์ธํ๊ณ ์ด ๊ฐ์ฒด์ ๋ํ ์ ์ญ ์ก์ธ์ค ์ง์ ์ ์ ๊ณตํฉ๋๋ค. ์ค๋ช
์์ ์ด ํจํด์ด ๋ค์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ์ ์ฉ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด ๋ช
ํํด์ผ ํฉ๋๋ค.
- ํ๋ก๊ทธ๋จ์์ ํน์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํ๋๋ง ๋ง๋ค๋๋ก ์๊ตฌํ ๋. ์๋ฅผ ๋ค์ด ์ปดํจํฐ ๊ฒ์์๋ Hero ํด๋์ค์ ๊ฒ์์ ์ ์ผํ ์์
์ ์ค๋ช
ํ๋ ํ๋์ Hero ๊ฐ์ฒด๋ง ์์ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด์ ๋ํ ์ ์ญ ์ก์ธ์ค๋ฅผ ์ํ ์ง์ ์ ์ ๊ณตํด์ผ ํ๋ ๊ฒฝ์ฐ. ์ฆ, ํ๋ก๊ทธ๋จ์ ์ด๋์์๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. ์์ฝ๊ฒ๋ ์ ์ญ ๋ณ์๋ ์ฐ๊ธฐ ๊ธ์ง๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์ ์ญ ๋ณ์๋ฅผ ๋ง๋๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋๊ตฌ๋ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก ๊ฐ์ฒด์ ์ ์ญ ์ก์ธ์ค ์ง์ ์ด ์์ค๋ ์ ์์ต๋๋ค. Singleton ์ ์ด๋ฌํ ์์ฑ์ ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๊ป ์๋ํ๋ ๊ฐ์ฒด๊ฐ ์๊ณ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ์ ํ์ํฉ๋๋ค. Singleton ์ ์๋ฌด๋ ์ด์ ์ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋์ฒดํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ก ํฉ๋๋ค.
๋ฐ๋ผ์
Singleton ์ ๋ค์ ๋ ๊ฐ์ง ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ์ต๋๋ค. ํ๋ก๊ทธ๋จ์๋ ํน์ ์ข
๋ฅ์ ๊ฐ์ฒด ์ค ํ๋๋ง ์์ด์ผ ํ๊ณ ์ ์ญ์ ์ผ๋ก ์ก์ธ์คํ ์ ์์ด์ผ ํฉ๋๋ค. ๋ ๋ฒจ 15์ ์์์ ์ ์ฅ์ ๋ค์ ์์
์ ๋ํด ์ด ํจํด์ ๊ตฌํํ๋๋ก ์์ฒญํฉ๋๋ค.
-
์ง์ฐ ์ด๊ธฐํ๊ฐ ์๋ ์ฑ๊ธํค ์ ์๋ฅผ ์ฐพ์ผ์ญ์์ค .
-
๋์ผํ ์์น์ ์ฌ์ฉํ์ฌ ๋ณ๋์ ํ์ผ์ ์ธ ๊ฐ์ ์ฑ๊ธํค ํด๋์ค(Sun, Moon, Earth)๋ฅผ ๋ง๋ญ๋๋ค.
-
๊ตฌํํ๋คํ์ฑSun , Moon ๋ฐ Earth ํด๋์ค ์ ์ธํฐํ์ด์ค .
- ์๋ฃจ์
ํด๋์ค ์ ์ ์ ๋ธ๋ก์์readKeyFromConsoleAndInitPlanet๋ฐฉ๋ฒ.
-
๊ตฌํreadKeyFromConsoleAndInitPlanet๋ฉ์๋ ๊ธฐ๋ฅ:
-
5.1. ์ฝ์์์ ํ๋ ์ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์ ์ฝ๊ธฐ
-
5.2. ๋งค๊ฐ๋ณ์๊ฐ ๋ค์ ์ค ํ๋์ ๊ฐ์ผ๋ฉดํ์ฑ์ธํฐํ์ด์ค์ ์์, ์ ์ ํ thePlanet ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
์์
์กฐ๊ฑด์ ์ฃผ์ ๊น๊ฒ ์ฝ์ ํ ์ฌ๊ธฐ์์
Singleton์ด ํ์ํ ์ด์ ๋ฅผ ๋ช
ํํ๊ฒ ์ ์ ์์ต๋๋ค.
์ค์ ๋ก Sun ,
Moon ,
Earth ํด๋์ค ๊ฐ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ผ๋ ์์ฒญ์ ๋ฐ์์ต๋๋ค . ํ์/๋ฌ/์ง๊ตฌ๋ฅผ ํ๋๋ง ๋ง๋ค์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ์ด์น์ ๋ง์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฌผ๋ก ๋น์ ์ด ๋น์ ์ ์คํ์์ฆ ๋ฒ์ ์ ์์ฑํ์ง ์๋ ํ ์ฐ๋ฆฌ๋ ํฐ๋ฌด๋์๋ ์ํฉ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค.
์ธ ๋จ๊ณ๋ก Java์์ Singleton ํจํด ๊ตฌํํ๊ธฐ Java์์๋ ์์ฑ์๊ฐ ํญ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ Singleton ๋์์ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์
Singleton ์ ๋ชจ๋ ๊ตฌํ์์์ฑ์๋ฅผ ์จ๊ธฐ๊ณ ์ฑ๊ธํค ๊ฐ์ฒด์ ์๋ช
์ ์ ์ดํ๋ โโ๊ณต๊ฐ ์ ์ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ์๋ก ๋ํ๋๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ "ํ๊ธฐ"ํ๋ ๊ฒ์ผ๋ก ์์ฝ๋ฉ๋๋ค.
Singleton ์ ์ก์ธ์ค ํ๋ฉด ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋(ํ๋ก๊ทธ๋จ์ ์ด๋ฏธ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ) ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
-
ํด๋์ค์ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ์ ์ฉ ์ ์ ํ๋๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
public class LazyInitializedSingleton {
private static LazyInitializedSingleton instance; // #1
}
-
(๊ธฐ๋ณธ) ์์ฑ์๋ฅผ ๋น๊ณต๊ฐ๋ก ๋ง๋ญ๋๋ค. ์ด๋ ํด๋์ค ์ธ๋ถ์์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
public class LazyInitializedSingleton {
private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
-
์ฑ๊ธํค์ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํ ์ ์ ์์ฑ ๋ฐฉ๋ฒ์ ์ ์ธํฉ๋๋ค.
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์ ๊ฐ์ ๋ค๋ฅธ ์์ฑ ๋์์ธ ํจํด์์๋ ์ฌ์ฉ๋์ง๋ง ์ด๊ฒ๋ ๋ ๋ค๋ฅธ ์ด์ผ๊ธฐ์
๋๋ค =)
GO TO FULL VERSION