κ°μ
- λμμΈ ν¨ν΄μ΄ 무μμΈμ§, μ μ¬μ©νλμ§ μ΄ν΄νλ€.
- μ±κΈν€ ν¨ν΄μ λν΄ μ΄ν΄νκ³ , μΈμ μ¬μ©νλμ§ νμ νλ€.
- μ±κΈν€ ν¨ν΄μ μ₯μ μ λν΄ νμ νλ€.
λμμΈ ν¨ν΄μ΄λ?
λμμΈ ν¨ν΄ μ μ
λμμΈ ν¨ν΄μ΄λ, μννΈμ¨μ΄λ₯Ό μ€κ³ν λ νΉμ λ§₯λ½μμ μμ£Ό λ°μνλ κ³ μ§μ μΈ λ¬Έμ λ€μ νΌν μ μλλ‘ λ리 μλ €μ§ ν΄κ²°μ± λ€μ λ§ν©λλ€.
"λ°ν΄λ₯Ό λ€μ λ°λͺ νμ§ λ§λΌ(Don't reinvent the wheel)"
μ΄ λ¬Έκ΅¬μ μλ―Έλ μ΄λ―Έ λ§λ€μ΄μ Έ μμ΄μ μλ²½ν κ²μ μ²μλΆν° κ΅³μ΄ λ€μ λ§λ€ νμκ° μλ€λ μλ―Έμ λλ€. λμμΈ ν¨ν΄μ μ΄ λ§μ μ§ν¬ μ μλλ‘ νλ λ리 νΌμ Έμλ ν΄κ²°μ± μ μλ―Ένλ©°, λν νμ μ¬μ΄μ μ§κ²λ€λ¦¬λ₯Ό μμ²νμ¬ μμ¬ μν΅μ μννκ² ν΄μ£Όλ κ°λ°μλ€μκ²λ κ΅μ₯ν κ³ λ§μ΄ κ°λ μ λλ€.
λμμΈ ν¨ν΄ ꡬ쑰
μ½ν μ€νΈ
- λ¬Έμ κ° λ°μνλ μ¬λ¬ μν©μ κΈ°μ νλ©°, ν¨ν΄μ΄ μ μ©λ μ μλ μν©μ μλ―Έν©λλ€.
- κ²½μ°μ λ°λΌμλ ν¨ν΄μ΄ μ μ©νμ§ λͺ»ν μν©μ λνλ΄κΈ°λ ν©λλ€.
λ¬Έμ
- ν¨ν΄μ΄ μ μ©λμ΄ ν΄κ²°λ νμκ° μλ μ¬λ¬ λμμΈ μ΄μλ₯Ό κΈ°μ νλ©°, ν΄λΉ λ¬Έμ λ€μ ν΄κ²°νκΈ° μν΄ μ μ½ μ¬νκ³Ό μν₯λ ₯μ κ³ λ €ν΄μΌλ§ ν©λλ€.
ν΄κ²°
- λ¬Έμ λ₯Ό ν΄κ²°ν μ μλλ‘ μ€κ³λ₯Ό ꡬμ±νλ μμλ€κ³Ό κ·Έ μμλ€ μ¬μ΄μ κ΄κ³, μ± μ, νλ ₯ κ΄κ³λ₯Ό κΈ°μ ν©λλ€.
- ν΄κ²°μ λ°λμ ꡬ체μ μΈ κ΅¬ν λ°©λ²μ΄λ μΈμ΄μ μμ‘΄μ μ΄μ§ μμΌλ©° λͺ¨λ μν©μμ μ μ©λ μ μλ μΌμ’ μ κ·μΉμ λλ€.
Singleton Pattern μ΄λ?
λ¨ νλμ κ°μ²΄λ₯Ό μμ±νκ³ μμ±λ κ°μ²΄λ₯Ό μ΄λμλ μ°Έμ‘°ν μ μλλ‘ νλ ν¨ν΄μ λλ€. μλ₯Ό λ€μ΄ νλ¦°ν° κ°μ²΄μ κ°μ κ²½μ°, λκ° μ΄μμ μΈμ€ν΄μ€κ° νμκ° μκΈ° λλ¬Έμ νκ° μ΄μμ κ°μ²΄κ° μμ±λ κ²½μ° μμμ΄ λλΉλκ±°λ λ²κ·Έκ° λ°μν μ μμ΅λλ€. λ°λΌμ μ΄λ¬ν μν©μμ μ€μ§ κ°μ²΄λ₯Ό νλλ§ μμ±νκ³ κ·Έ κ°μ²΄λ₯Ό 곡μ ν΄μ μ¬μ©νλλ‘ νλ κ²μ΄ μ±κΈν΄ ν¨ν΄μ μ£Όμ λͺ©μ μ λλ€.
Singleton Pattern ꡬν
1
2
3
4
5
6
7
8
9
10
|
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance()
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
|
private μμ±μ
- μμ±μλ₯Ό privateλ‘ μ§μ ν μ΄μ λ, μΈλΆ ν΄λμ€μμ ν΄λΉ κ°μ²΄λ₯Ό μμ±νμ§ λͺ»νλλ‘ νκΈ° μν΄μ μ λλ€.
instance
- Singleton PatternμΌλ‘ μΈν΄μ λ§λ€μ΄μ§ κ°μ²΄μ λλ€.
- μΈλΆ ν΄λμ€μμλ ν΄λΉ κ°μ²΄λ₯Ό μ¬μ©νκ² λλ©°, privateμΌλ‘ μ μΈνμ¬ μΈλΆ ν΄λμ€μμ μ§μ μ κ·Όν μ μλλ‘ ν©λλ€.
public static Singleton getInstance()
- μΈλΆμ λͺ¨λ ν΄λμ€μμ ν΄λΉ λ©μλλ₯Ό νΈμΆνμ¬ κ°μ²΄λ₯Ό νλν μ μμ΅λλ€.
- λ§μ½ κ°μ²΄κ° μμ§ λ§λ€μ΄μ§κΈ° μ μ΄λΌλ©΄, κ°μ²΄λ₯Ό μμ±νμ¬ λ¦¬ν΄ν΄μ€λλ€.
- λ§μ½ κ°μ²΄κ° λ§λ€μ΄μ§ νλΌλ©΄, μ΄λ―Έ λ§λ€μ΄μ Έ μλ κ°μ²΄λ₯Ό 리ν΄ν΄μ€λλ€.
Singleton Pattern μ¬μ©
1
2
3
|
public class OuterClass {
Singleton instance = Singleton.getInstance();
}
|
μΈλΆ ν΄λμ€μμ λ€μκ³Ό κ°μ΄ μ±κΈν΄ κ°μ²΄λ₯Ό μ»μ΄μ μ¬μ©ν μ μμ΅λλ€.
Multi-Thread νκ²½μμμ Singleton Pattern
λ§μ½μ Multi-Thread νκ²½μμ λ κ° μ΄μμ μ€λ λκ° λμμ getInstance() ν¨μμ μ κ·Όνλ€λ©΄, λ κ° μ΄μμ κ°μ²΄κ° λμμ μμ± λ μ μμ΅λλ€. μ΄λ¬ν μν©μ λ§κΈ° μν΄μλ μ΄λ»κ² ν΄μΌν κΉμ?
classκ° λ‘λ©λμ§λ§μ κ°μ²΄ μμ±νκΈ°
1
2
3
4
5
6
7
|
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
|
μμ κ°μ²΄λ₯Ό 미리 μμ±νμ¬ λμμ μ κ·Όνμ¬ κ°μ²΄κ° λ κ° μ΄μ μμ±λλ μν©μ λ§λ λ°©λ²μ λλ€. λκΈ°ν λ¬Έμ κ° λ°μνμ§ μμ§λ§ λΆνμν μμ€ν 리μμ€λ₯Ό λλΉνκ² λλ€λ λ¨μ μ΄ μμ΅λλ€.
synchronized ν€μλ μ¬μ©νκΈ°
1
2
3
4
5
6
7
8
9
10
|
public class Singleton {
private static Singleton instance;
private Singleton() {}
public synchronized static Singleton getInstance()
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
|
synchronized ν€μλλ₯Ό μ¬μ©νμ¬ getInstance() λ©μλλ₯Ό λκΈ°ννλ λ°©λ²μ λλ€. λ¬Όλ‘ λκΈ°ν λ¬Έμ κ° λ°μνμ§ μμ§λ§ μν μκ°μ΄ λλ €μ§λ€λ λ¨μ μ΄ μμ΅λλ€.
λ΄λΆ static ν΄λμ€λ₯Ό μ¬μ©νλ λ°©λ²
1
2
3
4
5
6
7
8
9
10
11
|
class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
|
LazyHolder κΈ°λ²μΌλ‘ Singleton ν΄λμ€μ getInstance() λ©μλ λ΄λΆμμ LazyHolder.INSTANCEλ₯Ό μ°Έμ‘°νλ μκ° classκ° λ‘λ©λλ©° μ΄κΈ°νκ° μ§νλ©λλ€. classλ₯Ό λ‘λ©νκ³ μ΄κΈ°ννλ μμ μ thread-safeλ₯Ό 보μ₯νκΈ° λλ¬Έμ volatileμ΄λ synchronizedκ°μ ν€μλκ° λΆνμ νκ² λ©λλ€.
Reference
https://github.com/GimunLee/tech-refrigerator/blob/master/Design%20Pattern/Singleton%20Pattern.md
GimunLee/tech-refrigerator
π° κΈ°μ λμ₯κ³ μ λλ€. π κΈ°μ λ©΄μ , μ 곡 μν , μ§μ ν¨μ λ± λΆλͺ λμλ κ±°μμ! π€ - GimunLee/tech-refrigerator
github.com
https://jungwoon.github.io/java/2019/08/11/Singleton-Pattern-with-Multi-Thread/
λ©ν°μ€λ λ νκ²½μμμ μ±κΈν€ ν¨ν΄ - Jungwoon Blog
μλ° λ©ν°μ€λ λ νκ²½μμ μ±κΈν€ ν¨ν΄ μ±κΈν€ ν¨ν΄ GoF(Gang of Four) λμμΈ ν¨ν΄ μ€ νλλ‘ μμ±μκ° μ¬λ¬ μ°¨λ‘ νΈμΆλλλΌλ μ€μ λ‘ μμ±λλ μΈμ€ν΄μ€λ νλμ΄κ³ , μ΅μ΄ μμ± μ΄νμ νΈμΆλ μμ±μλ μ΅μ΄μ μμ±ν κ°μ²΄λ₯Ό 리ν΄νλ νν μΌλ°μ μΈ νν class Singleton { private static Singleton ourInstance = null; public static Singleton getInstance() { if (ourI
jungwoon.github.io