싱글톤 패턴

hello__0·2025년 7월 15일
0

Computer Science

목록 보기
1/6
post-thumbnail

싱글톤 패턴(Singleton Pattern)

싱글톤 패턴은 객체 지향 프로그래밍에서 특정 클래스가 단 하나만의 인스턴스를 생성하여 사용하기 위한 패턴

싱글톤 패턴의 기본 구현

public class Singleton {
    // 정적 참조 변수(싱글톤 객체를 담을 변수)
    private static Singleton singletonObject;

    // private 생성자
    private Singleton() {
    }
    
    // getInstance()
    public static Singleton getInstance() {
        if (singletonObject == null) {
            singletonObject = new Singleton();
        }
        
        return singletonObject;
    }
}
  • 클라이언트는 getInstance() 메서드를 통해 싱글톤 인스턴스를 얻을 수 있다.
  • getInstance() 메서드 내부에는 instance가 null이면 생성하고, null이 아니면 instance를 반환한다.
  • 단 하나만의 객체를 생성하여 사용할 수 있도록 한다.

싱글톤 패턴의 단점

1. 모듈간 의존성이 높아진다.
대부분의 싱글톤을 이용하는 경우 인터페이스가 아닌 클래스의 객체를 미리 생성하고 정적 메소드를 이용해 사용하기 때문에 클래스 사이에 강한 의존성과 높은 결합이 생기게 된다.
즉, 하나의 싱글톤 클래스를 여러 모듈들이 공유를 하니까, 만일 싱글톤의 인스턴스가 변경되면 이를 참조하는 모듈들도 수정이 필요하게 된다.

2. S.O.L.I.D 원칙에 위배되는 사례가 많다.
우선 싱글톤 인스턴스 자체가 하나만 생성하기 때문에 여러가지 책임을 지니게 되는 경우가 많아 단일 책임 원칙(SRP)를 위반하기도 하고, 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스들 간의 결합도가 높아지게 되어 개방-폐쇄 원칙(OCP)에도 위배된다.

3. TDD 단위 테스트에 애로사항이 있음
단위 테스트를 할때, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행 할 수 있어야 하는데, 싱글톤 인스턴스는 자원을 공유하고 있기 때문에, 테스트가 결함없이 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다.
그렇지 않으면 어플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못할 수도 있다.


싱글톤 패턴의 종류 및 권장코드 예제

싱글톤 패턴의 방법은 7가지가 존재한다.

  1. Eager Initialization
  2. Static block initialization
  3. Lazy initialization
  4. Thread safe initialization
  5. Double-Checked Locking
  6. Bill Pugh Solution
  7. Enum 이용

대표적으로 많이 사용되고, 추천 방법인 Bill Pugh Solution 과 Enum 이용 예제를 보겠다.

Bill Pugh Solution

private static inner class를 사용하여 Thread Safe한 싱글톤 패턴을 구현하는 방법

public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton SINGLETON_OBJECT = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.SINGLETON_OBJECT;
    }
}

Enum

enum 내에서 상수 뿐만 아니라, 변수나 메서드를 선언해 사용이 가능하기 때문에, 이를 이용해 싱글톤 클래스 처럼 응용이 가능

enum SingletonEnum {
    INSTANCE;

    private final Client dbClient;
	
    SingletonEnum() {
        dbClient = Database.getClient();
    }

    public static SingletonEnum getInstance() {
        return INSTANCE;
    }

    public Client getClient() {
        return dbClient;
    }
}

public class Main {
    public static void main(String[] args) {
        SingletonEnum singleton = SingletonEnum.getInstance();
        singleton.getClient();
    }
}

출처: https://ittrue.tistory.com/563 [IT is True:티스토리]
출처: https://inpa.tistory.com/entry/GOF-💠-싱글톤Singleton-패턴-꼼꼼하게-알아보자 [Inpa Dev 👨‍💻:티스토리]

profile
자라나라 나무나무

0개의 댓글