나를 기록하다
article thumbnail
반응형

JAVA 언어로 배우는 디자인 패턴 입문

Singleton 패턴

  • 지정한 클래스의 인스턴스가 반드시 1개만 존재한다는 것을 보증하고 싶을 때
  • 인스턴스가 하나만 존재한다는 것을 프로그램 상에서 표현하고 싶을 때

인스턴스가 하나만 존재하는 것을 보증하는 패턴을 Singleton 패턴이라고 부른다.


예제 프로그램

클래스 목록

이름 설명
Singleton 인스턴스가 하나만 존재하는 클래스
Main 동작 테스트용 클래스

 

클래스 다이어그램

예제 프로그램의 클래스 다이어그램


Singleton 클래스

Singleton은 static 필드(클래스 변수)로 정의되고 Singleton 클래스의 인스턴스에서 초기화된다. 초기화는 SIngleton 클래스를 로드할 때 한 번만 실행된다.

 

Singleton 클래스의 생성자는 private로 되어 있다. 이는 Singleton 클래스 외부에서 생성자 호출을 금지하기 위해서이다. 만약, 다음과 같은 코드가 이 클래스 외부에 있어도 컴파일할 때 에러가 발생한다.

new Singleton()

 

처음부터 프로그래머가 주의해서 new 하지 않도록 해 주면, 생성자를 private로 할 필요는 없다. 하지만 Singleton 패턴은 프로그래머가 어떤 실수를 하더라도 인스턴스가 하나만 생성되는 것을 보증하는 패턴이다. 이 보증을 위해 생성자를 private로 해두는 것이다.

 

Singleton 클래스의 유일한 인스턴스를 얻는 메서드로 getInstance가 제공된다. getInstance는 static Factory Method의 일종이다.

package ch05_Singleton;

public class Singleton {
    private static final Singleton singleton = new Singleton();
    
    private Singleton() {
        System.out.println("인스턴스를 생성했습니다.");
    }
    
    public static Singleton getInstance() {
        return singleton;
    }
}

Main 클래스

Singleton 클래스를 이용하는 클래스. Singleton 클래스의 getInstance 메서드를 사용해 Singleton 인스턴스를 얻는다.

package ch05_Singleton;

public class Main {
    public static void main(String[] args) {
        System.out.println("START");
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
        System.out.println(judge(obj1, obj2));
        System.out.println("END");
    }

    private static String judge(Object obj1, Object obj2) {
        if(obj1 == obj2) {
            return "obj1과 obj2는 같은 인스턴스입니다.";
        }
        return "obj1과 obj2는 같은 인스턴스가 아닙니다.";
    }
}

 

결과

START
인스턴스를 생성했습니다.
obj1과 obj2는 같은 인스턴스입니다.
END

Singleton 패턴의 클래스 다이어그램

Singleton 패턴의 클래스 다이어그램

Singleton 패턴에는 Singleton 역할만 등장한다. Singleton 역할은 유일한 인스턴스를 얻기 위한 static 메서드를 가지고 있다. 이 메서드는 항상 같은 인스턴스를 반환한다.


Singleton 패턴의 특징

인스턴스  수를 제한하는 이유는 무엇일까?

제한을 둔다는 것은 전제 조건을 늘린다는 뜻이다. 인스턴스가 여러 개 존재하면 인스턴스가 서로 영향을 미쳐 뜻밖의 버그를 만들어 낼 수 있다. 그러나 인스턴스가 하나뿐이라는 보장이 있다면 그 전제 조건 하에서 프로그래밍을 할 수 있다.


유일한 인스턴스는 언제 생성될까?

예제에서 'START'라고 표시한 다음 '인스턴스를 생성했습니다.'라고 표시된 것을 알 수 있다. 프로그램 실행 후 처음 getInstance 메서드를 호출할 때 Singleton 클래스가 초기화된다. 그리고 이때 static 필드가 초기화되며 유일한 인스턴스가 만들어진다.


enum을 이용한 Singleton

enum 요소는 상수로서 인스턴스 유일성을 보증받는다. 예를 들어 java.time.Month.APRIL은 달력의 4월을 나타내는 인스턴스이자 시스템에서 유일한 인스턴스이다. 그러므로 요소를 하나만 가지는 enum을 이용하여 다음과 같이 Singleton 패턴을 구현할 수 있다.

enum Singleton {
    INSTANCE;
    public void hello() {
    	System.out.println("hello is called.");
    }
}

이때 유일한 인스턴스에는 Singleton.INSTANCE라는 식으로 액세스할 수 있다. hello 메서드를 호출하는 구문은 아래와 같다.

Singleton.INSTANCE.hello();

관련 패턴

다음과 같은 패턴에서 Singleton 패턴이 사용될 수 있다.

  • Abstract Factory 패턴
  • Builder 패턴
  • Facade 패턴
  • Flyweight 패턴
  • Prototype 패턴
  • State 패턴
반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...