Java - 싱글톤(Singleton) 패턴 구현

싱글톤은 실행 중인 Java 프로그램에서 객체가 1개만 생성되어 사용되도록 보장하는 패턴입니다.

이 글에서는 싱글턴 패턴을 구현하는 방법에 대해서 알아보겠습니다.

방법 1. Static 객체 생성 및 초기화

아래 예제와 같이 sInstance를 static 변수를 선언할 때 초기화하고 get 메소드를 제공하여 사용하면, 객체가 1개만 생성되도록 보장할 수 있습니다.

하지만 이 방법의 단점은, 프로그램이 종료될 때까지 객체를 한번도 사용하지 않아도 객체가 항상 생성되어 메모리를 소비한다는 점입니다.

public class Example {

    public final static class Singleton {
        private static Singleton sInstance = new Singleton();

        private Singleton() {
        }

        public static Singleton getInstance() {
            return sInstance;
        }

        public void doSomething () {
            System.out.println("Do something");
        }
    }

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.doSomething();
    }
}

위 구현 방법의 특징은 다음과 같습니다.

  • Singleton 클래스의 생성자는 private으로 설정하여 외부에서 객체를 생성하지 못하도록 합니다.
  • Signleton 클래스를 리턴하는 get 메소드(getInstance)는 public static으로 제공하며, 외부에서는 이 메소드를 호출하여 객체를 가져와야 합니다.
  • Singleton 클래스를 final로 선언하여 다른 클래스에서 상속하지 못하도록 합니다.

방법 2. 객체 필요 시, 생성 및 초기화 (Lazy)

이 방법은 싱글톤 객체가 실제로 사용될 때 객체를 생성하고, 필요하지 않으면 객체를 생성하지 않아 불필요한 객체 생성을 방지하는 방법입니다.

이것을 구현하기 위해 getInstance()는 아래와 같이 동작되어야 합니다.

  • 객체를 생성하지 않았으면 생성 후 객체를 리턴
  • 객체가 생성되어있으면 그 객체를 리턴

다음과 같이 싱글턴 클래스를 구현할 수 있습니다.

public class Example1 {

    public final static class Singleton {
        private static Singleton sInstance;

        private Singleton() {
        }

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

        public void doSomething () {
            System.out.println("Do something");
        }
    }

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.doSomething();
    }
}

위의 구현 방식의 특징은 다음과 같습니다.

  • Singleton 클래스의 생성자는 private으로 설정하여 외부에서 객체를 생성하지 못하도록 합니다.
  • Signleton 클래스를 리턴하는 get 메소드(getInstance)는 public static으로 제공하며, 외부에서는 이 메소드를 호출하여 객체를 가져와야 합니다.
  • getInstance()는 필요 시 객체를 생성하며 리턴하며, 멀티 쓰레드에서 호출될 수 있기 때문에 synchronized로 메소드를 동기화합니다.
  • Singleton 클래스를 final로 선언하여 다른 클래스에서 상속하지 못하도록 합니다.
Loading script...
codechachaCopyright ©2019 codechacha