[ํค๋ํผ์คํธ ๋์์ธ ํจํด] 05. ์ฑ๊ธํด ํจํด
by Hi.Claire๐ ํค๋ํผ์คํธ ๋์์ธ ํจํด (์๋ฆญ ํ๋ฆฌ๋จผ ์ธ, ํ๋น๋ฏธ๋์ด)
1. ์ฑ๊ธํด ํจํด์ ์ ์
์ฑ๊ธํด ํจํด(Singleton Pattern)
์ฑ๊ธํด ํจํด(Singleton Pattern)์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋จ ํ๋๋ง ๋ง๋ค๊ณ , ๊ทธ ์ธ์คํด์ค๋ก์ ์ ์ญ ์ ๊ทผ์ ์ ๊ณตํ๋ค.
์ฑ๊ธํด ํจํด์ด ํ์ํ ์
์ค๋ ๋ ํ(Thread pool), ์บ์(Cache), ๋ํ์์, ์ฌ์ฉ์ ์ค์ , ๋ ์ง์คํธ๋ฆฌ ์ค์ ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด, ๋ก๊ทธ ๊ธฐ๋ก์ฉ ๊ฐ์ฒด, ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ ๋ฑ์ ๊ฐ์ฒด๋ ํ๋๋ง ์์ด๋ ์ ๋์๊ฐ๋ค.
์คํ๋ ค ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ์ธ ๋ ์ธ์คํด์ค๊ฐ 2๊ฐ ์ด์์ด๋ฉด ํ๋ก๊ทธ๋จ์ด ์ด์ํ๊ฒ ๋์๊ฐ๊ฑฐ๋, ์์์ ๋ถํ์ํ๊ฒ ์ก์๋จน๊ฑฐ๋, ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ์ด ์์ด์ง๋ ๋ฑ์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง, ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์๋ ์ฌ๋ฌ๊ฐ์ง ๋จ์ ์ด ์กด์ฌํ๋ค.
์ ์ญ๋ณ์์ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
๋ง์ฝ ๊ทธ ๊ฐ์ฒด๊ฐ ์์์ ๋ง์ด ์ฐจ์งํ๋ค๊ณ ๊ฐ์ ํ์.
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ๋๊น์ง ๊ทธ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ๋ ์ฐ์ง ์๋๋ค๋ฉด ๊ดํ ์์๋ง ์ก์๋จน๋ ์ธ๋ฐ์๋ ๊ฐ์ฒด๊ฐ ๋๊ณ ๋ง ๊ฒ์ด๋ค.
๋ฐ๋ฉด ์ฑ๊ธํด ํจํด์ ์ฌ์ฉํ๋ฉด ํ์ํ ๋๋ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด์ฒ๋ผ ์ฑ๊ธํด ํจํด์ ์ฌ์ฉํ๋ฉด ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ด๋์๋ ์ง ์์ธ์คํ ์ ์๊ฒ ๋ง๋ค ์ ์์ผ๋ฉด์๋ ์ ์ญ ๋ณ์๋ฅผ ์ธ ๋์ ์ฌ๋ฌ ๋จ์ ์ ํด๊ฒฐํ ์ ์๋ค.
2. ๊ณ ์ ์ ์ธ ์ฑ๊ธํด ํจํด ๊ตฌํ๋ฒ
public class Singleton {
// Singleton ํด๋์ค์ ํ๋๋ฟ์ธ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ static ๋ณ์
private static Singleton uniqueInstance;
// private ์์ฑ์๋ก ํด๋์ค ์ธ๋ถ์์์ ๊ฐ์ฒด ์์ฑ์ ๋ง๋๋ค.
private Singleton() {}
// Singleton ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ ๋ฆฌํดํ๋ static ๋ฉ์๋
public static Singleton getInstance() {
// ์์ง ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง์ง ์์๋ค๋ฉด, private์ผ๋ก ์ ์ธ๋ ์์ฑ์๋ฅผ ์ฌ์ฉํด์ Singleton ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค์ uniqueInstance์ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋์
ํ๋ค.
// ์ด๋ฌ๋ฉด ์ธ์คํด์ค๊ฐ ํ์ํ ์ํฉ์ด ์ค๊ธฐ ์ ๊น์ง๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ '๊ฒ์ผ๋ฅธ ์ธ์คํด์ค ์์ฑ(lazy instantiation)'์ด๋ผ ํ๋ค.
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueIntance;
}
}
ํด๋์ค์ ์์ฑ์๋ฅผ private์ผ๋ก ์ ์ธํ์ฌ ํด๋์ค ์ธ๋ถ์์์ ๊ฐ์ฒด ์์ฑ์ ๋ง๋๋ค.
static ๋ฉ์๋์ธ getInstance()๋ฅผ ํตํด์๋ง ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
์ด๋ ์ด๋ฏธ ์์ฑ๋ ์ธ์คํด์ค๊ฐ ์์ผ๋ฉด ํด๋น ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ณ , ์์ฑ๋ ์ธ์คํด์ค๊ฐ ์์ผ๋ฉด ์๋ก ์์ฑํด์ ๋ฐํํ๋ค.
3. ๋ฉํฐ์ค๋ ๋ฉ ๋ฌธ์ ์ดํด๋ณด๊ธฐ
์์ ๊ฐ์ ๊ณ ์ ์ ์ธ ์ฑ๊ธํด ํจํด์ ๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์์ง ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ฑ๋์ง ์์ ์ํฉ์์ ์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ getInstance() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๊ฐ ์ค๋ ๋์ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ๋ฐํ๋ ์ ์๋ค.
๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ํฉ์ด๋ค.
4. ๋ฉํฐ์ค๋ ๋ฉ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
๋๋ถ๋ถ์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ํ๊ธฐ ์ํด์๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ฑ๊ธํด์ด ๋์๊ฐ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
๋ฉํฐ์ค๋ ๋ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ ์ธ ๊ฐ์ง๋ฅผ ์ดํด๋ณด์.
๋ฐฉ๋ฒ 1. getInstance() ๋ฉ์๋ ๋๊ธฐํํ๊ธฐ
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
// getInstance() ๋ฉ์๋์ synchronized ํค์๋๋ฅผ ์ถ๊ฐํ๋ฉด ํ ์ค๋ ๋๊ฐ ๋ฉ์๋ ์ฌ์ฉ์ ๋๋ด๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ์ค๋ ๋๋ ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
// ์ฆ, 2๊ฐ์ ์ค๋ ๋๊ฐ ์ด ๋ฉ์๋๋ฅผ ๋์์ ์คํํ๋ ์ผ์ ์ผ์ด๋์ง ์๊ฒ ๋๋ค.
public static synchronized Singleton getInstance() {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
getInstance() ๋ฉ์๋์ synchronized ํค์๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ฉ์๋๋ฅผ ๋๊ธฐํํ ์ ์๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ํ ์ค๋ ๋๊ฐ ๋ฉ์๋ ์ฌ์ฉ์ ๋๋ด๊ธฐ ์ ๊น์ง๋ ๋ค๋ฅธ ์ค๋ ๋๋ ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ด ๋ฉ์๋๋ฅผ ๋์์ ์คํํ์ฌ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
ํ์ง๋ง ๋ฉ์๋๋ฅผ ๋๊ธฐํํ๋ฉด ์๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๋ฅผ ๋๊ธฐํํ๋ฉด ์ฑ๋ฅ์ด 100๋ฐฐ ์ ๋ ์ ํ๋๋ค.
๋ง์ฝ getInstance() ๋ฉ์๋๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณ๋ชฉ์ผ๋ก ์์ฉํ๋ค๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ด์ผ ํ๋ค.
๋ ์กฐ๊ธ ๋ ์๊ฐํด๋ณด๋ฉด, ๋๊ธฐํ๊ฐ ํ์ํ ์์ ์ ์ด ๋ฉ์๋๊ฐ ์์๋ ๋๋ฟ์ด๋ผ๋ ์ฌ์ค์ ์ ์ ์๋ค.
์ผ๋จ uniqueInstance ๋ณ์์ Singleton ์ธ์คํด์ค๋ฅผ ๋์ ํ๊ณ ๋๋ฉด ๊ตณ์ด ๋ฉ์๋๋ฅผ ๋๊ธฐํ๋ ์ํ๋ก ์ ์งํ ํ์๊ฐ ์๋ค.
๋ฐฉ๋ฒ 2. ์ธ์คํด์ค๊ฐ ํ์ํ ๋ ์์ฑํ์ง ๋ง๊ณ ์ฒ์๋ถํฐ ์์ฑํ๊ธฐ
public class Singleton {
// ์ ์ ์ด๊ธฐํ ๋ถ๋ถ(static initializer)์์ Singleton์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
// ์ด๋ฏธ ๋ง๋ค์ด์ง ์ธ์คํด์ค๋ฅผ ๋ฆฌํด๋ง ํ๋ฉด ๋๋ค.
return uniqueInstance;
}
}
์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ JVM์์ Singleton์ ํ๋๋ฟ์ธ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ค๋ค.
JVM์์ ํ๋๋ฟ์ธ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ ๊น์ง ๊ทธ ์ด๋ค ์ค๋ ๋๋ uniqueInstance ์ ์ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๊ฒ์ผ๋ฅธ ์ธ์คํด์ค ์์ฑ์ ํ ์ ์๊ณ , ์ฒ์๋ถํฐ ๋๊น์ง ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
๋ฐฉ๋ฒ 3. DCL(Double-Checked Locking)์ ์จ์ getInstance() ๋ฉ์๋์์ ๋๊ธฐํ๋๋ ๋ถ๋ถ ์ค์ด๊ธฐ
public class Singleton {
// ์ ์ ๋ณ์์ volatile ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉํฐ์ค๋ ๋ฉ์ ์ฐ๋๋ผ๋ uniqueInstance ๋ณ์๊ฐ Singleton ์ธ์คํด์ค๋ก ์ด๊ธฐํ๋๋ ๊ณผ์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์งํ๋๋ค.
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
// ์ธ์คํด์ค๊ฐ ์๋์ง ํ์ธํ๊ณ , ์์ผ๋ฉด ๋๊ธฐํ๋ ๋ธ๋ก์ผ๋ก ๋ค์ด๊ฐ๋ค.
if(uniqueInstance == null) {
// ์ฒ์์๋ง ๋๊ธฐํ๋๋ค.
synchronized (Singleton.class) {
// ๋ธ๋ก ๋ด์์ ๋ค์ ํ ๋ฒ ์ธ์คํด์ค๊ฐ ์๋์ง ํ์ธํ๊ณ , ์์ ๋์๋ง ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
DCL(Double-Checked Locking)์ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ์๋์ง ํ์ธํ ๋ค์, ์์ฑ๋์ด ์์ง ์์ ๋์๋ง ๋๊ธฐํํ ์ ์๋ค.
์ด๋ฌ๋ฉด ์ฒ์์๋ง ๋๊ธฐํํ๊ณ ๋์ค์๋ ๋๊ธฐํํ์ง ์์๋ ๋๋ค.
๋จ, DCL์ ์๋ฐ 1.4 ์ด์ ๋ฒ์ ์์๋ ์ธ ์ ์๋ค.
์๋ฐ 1.4๋ณด๋ค ๋ฎ์ ๋ฒ์ ์ JVM ์ค์๋ volatile ํค์๋๋ฅผ ์จ๋ DCL์์ ๋๊ธฐํ๊ฐ ์ ๋๋ก ์ ๋๋ ์ผ์ด ๋ง๋ค.
5. ์ฑ๊ธํด ํจํด์ ๋ค๋ฅธ ๋ฌธ์ ์ดํด๋ณด๊ธฐ
1. ํด๋์ค ๋ก๋๊ฐ 2๊ฐ ์ด์์ผ ๋ ์๊ธฐ๋ ๋ฌธ์
ํด๋์ค ๋ก๋๋ง๋ค ์๋ก ๋ค๋ฅธ ๋ค์์คํ์ด์ค๋ฅผ ์ ์ํ๊ธฐ ๋๋ฌธ์ ํด๋์ค ๋ก๋๊ฐ 2๊ฐ ์ด์์ด๋ผ๋ฉด ๊ฐ์ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๋ฒ(๊ฐ ํด๋์ค ๋ก๋๋ง๋ค ํ ๋ฒ์ฉ) ๋ก๋ฉํ ์๋ ์๋ค.
์ด๋๋ฌธ์ ์ฑ๊ธํด์ ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ํด๋์ค ๋ก๋๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋์๋ ์ฑ๊ธํด์ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค.
ํด๋์ค ๋ก๋๋ฅผ ์ง์ ์ง์ ํ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํผํ ์๋ ์๋ค.
2. ๋ฆฌํ๋ ์ , ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ๋ฌธ์
๋ฆฌํ๋ ์ , ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๋ ์ฑ๊ธํด์์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
TODO ๋ฆฌํ๋ ์ , ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ๊ณต๋ถํ๊ธฐ
3. ๋์จํ ๊ฒฐํฉ ์์น์ ์๋ฐฐ
๋์จํ ๊ฒฐํฉ ์์น์ ๋ฐ๋ฅด๋ฉด "์ํธ์์ฉํ๋ ๊ฐ์ฒด ์ฌ์ด์์ ์ต๋ํ ๋์จํ ๊ฒฐํฉ์ ์ถ๊ตฌ"ํด์ผ ํ๋ค.
์ฑ๊ธํด์ ์์กดํ๋ ๊ฐ์ฒด๋ ์ ๋ถ ํ๋์ ๊ฐ์ฒด์ ๋จ๋จํ๊ฒ ๊ฒฐํฉ๋๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํด์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด๋ฐ ์์น์ ์๋ฐฐํ๊ธฐ ์ฝ๋ค.
์ฑ๊ธํด์ ๋ฐ๊พธ๋ฉด ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ฐ๊ฟ์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
4. ์์์ด ๋ถ๊ฐ๋ฅํ ๋ฌธ์
์ฑ๊ธํด์ ์๋ธ ํด๋์ค(์์ ํด๋์ค)๋ฅผ ๋ง๋ค ๋ ๊ฐ์ฅ ๋จผ์ ๋ง์ฃผ์น๋ ๊ฑธ๋ฆผ๋์ด ๋ฐ๋ก ์์ฑ์๊ฐ private์ผ๋ก ์ ์ธ๋์ด ์๋ค๋ ์ ์ด๋ค.
private์ผ๋ก ์ง์ ๋ ์์ฑ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ ํ์ฅํ ์ ์๊ธฐ์ ์์ฑ์๋ฅผ public ๋๋ protected๋ก ์ ์ธํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ํด๋์ค์์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋๋ฏ๋ก ๋๋ ์ฑ๊ธํด์ด ์๋๊ฒ ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ฑ๊ธํด์ ์ ์ ๋ณ์๋ฅผ ๋ฐํ์ผ๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์๋ธํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ๋ชจ๋ ์๋ธํด๋์ค๊ฐ ๋๊ฐ์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค๋ ์ ์ด๋ค.
๋ฐ๋ผ์ ์๋ธํด๋์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ฒ ์ด์ค ํด๋์ค์์ ๋ ์ง์คํธ๋ฆฌ ๊ฐ์ ๊ฑธ ๊ตฌํํด์ผ ํ๋ค.
6. ์ฑ๊ธํด ํจํด์ ๋ค๋ฅธ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
๋ฐฉ๋ฒ 1. Enum ์ฌ์ฉํ๊ธฐ
์ง๊ธ๊น์ง ๋ ผ์ํ ๋๊ธฐํ ๋ฌธ์ , ํด๋์ค ๋ก๋ฉ ๋ฌธ์ , ๋ฆฌํ๋ ์ , ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ ๋ฌธ์ ๋ฑ์ enum์ผ๋ก ์ฑ๊ธํด์ ์์ฑํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
public enum Singleton {
UNIQUE_INSTANCE;
}
public class SingletonClient {
public static void main(String[] args) {
Singleton singleton = Singleton.UNIQUE_INSTANCE;
// ์ฌ๊ธฐ์ ์ฑ๊ธํด ์ฌ์ฉ
}
}
์ด ๋ฐฉ๋ฒ์ Eager Initialization์ผ๋ก ์ธํ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ผ๋ฉฐ, ์ฑ๊ธํด์ด enum ์ธ์ ํด๋์ค๋ฅผ ์์ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
๋ฐฉ๋ฒ 2. Lazy Holder ์ฌ์ฉํ๊ธฐ
public class Singleton {
private Singleton() {}
// private static inner class
private static inner class LazyHolder {
// Lazy Holder ํด๋์ค ์ด๊ธฐํ ๊ณผ์ ์์ JVM์ด Tread-Safeํ๊ฒ instance๋ฅผ ์์ฑํ๋ค.
private static final Singleton uniqueInstance = new Singleton();
}
public static Singleton getInstance() {
// LazyHolder์ uniqueInstance์ ์ ๊ทผํ์ฌ ๋ฐํํ๋ค.
return LazyHolder.uniqueInstance;
}
}
์ด ๋ฐฉ์์ Eager Initialization์ ๊ฐ์ ํ ๋ฐฉ์์ด๋ค.
์ฑ๊ธํด์ getInstance() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด LazyHolder์ uniqueInstance ๋ณ์์ ์ ๊ทผํ๋๋ฐ, ์ด๋ LazyHolder๊ฐ static inner class์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค์ ์ด๊ธฐํ ๊ณผ์ ์ด ์ด๋ฃจ์ด์ง๋ฉด์ uniqueInstance ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
JVM์ ํด๋์ค์ ์ด๊ธฐํ ๊ณผ์ ์์ ์์์ฑ์ ๋ณด์ฅํ๋ค.
์ฆ, uniqueInstance๋ getInstance() ๋ฉ์๋ ํธ์ถ ์ LazyHolder ํด๋์ค์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ฉด์ JVM์ ์ํด ์์์ฑ์ด ๋ณด์ฅ๋ ์ํ๋ก ๋จ ํ ๋ฒ๋ง ์์ฑ๋๊ณ , final ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ์ดํ๋ก ๋ค์ uniqueInstance์ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
getInstance() ๋ฉ์๋์ synchronized๋ฅผ ์ฌ์ฉํ์ง ์์๋ JVM์ ์ํด ์์์ฑ์ด ๋ณด์ฅ๋๋ฏ๋ก ์ด๋ฌํ JVM์ ํน์ฑ์ ํ์ฉํ์ฌ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ง๋ ๋ฐฉ์์ด๋ค.
์ญ์ง๋ ฌํ ์ํ ์ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , ๋ฆฌํ๋ ์ ์ ์ด์ฉํด ๋ด๋ถ ์์ฑ์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
์ ๋ฆฌํ์๋ฉด, ์ง๋ ฌํ ๋ฑ ์์ ์ฑ์ด ์ค์์๋๋ ํ๊ฒฝ์์๋ enum์, ์ฑ๋ฅ์ด ์ค์์๋๋ ํ๊ฒฝ์์๋ Lazy Holder๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
(์ฐธ๊ณ ) https://github.com/IT-Book-Organization/HeadFirst-DesignPattern/tree/main/Chapter_05
๋ธ๋ก๊ทธ์ ์ ๋ณด
Claire's Study Note
Hi.Claire