디자인패턴

[Java] Singleton 패턴

ZzangHo 2022. 4. 12. 23:53
728x90

디자인 패턴 공부용으로 블로그에 기록을 해본다.

공부에 참고한 자료로는 "Java 언어로 배우는 디자인 패턴 입문" 을 참고 하였다.

정의

프로그램을 실행할 때 보통 많은 인스턴스가 생성된다. 그러나 '클래스의 인스턴스가 단 하나만 필요' 한 경우도 있다. 그것은 시스템 안에서 1개 밖에 존재하지 않는 것을 프로그램으로 표현하고 싶을 때이다. 이 처럼 단 하나의 인스턴스만 생성되도록 하는 것이 Singleton 패턴이다.

 

클래스 설명

이름 해설
Singleton 단 하나의 인스턴스만 생성되는 클래스
Main 동작 테스트용 클래스

 

Singleton 클래스

package Singleton;

public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton() {
        System.out.println("인스턴스를 생성하였습니다.");
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

 

Main 클래스

package Singleton;

public class Main {
    public static void main(String[] args) {
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();

        if (obj1 == obj2) {
            System.out.println("같은 인스턴스입니다.");
        } else {
            System.out.println("다른 인스턴스입니다.");
        }
    }
}

 

Main 클래스 실행 결과

인스턴스를 생성하였습니다.
같은 인스턴스입니다.

Process finished with exit code 0

 

위와 같이 Singleton.getInstance 메소드를 통해 인스턴스를 따로 생성하지 않고 미리 생성 된 인스턴스를 가져다 쓰고 있다.

 

추가로 알게 된 지식

예전에 신입때는 보통 아래와 같이 Singleton 패턴을 구현하였었다.

package Singleton;

public class Singleton {
    private static Singleton singleton = null;

    private Singleton() {
        System.out.println("인스턴스를 생성하였습니다.");
    }

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

 

이렇게 생성을 하면 안된다.

 

이유는 보통 어플리케이션 개발을 할 때 Thread를 사용하는 경우가 많은데 Multi Thread 환경에서는 위와 같이 하게 될 경우 거의 동시에 getInstance 메소드가 호출이 되었을 때 단일 인스턴스가 아닌 다수의 인스턴스가 생성 될 가능성이 있기 때문이다.

 

이런 경우에는 synchronized를 사용하여 엄격하게 Singleton 패턴이 되도록 만들어 준다.

 

'디자인패턴' 카테고리의 다른 글

[Java] Builder 패턴  (0) 2022.04.25
[Java] Prototype 패턴  (0) 2022.04.12
[Java] Factory 패턴  (0) 2022.04.05
[Java] Template Method 패턴  (0) 2022.04.03
[Java] Adapter 패턴  (0) 2022.04.03