공부하는 블로그

Design Pattern | Singleton 본문

Others

Design Pattern | Singleton

치킨닮은닭 2020. 9. 14. 14:19

Singleton ?

 싱글턴(Singleton)은 객체를 생성하는 디자인 패턴 중 하나로 인스턴스를 생성할 때 최초 한번만 메모리에 할당하고 그 이후는 메모리에 할당된 하나의 인스턴스를 여러 클래스에서 공유하여 사용하는 형식의 패턴이다.

 

Singleton 기본 코드 예제(JAVA)

package designpatterns;

public class Singleton {
  private static Singleton singleInstance;

  private Singleton() {}

  public static Singleton getInstance() {
    if(singleInstance == null) {
      singleInstance = new Singleton();
    }
    return singleInstance;
  }
}

 싱글턴 인스턴스는 static 변수로 전역에서 사용이 가능하도록 한다. 생성자는 private 형태로 싱글턴 클래스 내부에서만 인스턴스를 생성할 수 있으며 'getInstance()' 메소드를 통해 외부에서 인스턴스를 얻을 수 있다.

 

 'getInstance()' 내부에서는 인스턴스가 없을 경우(최초 호출)에는 생성자를 통해 인스턴스를 생성하여 반환하고, 만일 이미 한번 인스턴스가 생성되어 메모리에 존재할 경우에는 기존의 인스턴스를 반환하는 방식으로 구현되어 있다.

 

Singleton 장점

1. 단 한번의 인스턴스 생성으로 메모리 낭비를 방지한다.

2. 전역(static) 인스턴스로 다른 클래스들간의 데이터 공유가 쉽다.

3. 두번째 호출 부터는 객체 로딩 시간이 크게 줄어들어 성능이 좋아진다.

 

 위와 같은 장점을 이용하기 위해 DBCP(DataBase Connection Pool)와 같이 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용된다. 

 

Singleton 주의사항

1. 싱글턴 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스간에 결합도가 높아져  객체 지향 설계 원칙에 어긋나게 된다.

 

2. 멀티쓰레드 환경에서 쓰레드간의 경합으로 인해 인스턴스가 두개가 생기는 경우가 발생한다.

 

 2번의 경우에는 synchronized를 이용하여 메소드를 동기화시켜 순차처리가 되도록 Blocking하는 방법으로 해결이 가능하다. 그러나 이 방법은 순차처리로 인한 딜레이 때문에 큰 성능저하가 발생하게 된다.

public synchronized static Singleton getInstance() {
  if(singleInstance == null) {
    singleInstance = new Singleton();
  }
  return singleInstance;
}

 이러한 성능저하는 Double-Checked Locking Pattern(DCLP)을 이용하여 해결이 가능하다. 동기화 처리를 하되, 인스턴스가 null값일 경우에 인스턴스를 생성하는 과정만 동기화 처리를 하여 성능저하를 막고 동기화 처리 메소드 내부에 다시 한번 null값을 체크하여 2개의 인스턴스가 발생하는 것을 예방한다.

public static Singleton getInstance() {
  if(singleInstance == null) {
    synchronized (Singleton.class) {
      if(singleInstance == null)
      	singleInstance = new Singleton();
    }
  }
  return singleInstance;
}

References

 

- Create pattern : Singleton : refactoring.guru/design-patterns/singleton

- 싱글턴 패턴을 쓰는 이유와 문제점 : jeong-pro.tistory.com/86

'Others' 카테고리의 다른 글

Others | Book Review : 읽기 좋은 코드가 좋은 코드다  (0) 2020.10.05
Design Pattern | Factory Method  (0) 2020.09.14
Flowchart 작성법  (0) 2020.09.10
Comments