Singleton 패턴에 대해서

Singleton 패턴에 대해서

생성일
Oct 26, 2024 03:57 PM
최종 편집 일시
Last updated October 26, 2024
태그
JAVA
싱글턴 패턴은 객체의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴이다.
싱글턴 패턴을 통해 생성된 객체는 여러 곳에서 동일한 인스턴스를 참조할 수 있어 메모리 사용을 효율적으로 관리할 수 있으며, 전역 상태를 관리해야 하는 상황에서 유용하게 쓰인다.
 

1. 싱글턴 패턴의 특징

  • 클래스의 인스턴스를 하나만 만들도록 제한한다.
  • 여러 곳에서 동일한 인스턴스를 공유할 수 있어, 공통의 자원이나 설정을 관리하는 데 유리하다.
  • 인스턴스가 하나뿐이므로 메모리 절약이 가능하다.

2. 싱글턴 패턴의 구현 방식

  • 가장 기본적인 구현 방식은 private 생성자와 static 메서드를 사용하는 방식이다.
  • 이 외에도 이른 초기화(Eager Initialization), 지연 초기화(Lazy Initialization), 스레드 안전한 방식 등 다양한 구현 방법이 있다.
  • 가장 기본적인 방법
    • public class Singleton { // 1. 클래스 내부에 유일한 인스턴스를 static으로 선언합니다. private static Singleton instance; // 2. private 생성자를 만들어 외부에서 인스턴스 생성이 불가능하게 합니다. private Singleton() { } // 3. getInstance 메서드를 통해 유일한 인스턴스를 제공하는 방식입니다. public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
      위의 방식은 Lazy Initialization 방식으로 getInstance가 처음 호출될 때 객체가 생성된다.
      하지만, 이 방식은 멀티스레드 환경에서 두 개 이상의 인스턴스가 생성될 수 있기 때문에 synchronized 키워드를 추가하거나, 더 나은 싱글턴 구현 방식을 사용하는 것이 좋다.
  • 스레드 안전한 방법
    • public class ThreadSafeSingleton { // 1. 클래스 내부에 유일한 인스턴스를 static으로 선언합니다. private static volatile ThreadSafeSingleton instance; // 2. private 생성자를 만들어 외부에서 인스턴스 생성이 불가능하게 합니다. private ThreadSafeSingleton() { } // 3. double-checked locking 방식으로 멀티스레드 환경에서도 안전하게 객체를 생성합니다. public static ThreadSafeSingleton getInstance() { if (instance == null) { synchronized (ThreadSafeSingleton.class) { if (instance == null) { instance = new ThreadSafeSingleton(); } } } return instance; } }
      이 방식은 double-checked locking으로 성능 개선 및 멀티스레드 환경에서 안전하게 싱글턴을 구현한다.
  • 이른 초기화 방식
    • public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } }
      이 방식은 클래스가 로드될 때 인스턴스가 생성되므로, 멀티스레드 환경에서도 안전하다. 하지만 인스턴스가 필요하지 않아도 무조건 생성되버린다는 단점이 있다.

4. 싱글턴 패턴의 활용 예시

  • 스프링에서 빈을 싱글턴 스코프로 관리하여 메모리 효율을 높이기 위해 자주 사용된다.
  • 애플리케이션의 공통 설정, 로깅 객체, 데이터베이스 연결과 같이 하나의 인스턴스만 필요할 때 사용된다.