π 1. μ±κΈν€ ν¨ν΄(Singleton Pattern)μ΄λ?
μ±κΈν€ ν¨ν΄μ, μ΄λ ν ν΄λμ€(κ°μ²΄)κ° μ μΌνκ² λ¨ ν κ°λ§ μ‘΄μ¬ν΄μΌ ν λ μ¬μ©νκ² λ©λλ€. μ£Όλ‘ μλ‘ μμμ 곡μ ν λ μ¬μ©νλ©°, μμ±λ λ¨ νλμ κ°μ²΄λ₯Ό 곡μ νλ©° μ¬μ©νκ² λ©λλ€.
μ±κΈν€ ν¨ν΄μ λμμΈ ν¨ν΄ μ€μ, 'μμ±' ν¨ν΄μ μν©λλ€. μ±κΈν€ ν¨ν΄μ ν΅ν΄ λ¨ ν λ²μ μμ±μ 보μ₯νκΈ° λλ¬Έμ λλ€.
νλ‘κ·Έλλ°μμμ μμλ‘λ TCP socket ν΅μ μμ μλ²μ μ°κ²°λ connect κ°μ²΄μ μ£Όλ‘ μ¬μ©ν΄μ ν μμΌμμλ§ μ¬μ©νλ κ²λ€μ΄ μμ΅λλ€. TCP μ°κ²°μ ν λ μλ‘ μ°κ²°νλ λΉμ©μ΄ λ°μνκΈ° λλ¬Έμ μ΄λ―Έ ν λ² μ΄λ €μλ μμΌμ μ¬νμ©νλ κ²μ΄ μ’μ§, μμ²λ§λ€ κ³μ connectionμ λ§Ίμ νμκ° μμ΅λλ€.
μ€νλ§μμ 'Bean'μ΄λΌκ³ λΆλ¦¬λ κ°μ²΄ μμ μ΄λ¬ν μ±κΈν΄ λ°©μμΌλ‘ κ΄λ¦¬λλ©°, μ΄ λ΄μ©μ λ€λ₯Έ κΈμμ μ 리νλλ‘ νκ² μ΅λλ€.
μ±κΈν€ ν¨ν΄μ ν΅μ¬μΌλ‘, getInstanceλΌλ λ©μλλ₯Ό κ°μ§κ³ μμ΅λλ€.
μ΄ λ©μλμ μν μ 첫 νΈμΆ μ κ°μ²΄ μμ±κ³Ό, λ λ²μ§Έ μ΄νλΆν°λ 첫 λ²μ§Έ μμ±ν κ°μ²΄λ₯Ό 리ν΄νλ μ©λμ λλ€.
μ΄λ₯Ό κ³ λ €νμ¬ μ±κΈν€ ν¨ν΄μ ꡬννλ©΄ λ©λλ€.
μ±κΈν€ ν¨ν΄μ ꡬννλ λ°©μμ λ€μκ³Ό κ°μ΅λλ€.
1. μ±κΈν€ ν¨ν΄μ μ μ©ν ν΄λμ€λ₯Ό μμ±ν©λλ€.
1-1. νλλ private staticμΌλ‘ ν΄λμ€ μκΈ° μμ μ μ μ λ³μλ₯Ό μμ±νκ³ , κ°μ nullλ‘ μ΄κΈ°νν©λλ€.
1-2. κΈ°λ³Έ μμ±μλ₯Ό λ§κΈ° μν΄μ privateλ‘ μ κ·Όμ μ μ΄ν©λλ€.
2. getInstance λ©μλλ₯Ό μμ±ν©λλ€.
2-1. public staticμΌλ‘ μ§μ νκ³ , μκΈ° μμ μ 리ν΄ν©λλ€.
2-2. λ‘μ§μΌλ‘λ μ μλ³μλ‘ μμ±ν μκΈ° μμ μ κ°μ²΄κ° null μΈμ§ νμΈνκ³ , null μ΄λΌλ©΄ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν©λλ€.
2-3. nullμ΄ μλλΌλ©΄, μ μλ³μλ₯Ό 리ν΄ν©λλ€.
3. ν΄λΉ κ°μ²΄κ° μ¬μ©νλ λ©μλλ₯Ό ꡬνν©λλ€.
μ΄μ κ°μ ꡬν λ°©μμΌλ‘ μ΄λ ν ν΄λμ€μμλ ν΄λΉ static λ©μλμΈ getInstanceλ₯Ό ν΅ν΄ λμΌν κ°μ²΄λ₯Ό μ»μ μ μμ΅λλ€.
μ’ λ μμΈν μμ보기 μν΄μ μ§μ ꡬνν΄λ³΄λ €κ³ ν©λλ€.
π 2. μ±κΈν€ ν¨ν΄(Singleton Pattern) ꡬνν΄λ³΄κΈ°
μ±κΈν€ ν¨ν΄μ 'μμΌ'μμ λ§μ΄ μ¬μ©νκΈ° λλ¬Έμ μμ μμλ socketμ μμ±νλλ‘ νκ² μ΅λλ€.
public class SocketClient{
private static SocketClient socketClient = null;
private SocketClient(){}
public static SocketClient getInstance(){
if(socketClient == null){
socketClient = new SocketClient();
} // μλ κ²½μ°μλ μλ‘μ΄ μμ±
return socketClient; // μλ κ²½μ°μλ μ²μ ν λ² μμ±λ κ°μ²΄ λ°ν
}
public void connect(){
System.out.println("μ°κ²°λ¨!");
}
}
μμμ μ€λͺ ν μ±κΈν€ ν¨ν΄μ ꡬννλ λ°©μμ²λΌ,
μκΈ° μμ μ private static λ³μλ‘ κ°κ³ nullλ‘ μ΄κΈ°ν νμ΅λλ€.
κΈ°λ³Έ μμ±μλ privateλ‘ λ§κ³ , getInstance λ©μλλ₯Ό ꡬννμ΅λλ€.
connect() ν¨μλ μ€μ ꡬννμ§ μμμ§λ§, ν΄λΉ μ±κΈν€ κ°μ²΄κ° μ¬μ©νλ λ©μλλ‘ νλ¨νλ©΄ λ©λλ€.
public class AExample{
private SocketClient socketClient;
public Example(){
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
public class BExample{
private SocketClient socketClient;
public Example(){
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
public class Main{
public static void main(String args[]){
AExample a = new AExample();
BExample b = new BExample();
SocketClient aClient = a.getSocketClient();
SocketClient bClient = b.getSocketClient();
System.out.println(aClient.equals(bClient)); // true!!
}
}
AExampleμμλ, BExampleμμλ getInstanceλ₯Ό ν΅ν΄μ SocketClient κ°μ²΄λ₯Ό λ°μμ΅λλ€.
κΈ°λ³Έ μμ±μκ° λ§νμμΌλ―λ‘, SocketClientκ° μμ±λ μ μλ λ°©λ²μ, μ€μ§ getInstance λ©μλλ₯Ό ν΅ν΄μ κ°λ₯ν©λλ€.
κ°μ₯ νλ¨μ Main ν΄λμ€λ₯Ό 보면, AExampleμμ μμ±λ SocketClientμ BExampleμμ μμ±λ SocketClientκ° λμΌν¨μ νμΈν μ μμ΅λλ€.
μ΄μ κ°μ΄ μ±κΈν€ ν¨ν΄μ ν΅ν΄μ κ°μ²΄κ° μ μΌν¨μ 보μ₯ν μ μμ΅λλ€.