싱글턴 패턴

심야·2022년 11월 17일
0

웹 개발

목록 보기
21/47

싱글턴 패턴

싱글턴 패턴이란 인스턴스를 하나만 만들어 사용하기 위한 패턴이다.
커넥션 풀, 스레드 풀, 디바이스 설정 객체 등 인스턴스를 여러 개 만들면 불필요한 자원을 사용해 프로그램이 예상치 못한 결과를 낳을 수 있다. 따라서 싱글턴 패턴은 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다.

싱글턴 패턴을 구현하려면 객체 생성을 위한 new에 제약을 걸어야 하고, 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다.

구성 요소

  • new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다.
  • 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.
  • 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다.

Example

Singelton.java

public class Singleton {
    static Singleton singletonObject; 
    // 단일 객체를 저장하기 위한 정적 참조 변수

    private Singleton() {} // private 생성자

    // 단일 객체 반환 정적 메서드
    public static Singleton getInstance(){
        if(singletonObject == null){
            singletonObject = new Singleton();
        }

        return singletonObject;
    }
}

Cleint.java

public class Client {
    public static void main(String[] args) {
        // private 생성자이므로 new를 통해 인스턴스를 생성할 수 없다.
        // Singleton s = new Singleton();

        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        Singleton s3 = Singleton.getInstance();

        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);

        s1 = null;
        s2 = null;
        s3 = null;
    }
}

적용 예시

  1. 싱글턴 패턴은 프로그램 클래스에 모든 클라이언트가 사용할 수 있는 단일 인스턴스만 있어야 할 때 사용한다.
  2. 싱글턴 패턴은 특별 생성 메서드(getInstance)를 제외하고는 클래스 객체들을 생성할 수 있는 모든 수단들을 비활성화한다. 이 메서드는 새 객체를 생성하거나 객체가 이미 생성되었으면 기존 객체를 반환한다.
  3. 싱글턴 패턴은 전역 변수들을 더 엄격하게 제어해야 할 때 사용한다.
  4. 전역 변수들과 달리 싱글턴 패턴은 클래스 인스턴스가 하나만 있도록 보장한다. 캐시 된 인스턴스는 싱글턴 클래스 자체를 제외하고는 어떤 것과도 대체될 수 없다.

장단점

✔️ 클래스가 하나의 인스턴스만 갖는다는 것을 확신할 수 있다.
✔️ 인스턴스에 대한 전역 접근 지점을 얻는다.
✔️ 싱글턴 객체는 처음 요청될 때만 초기화 된다.

❌ 단일 책임 원칙을 위반한다. 싱글턴은 한 번에 두 가지 문제를 동시에 해결한다.
❌ 싱글턴 패턴은 잘못 설계된 디자인을 가릴 수 있다.
❌ 다중 스레드 환경에서 여러 스레드가 싱글턴 객체를 여러 번 생성하지 않도록 하기 위한 처리가 필요하다.
❌ 싱글턴 클라이언트 코드를 유닛 테스트하기 어려울 수 있다. 많은 테스트 프레임워크들은 모의 객체들을 생성할 때 상속에 의존하기 때문이다. 싱글턴 클래스 생성자는 비공개이고 대부분 언어에서 정적 메서드를 오버라이딩하는 것이 불가능 해 싱글턴의 한계를 극복할 수 있는 방법을 생각해야 한다. 결국 테스트를 작성하지 않거나 싱글턴 패턴을 사용하지 않아야 한다.

출처

디자인 패턴에 뛰어들기
스프링 입문을 위한 객체지향의 원리와 이해

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글