[디자인패턴] 싱글톤 패턴 (Singleton Pattern)
18 Oct 2021 -
1 minute read
-
객체의 인스턴스가 유일하게 1개만 생성되어야 하는 경우에 사용되는 패턴
-
생성자가 여러 차례 호출되더라도 실제 생성되는 객체는 하나이고, 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환
-
싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스 > 다른 클래스의 인스턴스들이 데이터를 공유하기 쉬움
-
공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용
-
Spring에서 Bean은 기본적으로 싱글톤으로 관리됨
-
-
Singleton은 자기 자신을 객체로 가지고 있어야 함
-
private static으로 인스턴스 변수 생성
-
private 생성자로 외부에서 생성 막기
-
static => getInstance 메소드 제공
-
-
ex)
-
SocketClient.java
public class SocketClient { // 싱글톤은 자기 자신을 객체로 가지고 있어야 함 private static SocketClient socketClient = null; // 기본 생성자로 생성할 수 없도록 private으로 막아줘야함 private SocketClient(){ } // static 메소드를 통해 getInstance 메소드 제공해야함 // static 메소드 > 변수도 static public static SocketClient getInstance(){ // 객체가 null인지 여부 체크 // null인 경우 객체 새로 생성 if (socketClient == null){ socketClient = new SocketClient(); } return socketClient; } public void connect(){ System.out.println("connect"); } }
-
AClazz.java
public class AClazz { private SocketClient socketClient; public AClazz(){ this.socketClient = SocketClient.getInstance(); // private > new 해서 생성 못함 } public SocketClient getSocketClient(){ return this.socketClient; } }
-
BClazz.java
public class BClazz { private SocketClient socketClient; public BClazz(){ this.socketClient = SocketClient.getInstance(); } public SocketClient getSocketClient(){ return this.socketClient; } }
-
Main.java
public class Main { public static void main(String[] args) { AClazz aClazz = new AClazz(); BClazz bClazz = new BClazz(); // 두 개의 객체가 동일한지 확인 System.out.println(aClazz.getSocketClient().equals(bClazz.getSocketClient())); } } // 출력결과 // true
-