본문 바로가기
Java

java - 싱글톤 패턴(생성 패턴)

by sinabeuro 2021. 8. 20.
728x90

싱글톤 패턴은 어떠한 클래스(객체)가 유일하게 1개만 존재할 때 사용한다.

 

이를 주로 사용하는 곳은 서로 자원을 공유할 때 사용합니다.

싱글톤 패턴은 인스턴스를 한번만 생성하고, 생성한 인스턴스를 계속해서 재활용하여 호출합니다.

이렇게 함으로써, 처음 생성한 인스턴스가 가진 속성의 값이 동일하게 유지할 수 있으며, 주로 동일한 값을 계속해서 호출할 경우 싱글톤 패턴을 사용합니다.

 

싱글톤 객체를 주로 사용하는 곳은 다음과 같습니다.

- 소캣 통신의 connection 객체

- 외부 통신에 사용되는 키 또는 데이터를 저장할 경우

- 세션 관리

 

싱글톤 패턴의 장점

- 인스턴스를 한번만 생성하기 때문에 메모리가 적게 듭니다.

- 데이터 공유가 쉽습니다.

 

싱글톤 패턴의 단점

- 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID 원칙 중 의존관계 역전 원칙(DIP)을 위반하며,

개방-폐쇄 원칙(OCP) 또한 위반할 가능성이 높습니다.

싱글톤 패턴 사용의 유점
객체 생성을 확인하고 생성자를 호출하는 경우에 멀티스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 합니다.

 

 

싱글톤 패턴 구현 예제1

1. 기본 생성자를 private으로 막습니다.

2. static 메소드 getInstance()로 자기 자신을 리턴합니다.

※ static 변수, 메소드로 구현해야합니다.

// SocketClient.java
public class SocketClient {

    private static SocketClient socketClient = null;

    // default 생성자 막기
    private SocketClient(){}

    public static SocketClient getInstance(){

        if(socketClient == null){
            socketClient = new SocketClient();
            System.out.println("socket new instance");
        }

        return socketClient;
    }
}

간단하게 service 로직 내에서

SocketClient socketClient = SocketClient.getInstance();

또는 

SocketClient.getInstance(); 

으로 싱글톤 객체를 호출할 수 있습니다.

 

다른 방식으로 아래와 같이 호출할 수 있습니다.

// AClazz.java

public class AClazz {

    private SocketClient socketClient;

    public AClazz(){
        this.socketClient = SocketClient.getInstance();
    }

    public SocketClient getSocketClient() {
        return socketClient;
    }

    public void setSocketClient(SocketClient socketClient) {
        this.socketClient = socketClient;
    }

}

SocketClient 클래스로 직접적으로 생성자를 만들지 않고, 다른 클래스에서 SocketClient의 인스턴트 객체를 호출하는 것으로 싱글톤 객체를 호출할 수 있습니다.

 

 

싱글톤 패턴 구현 예제2

싱글톤 패턴을 더욱 간단하게 구현한 예시 코드를 소개하겠습니다.

@Getter
@Setter
@ToString
public class CryptoTokenDTO {
    private String accessToken = "";
    private String tokenVersion = "1.0";

    private static CryptoTokenDTO cpt;

    public static CryptoTokenDTO getInstance(){
        if(cpt == null){
            System.out.println("token is null");
            synchronized(CryptoTokenDTO.class) {
                if(cpt == null)
                    return cpt = new CryptoTokenDTO();
            }
        } else return cpt;
        return cpt;
    }
}

service 로직 내에서

CryptoTokenDTO.getInstance().setAccessToken("ABCDEFG");

와 같이 싱글톤 객체에 set을 할 수 있습니다. 

 

CryptoTokenDTO.getInstance().getAccessToken();

을 통해서 accessToken 속성값을 가져올 수 있습니다.

 

싱글톤 패턴은 이러한 형식으로 인스턴스 객체를 한번만 만들고,

공유하는 데이터로써 싱글톤 객체를 호출하여 사용할 수 있습니다.

 

728x90

'Java' 카테고리의 다른 글

java - 데코레이터 패턴(구조 패턴)  (0) 2021.08.23
java - 프록시 패턴(구조 패턴)  (0) 2021.08.23
java - 어댑터 패턴(구조 패턴)  (0) 2021.08.20
java - Gof의 디자인 패턴 개론  (0) 2021.08.20
Java - 자료형(숫자편)  (0) 2021.06.21

댓글