먼저 싱글턴 패턴이란 어떠한 클래스(객체)가 유일하게 1개만 존재 할 때 사용하는 것이다. 이를 주로 사용하는 곳은 서로 자원을 공유할 때 사용하는데, 실물 세계에서는 프린터가 해당되며, 실제 프로그래밍에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용한다.
코드를 통해 살펴보자
singleton 패키지 (SocketClient.java)
package com.company.design.singleton;
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("connect");
}
}
첫 번째로 private을 통해 디폴트 생성자를 막아준다. 그 뒤 받는 값이 null이면 instance를 하나 만들어주고, 이미 존재한다면 다시 그 값을 돌려주는 것이다. 한마디로 객체는 유일하게 1개만 존재하고 그것을 static으로 같이 사용하는 것이다.
singleton 패키지 (Aclass.java)
package com.company.design.singleton;
public class AClazz {
private SocketClient socketClient;
public AClazz (){
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
singleton 패키지 (Bclass.java)
package com.company.design.singleton;
public class BClazz {
private SocketClient socketClient;
public BClazz () {
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
여기에 객체를 사용하려는 두 클래스가 있다. 이때 SocketClient에서 getInstance()메서드를 통해 받아오면 된다. 그러면 AClass와 BClass의 값은 동일한 값이 전달 될 것이다. 즉, 두 클래스는 같은 객체를 사용하고 있는 것 이다.
design 패키지 (Main.java)
package com.company.design;
import com.company.design.singleton.AClazz;
import com.company.design.singleton.BClazz;
import com.company.design.singleton.SocketClient;
public class Main {
public static void main(String[] args) {
AClazz aClazz = new AClazz();
BClazz bClazz = new BClazz();
SocketClient aClient = aClazz.getSocketClient();
SocketClient bClient = bClazz.getSocketClient();
System.out.println("두개의 객체가 동일한가?");
System.out.println(aClient.equals(bClient));
}
}
이제 Main클래스에서 두 클래스의 Instance가 동일한지 객체를 비교하는 equals을 통해 비교해보자.
두개의 객체가 동일한가?
true
true값이 나오는 것을 확인할 수 있다.
오늘은 간단하게 객체를 오직 1개만 존재할 때 사용하는 디자인 패턴을 알아보았다. 디자인패턴은 구조를 구성하는데 오래 걸리지만, 객체지향에 최적화된 프로그래밍이라 좋은 설계방식인 것 같다.