๐ฎ ํน์ง/๋ชฉ์ 4~5 min read
๐ ์ฝ๋/๋์์ฑ 8 min read
์ฑ๊ธํค ํจํด์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, ์ด ํจํด์ 'ํ๋'์ ๊ด๋ จ์ด ๊น์ต๋๋ค.
์ด ํจํด์ ๊ฐ์ฒด๋ฅผ ํ๋๋ง ๋ง๋ค์ด์ ์ด๋ฅผ ์ฌ์ฌ์ฉํ๋ ํจํด์
๋๋ค.
์ฐ๋ฆฌ๋ ์ด ํจํด์ ์ค๋ช ํ๋ ๊ณผ์ ์์ '์ ์ผ ๊ฐ์ฒด'๋ฅผ '์ฑ๊ธํค'์ด๋ผ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
์ ์ฐ ์ธ๋ ฅ์ด ํ ๋ช
๋ฟ์ธ ํ์ฌ์ ํ๊ฒฝ๊ณผ๋ ๋ฎ์์ต๋๋ค.
(์ฅ) ๊ฐ์ฒด ์์ฑ ๋น์ฉ์ ์ ๊ฐ
์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ฉด, ๊ณณ๊ณณ์์ ๋งค๋ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋น์ฉ์ ๋ค์ผ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๊ฑด ์ฌ์ค ์ฑ๊ธํค์ด๋ผ์ ์ป๋ ์ฅ์ ์ ์๋๊ณ , ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ์ป๋ ์ฅ์ ์
๋๋ค.
๋ค๋ฐ๋ฅด๋ ์ฅ์ ์ผ๋ก ๋ก์ง ๊ณณ๊ณณ์์ ๊ฐ์ฒด ์์ฑ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ์ฒด ์์ฑ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ๋น์ฉ์ ์ ๊ฐ์๋ ์ํฅ์ ์ค๋๋ค. ์ฆ, (๋งค๋ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ณด๋ค) ๋ฉ๋ชจ๋ฆฌ๋ ์๋ผ๋ฉด์ ์กฐ๊ธ ๋ ๋น ๋ฅธ ๋์์ ์ป์ ์ ์์ต๋๋ค.
(์ฅ) ์ ์ผ ๊ฐ์ฒด์ ๋ณด์ฅ๊ณผ ๊ณต์
๊ทธ ์ธ ์ฅ์ ์ผ๋ก๋ ์ ์ผ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ณต์ ํ๊ธฐ์ ์ฉ์ดํ ๊ฐ์ฒด์ด๊ธฐ๋ ํฉ๋๋ค. ์ด ๊ฐ์ฒด๊ฐ ์ ๊ฐ์ฒด์ธ์ง ๊ฑฑ์ ํ ๊ฒ ์์ด, ์ด ๋ฃจํด์์๋ ์ ๋ฃจํด์์๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์๊ฒ ์ฃ .
(๋จ) ์ ์ผ ๊ฐ์ฒด์ ๊ณต์
์ด๋ ๋์์ ๋จ์ ์ด ๋ ์ ์๋๋ฐ ์ด ๊ฐ์ฒด์ ์์์ด ๋ฌด๋ถ๋ณํ๊ฒ ๊ณณ๊ณณ์์ ๋ณ๊ฒฝ๋ ์ฌ์ง๊ฐ ์๋ค๋ฉด ์๋ก ๋ค๋ฅธ ๋ฃจํด์์ ์ํฅ์ ๋ฐ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ด ๋ ์๋ง๊ฒ ์ฌ์ฉํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค(์๋ชป ์ฌ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ฌธ์ ๋ผ๋ ๊ฒ).
๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ์ง ์๊ธฐ
๊ทธ๋์ ๋ฌด๋ถ๋ณํ๊ฒ ์ฑ๊ธํค์ ํํ๋ ๊ฒฝ์ฐ๋ ์ ์๊ณ , ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ด๋ถ ํ๋๋ณด๋ค๋ ๋ถ๋ณ์ฑ ํ๋์ ๋์(๋ฉ์๋) ์์ฃผ๋ก ์ ๊ณตํ๋ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ๋ํ ํธ์
๋๋ค. (์คํ๋ง์์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋น์ค ๊ฐ์ฒด ๋ฑ)
(๋จ) ์์ฑ ์ ์ง์ฐ ๋ก๋ฉ ๋ฐ ๋์์ฑ์ ๋ณด์ฅํ๋ ๋ฐ์ ์ฃผ์๊ฐ ํ์ํจ.
์ถ๊ฐ์ ์ธ ๋จ์ ์ผ๋ก๋ ์์ฑ์ ์์ด์ ์ฃผ์๊ฐ ํ์ํ๋ค๋ ์ ์ ๋์ธ๋ฐ, ์ค๋ ์ด ๊ธ์์ ์ด ๋ฌธ์ ๋ฅผ ์๋ฐ์์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋ฉด ๋๋์ง ๋ค๋ฃน๋๋ค.
PS. ์คํ๋ง์์๋ โ๏ธ
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์คํ๋ง์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์คํ๋ง์ ์ฃผ์ ์ปจํ ์ด๋(IoC ์ปจํ ์ด๋)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์์กด์ฑ ๊ฐ์ฒด Bean๋ค์ ์ฑ๊ธํค ๊ฐ์ฒด๋ก ์ทจ๊ธํฉ๋๋ค.
๋ฌผ๋ก ์ฐ๋ฆฌ๊ฐ ์ด ํด๋์ค๋ฅผ ์์ฑํ ๋ ์์ฑ์๋ฅผ ์ง์ ์ ์ผ๋ก ๋ง์ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์, ์ถ๊ฐ์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๋ก์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค๋ง, ์ด ๊ฒฝ์ฐ ์คํ๋ง์ด ์ด ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก
Bean์ผ๋ก ์ทจ๊ธํ์ง ์์ ๊ฒ์ ๋๋ค.(์์ฑ์๋ฅผ ๋ง์ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์จ์ ํ ์ฑ๊ธํค ํจํด์ ์ ์ฉํ ๊ฒ์ ์๋๊ณ , ์ฑ๊ธํค ์ปจํ ์ด๋๋ฅผ ์์ฑํด ์ทจ๊ธํ ๊ฒ์ ๋๋ค.)
๊ทธ๋ฐ๋ฐ ๊ฐ์ฒด๋ฅผ ํ๋๋ง ๋ง๋ค์ด์ ๊ทธ ๊ฐ์ฒด๋ฅผ ํตํด ํด๋์ค์ ์จ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ ์ค๋ช ์์ ํ ๊ฐ์ง ์๋ฌธ์ ์๊ฐํด ๋ณผ ์ ์์ต๋๋ค.
์ด ํด๋์ค์ ๋ชจ๋ ๋ฉค๋ฒ ๋ณ์์ ๋ฉ์๋๋ฅผ
static์ผ๋ก ์ทจ๊ธํ๋ฉด ๋์ผํ ๊ฒ ์๋๊น?
์ด๋ฌํ ์๋ฌธ์
๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ static์ ์ผ๊ฐ๋ ๊ฒ์ static์ ์ฌ๋ฌ ์ฝ์ ๋๋ฌธ์ด์ฃ .
static์ ์ธ์ ์ด๋์์ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง ๋ชจ๋ฅด๋(final์ด ์๋๋ผ๋ฉด) ๋ฐ์ดํฐ๊ฐ ๋จ๊ณผ ๋์์ ์๋ช
์ฃผ๊ธฐ๊ฐ ์๋์ ๋นํด ๊ธธ ์๋ฐ์ ์์ต๋๋ค. ์ด๋ฌํ ํน์ฑ์ ์ปดํ์ผ๋ฌ์ ์ต์ ํ ์ ๋ต์๋ ํผ๋์ ์ฌ์ด์ค ์ ์์ฃ . ๋ฐ๋ผ์ static์ static final์ ์ฌ์ฉํ ๋๋ฅผ ์ ์ธํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ผญ ํ์ํ ํจํด์ด ์๋ ๋ ์ผ๊ฐ๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค.
์์ธํ ์ค๋ช
์ ๋ณธ ๊ธ์ ์ทจ์ง์ ๋นํด ์ค๋ช
์ด ๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฒ ๋จ๋ฝ์ ์๋ตํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ ๋ถ๋ค์, ์ฑ๊ธํค์์ static์ ์ผ๊ฐ๋ ์ด์ ๋ฅผ ๋ ๋์, ์ฝ๋ ์์ฑ ์ ๊ฐ๋ฐ์๊ฐ static ์ฌ์ฉ์ ์ผ๊ฐ๋ ์ด์ ์์ฃผ๋ก ์กฐ์ฌํด ๋ณด์ค ์ ์์ต๋๋ค.
์ฑ๊ธํค ํจํด์ ๊ธฐ๋ณธ์ ์ธ ์ค๋ช ์ ์ํ ์ฝ๋์ ๋๋ค.
static).static).๊ทธ๋ฌ๋ฉด ์ด ๊ฐ์ฒด๋ ์ด ํด๋์ค์ ์๋ ์ฌ๋ฌ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ non-static์ผ๋ก ์ ๊ณตํฉ๋๋ค.
public class MyExample {
// [1] ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ฌ๊ธฐ์์ ํ๋ ๋ง๋ญ๋๋ค.
private static final MyExample INSTANCE = new MyExample();
// [2] (ํต์ฌ) ๋ค๋ฅธ ๊ณณ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ก private ์์ฑ์!
private MyExample() {}
// [3] ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ ์ ์ (static) ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
public static MyExample getInstance() {
return INSTANCE;
}
// (์ด์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์์ฑํฉ๋๋ค.)
}
๊ทธ๋ฌ๋ ์ด ๋ฐฉ์์ ํด๋์ค๋ง ์ฌ์ฉํ๋ ์์ ์๋ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์๋ฐ๋ ํด๋์ค๋ฅผ ๋ฐํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆด ๋(= ํด๋์ค ๋ก๋ ํ์), ๊ทธ ํด๋์ค์ static ํ๋๋ ์ด๊ธฐํํด์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฐ๋ฆฌ๋ '์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์์ '์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ง์ฐ๋ก๋ฉ์ ์๊ฐํฉ๋๋ค.
๋ค์ ์ฝ๋๋ ์ด ๊ฐ์ฒด๋ฅผ ์ค์ ์ฌ์ฉํ๋ ์์ ์ ๊ฐ์ฒด ์์ฑ์ ์ํํ๋๋ก ๋ณ๊ฒฝํฉ๋๋ค.
public class MyExample {
// [1] ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ง ์ ๋ง๋ญ๋๋ค. ์ด๋ null๋ก ์ด๊ธฐํ๋๋ ์๋ฐ ํน์ง์ด ์์ต๋๋ค.
private static MyExample INSTANCE; // (final์ ์ฌ์ฉํ์ง ์์ต๋๋ค.)
private MyExample() {}
public static MyExample getInstance() {
// [2] null์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ด์ต๋๋ค.
if (INSTANCE == null) {
INSTANCE = new MyExample(); // ์ด์ INSTANCE๋ null์ด ์๋๋๋ค.
}
// ๊ฐ์ฒด๋ฅผ ๋ฏฟ๊ณ ๋ฐํํ ์ ์๊ฒ ๋๊ฒ ์ฃ . ์๋ง๋์?
return INSTANCE;
}
}
์ ์ฝ๋์์๋ getInstance() ๋ฉ์๋๋ฅผ ์ฒ์์ผ๋ก ์ฌ์ฉํ ๋ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค. ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์์ง๋ง, ๋ง์ฝ ๋ ๋ช
์ด์์ ์ฌ์ฉ์๊ฐ ๋น์ทํ ์์ฒญ์ ๋ณด๋ด์ ๊ฐ ๋ฃจํด์ด ๋์์ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค ํ๋ค๋ฉด ์ด๋จ๊น์?
์ฌ์ฉ์์ ๊ฐ ์์ฒญ์ ๊ฐ๊ฐ์ ์ค๋ ๋์์ ์ฒ๋ฆฌ๋๋ค๋ ๊ฒ์ ์๊ฐํ๋ฉฐ ๋ค์ ํ๋ฆ์ ์ดํด๋ด ์๋ค.
โฌ๏ธ ๋ ์ด์์ ์ค๋ ๋๊ฐ ๋น์ด ์๋ ์ฑ๊ธํค ์๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํฉ๋๋ค.

โฌ๏ธ ๋ ์ด์์ ์ค๋ ๋๊ฐ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ๊ฐ์ ์์ฑํ์ฌ ์ฌ์ฉํ์์ต๋๋ค.

โฌ ์ด ๊ณผ์ ์์ ์ด๋ฏธ ๋ ์ด์ '์ฑ๊ธํค'์ด ์๋ ๊ฐ์ฒด๊ฐ ํ๋๋ ์กด์ฌํ์ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ์ฑ๊ธํค ๊ฐ์ฒด ๋ฑ์ ์์ฑํ ๋ ๋ฐ์ํ ์ ์๋ '๋์์ฑ ๋ฌธ์ '์
๋๋ค.
๋คํํ ์๋ฐ์์๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋์ฒํ ์ ์๋ ์ฌ๋ฌ ์๋จ์ด ์๋๋ฐ, ์๋ ์ฝ๋์์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
์์ฃผ ๋ฌด์ํ ํด๊ฒฐ ๋ฐฉ์์
๋๋ค.
๊ทธ๋ฅ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ํ์ ์์ฒด๋ฅผ ์ค๋ ๋๋ค์ด ํ ์ค๋ ๋์ฉ ์ค์ ์์ ์ฒ์ฒํ ๋ฐ์๊ฐ๊ฒ ํ๋ ๊ฒ๋๋ค.
public class MyExample {
private static MyExample INSTANCE;
private MyExample() {}
// synchronized ์์์ด๋ฅผ ํตํด, ์ด ๋ฉ์๋๋ ๋์์ ํ๋์ ์ค๋ ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
public static synchronized MyExample getInstance() {
if (INSTANCE == null) {
// ์ฌ๊ธฐ์ ๋ ์ด์์ ์ค๋ ๋๊ฐ ๋ค์ด์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋์ ๊ฐ์ฒด์์ ๋ณด์ฅํฉ๋๋ค.
INSTANCE = new MyExample();
}
// ์ด๋ฒ์ ์ ๋ง๋ก ๊ฐ์ฒด๋ฅผ ๋ฏฟ๊ณ ๋ฐํํ ์ ์๊ฒ ๋ฉ๋๋ค.
return INSTANCE;
}
}
๊ฐ๋จํ ํค์๋ ํ๋๋ฅผ ์ถ๊ฐํด์ ์ฑ๊ธํค ๊ฐ์ฒด์ ๋์ ์์ฑ์ ๋ง์ ์ ์์๋๋ฐ, ๋์์ ์ฌ์ฉ๋ ์ ์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ์์ฒญ๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ ์ ์์ต๋๋ค. 100๋ง ๋ช ์ ์ฌ์ฉ์๊ฐ ๋์์ ๋น์ทํ ์์ฒญ์ ๋ณด๋๋ค๋ฉด ์ด๋จ๊น์? ๋์์ ์ฒ๋ฆฌํ ์ ์์๋ ์ผ๋ ๋ชจ๋ ์ด ๊ณผ์ ์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์ฒ๋ฆฌํด์ผ ํ์ ๊ฒ์ ๋๋ค.
์ ์ด๋ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๊ธฐ ์ํด์๋ ์ด๋กํ ๊น์?
์ด๋ฏธ INSTANCE๊ฐ ์ฑ๊ธํค ๊ฐ์ฒด๋ก ์ด๊ธฐํ๋์ด ์์ ๋๋ ์ฌ๋ฌ ์ค๋ ๋์ ๋์ ์ ์์ ํ๋ฝํด๋ ๋ ๊ฒ์
๋๋ค.
public class MyExample {
private static MyExample INSTANCE;
private MyExample() {}
public static MyExample getInstance() {
if (INSTANCE == null) {
// [A] ์ฌ๊ธฐ๊น์ง ์๊น์ฒ๋ผ ๋์์ ๋ ์ด์์ ์ค๋ ๋๊ฐ ๋ค์ด์ฌ ๋๋ ์์ ์ ์์ต๋๋ค.
synchronized (INSTANCE) { // ์ด ์์์ ๋ํด์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๊ฒ ํ๊ณ
// ๊ทธ๋ผ์๋ [A] ๊ตฌ๊ฐ์์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ ์ ์์ผ๋๊น
if (INSTANCE == null) { // ์ฌ๊ธฐ์ ํ ๋ฒ ๋ ์ฒดํฌํด์
INSTANCE = new MyExample(); // ์ง์ง ์ ์ผํ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
}
}
}
// ์ if๋ฌธ ๋ธ๋ญ์ INSTANCE๊ฐ `null`์ด ์๋ ๋,
// `synchronized () {...}` ๋ธ๋ญ์ ์๋ตํ ์ ์๊ฒ ํฉ๋๋ค.
// ๊ฐ์ฒด๋ฅผ ๋ฏฟ๊ณ ๋ฐํํ ์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๊ฒ๋ ๋์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ฌ์ฉํ ์ ์๊ณ ์.
return INSTANCE;
}
}
๋ฐ๊นฅ์ชฝ if๋ฌธ: ์ด๋ฏธ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ์๋ค๋ฉด, ๋ ์ด์ synchronized ๋ธ๋ญ์ ์ง์
ํ ํ์๊ฐ ์๊ฒ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
์์ชฝ if๋ฌธ: ๋ฐ๊นฅ์ชฝ if๋ฌธ์ ๋์์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ฒ์ด ์๋์์ต๋๋ค. ๋ฐ๋ผ์ ์์ชฝ if๋ฌธ ์
๊ตฌ์๋ ๋์์ ๋ฐ๊นฅ์ชฝ if๋ฌธ์ ํต๊ณผํ๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ค์ ์ฐจ๋ก์ ๋ค๊ฐ์ฌ ์๋ ์์ต๋๋ค. ์ฆ ๋ ์ด์์ ์ค๋ ๋๊ฐ synchronized ๋ธ๋ญ์ ์ฐจ๋ก๋ก ํ๋์ฉ ์ง์
ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋จผ์ ๋ฐฉ๋ฌธํ ์ค๋ ๋๊ฐ ์ด๋ฏธ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ ๋ ๋ค์์ ์จ ์ค๋ ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ ์ ์๋๋ก ์์ชฝ if๋ฌธ์ผ๋ก ๋ง์ ๋ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฑ๊ธํค ํจํด์ ์ฒ์ ์ค๋ช
ํ ๋ ์์์ ๋ดค๋ ์ฝ๋๋ฅผ ๊ธฐ์ตํ์๋์?
๊ทธ ์ฝ๋๊ฐ ๋น๋ก '์ง์ฐ ๋ก๋ฉ'์ด๋ผ๋ ์ด์ ์ ์๋๋ผ๋, ์ด๋ฏธ '์ค๋ ๋ ์ธ์ดํ'๋ฅผ ๋ณด์ฅํ๊ณ ๋ ์์ต๋๋ค.
์ด๊ฒ์ ์ ๊ฐ ์ด๋ป๊ฒ ์๊น์?
์ฌ์ค ๊ทธ๋ฅ, ์๋ฐ๊ฐ ๊ทธ๋ ๊ฒ ์ค๋ช
ํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋ฐ๋ ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ 'ํด๋์ค ๋ก๋ ํ์'์๋ ๋์์ฑ์ ๋ณด์ฅํด ์ค๋๋ค.
์ฆ, ์ฐ๋ฆฌ๊ฐ ๋๋ฌด ๊ณ ์ํ ํ์ ์์ด ์ด 'ํด๋์ค ๋ก๋ ํ์'์ ์ด์ฉํ๋ฉด ๋๋ ๊ฒ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ '์ง์ฐ(lazy) ๋ก๋ฉ'๊ณผ '์ค๋ ๋ ์ธ์ดํ(thread-safe)' ๋ชจ๋์
๋๋ค.
๋ฐ๋ผ์ '์ธ์คํด์ค๊ฐ ์ฒ์ ์ฌ์ฉ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฒ์ ๋ก๋๋๋ ํด๋์ค'๊ฐ ์๋ค๋ฉด ์๋ฌด ๊ฑฑ์ ์์์ ๊ฒ์ด๋ ๋ง์ด์ฃ .
// ์ฝ๋๋ ๊ด๋ก๋ฅผ ๋ฌด์ํ๊ณ ์ค๋ช
์์์ ๋ง์ถ์์ต๋๋ค.
public class MyExample {
// [1] ์ด์ ์ธ์คํด์ค๋ ์ฌ๊ธฐ ์์ต๋๋ค.
// [2] ๊ทธ๋ฅ ์์ฑ์๋ ๋ง์ ๋ก์๋ค. (์๋ ํญ์ ์ฑ๊ธํค ํจํด์ ํต์ฌ์
๋๋ค.)
private MyExample() {}
// [3] ๋ด๋ถ ํด๋์ค๋ ์ private ์์ฑ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
private static class Holder {
// ์ด์ ์ด๊ณณ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
private static final MyExample INSTANCE = new MyExample();
}
// [4] ๊ทธ๋๋ ๋ชฉ์ ์ด ๋๋ ํ๋ ๋ฒจ ํด๋์ค๊ฐ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๊ธด ํด์ผ ํ์ฃ .
public static MyExample getInstance() {
// Holder ํด๋์ค๋ ์ด๋ ๊ฒ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ ๋ ๋ง๊ณค ์ ์ฐ์ด๋๊น,
// ์๋ ์ฝ๋์ ์ํด์ (์ฒ์ ์ฌ์ฉ๋ ๋) ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋๋ค.
return Holder.INSTANCE; // ์ด๋ ๋ง๊ณค ๋ฏธ๋ฆฌ ์์ฑ๋ ์ผ ์๋ ๊ฑฐ์ฃ .
}
}
INSTANCE๋ Holder๋ผ๋ ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋ ์ด๊ธฐํ๋ฉ๋๋ค.Holder๋ผ๋ ํด๋์ค๋ getInstance()๋ผ๋ ๋ฉ์๋๊ฐ ์ฒ์ ํธ์ถ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋๋ค.๊ทธ๊ฒ์ด ์๋ฐ์ ํน์ง์ด๊ฑฐ๋ ์. ๋ง์ด๋ค ํด๋์ค๊ฐ import ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค๊ณ ์คํดํ๋๋ฐ, ์ค์ ๋ก๋ ์ค์ง์ ์ผ๋ก ์ฒ์ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋๋ค.
์ด๋ก์จ ์ด Holder๋ผ๋ ๋ด๋ถ ํด๋์ค๊ฐ ๋ค์ ๋ ํน์ฑ์ ๋ชจ๋ ๋ณด์ฅํด ์ค๋๋ค. ๊ทธ๋ฅ ์์ ์ด ํด๋์ค๋ผ๋ ์ด์ ๋ง์ผ๋ก์. ๊ทธ๊ฒ์ด ์๋ฐ์ด๋๊น.
Holder๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ฉด์INSTANCE๋ฅผ ์์ฑํ๋๊น.
๋ง์ง๋ง ๊ฑฐ ์ฐ์ธ์. ๐ ๐ ๐ ~
์์ ์ ๋ฆฌํ ์ฝ๋:
public class MyExample {
// [1] ์์ฑ์ private
private MyExample() {}
public static MyExample getInstance() {
// [2] ๊ฐ์ฒด ์ ๊ณต(๋ด๋ถ ํด๋์ค ๊ฑฐ)
return Holder.INSTANCE;
}
// [3] ์ฑ๊ธํค ๊ฐ์ฒด ๋ด๋ ํด๋์ค (ํด๋์ค ๋ก๋ ํ์ ํ์ฉ)
private static class Holder {
private static final MyExample INSTANCE = new MyExample();
}
}
๋ฐ๋ด