Lang/Java

[디자인 패턴] 싱글톤 패턴 (Creational)

Henu 2022. 1. 10. 14:28

싱글톤(Singleton)

전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하고, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴

클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

 

 

주의사항

  1. 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다.
    -> private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다.
  2. 다중 스레드에서 경합 조건(Race Condition)이 발생해 인스턴스가 2개 이상 생성되는 경우를 막아야 한다.

 

 

아래 코드는 위 주의사항을 잘 지킨 예시이다.

public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance() {
        return instance;
    }

    private SingletonService() {}
}

 

  1. static 영역에 객체 'instance'를 미리 하나 생성해서 올려둔다.
  2. 이 객체 인스턴스가 필요하면 'getInstance()' 메서드를 통해서만 조회할 수 있다.
    이 메서드를 호출하면 항상 같은 인스턴스를 반환한다.
  3. 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는것을 막는다.

 

 

싱글톤 패턴을 구현하는 방법은 여러가지가 있다.

위 코드에서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 선택했다.

 

 

 

아래 코드는 주의사항을 잘 지킨 또 다른 예시 코드이다.

public class SingletonService {

    private static SingletonService instance = null;
 
    public static synchronized SingletonService getInstance() {
        instance = new SingletonService();
        return instance;
    }
    
    private SingletonService() {
    }
}

 

  1. static 영역의 'instance' 객체를 null로 지정해둔다.
  2. 'getInstance()' 메서드로 'instance'객체를 가져올 수 있다.
    이때 경합 조건의 발생을 막기위해 synchronized를 사용해서 메서드를 동기화 시켜준다.
  3. 마찬가지로 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는것을 막는다.