SW 디자인 패턴에서 싱글톤 패턴을 따르는 클래스는 생성자가 여러차례 호출 되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 형태이다.
대체로 서로 자원을 공유할 때 사용하는데, 현실에서는 프린터가 해당되고, 실제 프로그래밍에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용된다.
1. SocketClient 클래스
public class SocketClient {
private static SocketClient socketClient = null;
private SocketClient() {}
public static SocketClient getInstance() {
if(socketClient == null) {
socketClient = new SocketClient();
System.out.println("socket new instance");
}
return socketClient;
}
public void connect() {
System.out.println("connect");
}
}
2. 첫번째 클래스와 두번째 클래스
public class FirstClazz {
public SocketClient getSocketClient() {
return socketClient;
}
public void setSocketClient() {
this.socketClient = socketClient;
}
private SocketClient socketClient;
public FirstClazz() {
this.socketClient = SocketClient.getInstance();
}
}
public class SecondClazz {
public SocketClient getSocketClient() {
return socketClient;
}
public void setSocketClient() {
this.socketClient = socketClient;
}
private SocketClient socketClient;
public SecondClazz() {
this.socketClient = SocketClient.getInstance();
}
}
3. 메인 클래스
public class Main {
public static void main(String[] args) {
FirstClazz firstClazz = new FirstClazz();
SecondClazz secondClazz = new SecondClazz();
SocketClient firstClient = firstClazz.getSocketClient();
SocketClient secondClient = secondClazz.getSocketClient();
System.out.println("두개의 객체가 동일한가?");
System.out.println(firstClient.equals(secondClient));
}
}
아무래도 싱글톤 패턴이라고 한다면, 우리가 위에서 코드를 작성해왔던 것 처럼 "하나의 인스턴스"라는 것이 떠오를 것 같다. 근데 그래서, 한개의 인스턴스로만 가져가면 뭐가 좋길래 싱글톤을 쓰는거야?
무엇보다도 메모리를 아낄 수 있는점이 가장 큰 이유 일 것 같다. new 연산자를 한번만 사용하기 때문에, 고정된 메모리 영역을 낭비하지 않아도 된다. 뿐만아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.
또한, 하나의 객체를 선언 후 get/set을 이용하기 때문에 데이터 공유가 용이하다는 점이다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스라서 다른 클래스의 인스턴스들이 접근해 사용할 수 있다. 하지만, 데이터가 동시 접근이 가능해 동시성 문제가 발생 할 수 있으므로 이 점을 유의하여 개발하는 것이 중요하다.
그.럴.리.가!!! 우선 무엇보다도 싱글톤으로 코드를 구현시, 코드 자체가 많이 필요하다. 또한 테스트도 쉽지 않다. 이 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 시켜 테스트를 진행해야 한다.
뿐만아니라, 자식클래스를 만들수 없다는 점과, 내부 상태를 변경하기 어렵다는 점 등 여러가지 문제들이 존재한다. 결과적으로 이러한 문제들을 안고있는 싱글톤 패턴은 유연성이 많이 떨어지는 패턴이라고 할 수 있다.