Skip to content

Day 17(21.09.29)

Byeong Gwan Seo edited this page Sep 29, 2021 · 3 revisions

24. 싱글톤 디자인 패턴(Singleton Design Pattern)

(1) 디자인 패턴이란?

디자인 패턴이란, 소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 수 있는 해결책이다.
여기서 패턴은, 각기 다른 소프트웨어 모듈이나 다양한 응용 소프트웨어 시스템을 개발할 때, 서로 공통되는 설계 문제가 존재하며 이를 처리하는 과정에서의 공통점. 이러한 공통점들을 패턴이라고 한다.

(2) 싱글톤 디자인 패턴(Singleton Design Pattern)

싱글톤 디자인 패턴이란 멤버 변수를 사용하지 않고, 인스턴스를 하나만 생성하도록 하며, 어디에서든지 인스턴스를 참조할 수 있도록 하는 패턴이다. 여기서 중요한 부분은 인스턴스를 하나만 생성한다는 점인데, 사원이 근무하는 회사, 차량이 출고되는 공장 등 가끔씩 단 하나의 인스턴스만을 생성해야 하는 경우가 있다. 이럴때 싱글톤 디자인 패턴을 사용하며, 이때 생성되는 유일한 인스턴스를 싱글톤(singleton)이라고 한다.

(3) 싱글톤 패턴의 사용법

  • 싱글톤 생성하기
    싱글톤을 생성하려면 먼저 클래스 외부에서 new 연산자로 인스턴스를 생성할 수 없도록 막아야한다. 만약 new 연산자를 사용할 수 있게되면 사용한만큼 인스턴스가 계속 생성되기 때문이다. 때문에 이를 막기위해 생성자에 접근제어자 'private'을 붙여준다. private 생성자를 사용했으므로 당연히 같은 클래스 내부에서는 new 연산자로 생성자를 호출할 수 있다.
  • 정적 필드 선언 및 인스턴스 생성
    자신의 타입인 정적 필드(static)를 선언하고 자신의 인스턴스를 생성해서 초기화한다. 위에서 언급했듯 클래스 내부에서는 new 연산자로 생성자를 호출할 수 있다. static 필드 또한 private 접근제한자를 붙여 외부에서 필드값을 변경하지 못하도록 한다.
  • 정적 메소드(static method) 선언
    외부에서 자신을 호출하는 정적 메소드를 선언한다. 보통 getInstance()로 작성하는데, 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.
    아래는 싱글톤 패턴을 구현하는 프로그램이다.
public class Singleton {
    //정적 필드
    private static Singleton singleton = new Singleton();

    //생성자
    private Singleton() {}

    //정적 메소드
    static Singleton getInstance() {
        return singleton;
    }
}
public class SingletonExample {
    public static void main(String[] args) {

    Singleton object1 = Singleton.getInstance();
    Singleton object2 = Singleton.getInstance();

    if (object1 == object2) {
        System.out.println("같은 Singleton 객체입니다.");
    } else {
        System.out.println("다른 Singleton 객체입니다.");
    }
  }
}

Result

같은 Singleton 객체입니다.  

위 프로그램을 하나씩 살펴보자

private static Singleton singleton = new Singleton();

먼저 정적 필드를 선언하고 인스턴스를 생성해 초기화했다. 여기선 singleton이라는 참조변수가 생성된 인스턴스인 Singleton을 참조하고 있다.

private Singleton() {}

외부에서 new 연산자를 사용해 인스턴스를 생성하지 못하도록 private 접근제한자를 사용하여 생성자를 선언했다.

static Singleton getInstance() {
        return singleton;
    }

그리고, 정적 필드에서 참조하고 있는 인스턴스를 반환하는 정적 메소드를 선언했다.
이렇게 생성된 클래스는 private 접근제한자를 사용했기에 외부에서

1)
Singleton object1 = new Singleton();
Singleton object2 = new Singleton();

2)
Singleton object1 = Singleton.getInstance();
Singleton object2 = Singleton.getInstance();

1번과 같이 new 연산자를 사용해 인스턴스를 생성할 수 없다. 대신 2번 방법처럼 유일하게 생성된 인스턴스를 호출하는 정적 메소드인 getInstance()를 사용해 객체를 얻을 수 있다. 여기서 object1과 object2의 주소값을 출력해보면 같은 주소가 출력되는 것을 통해, 인스턴스는 단 하나뿐이라는 것을 확인할 수 있다.
다음다음 프로그램은 아이언맨을 유일한 인스턴스, 싱글톤으로 설정했다. 출력 결과는 아래와 같다.
Result

Tony Stark, 32
Tony Stark, 32
IronMan@880ec60
IronMan@880ec60  

위와 마찬가지로 ironman1과 ironman2 참조변수는 싱글톤인 IM 객체를 참조하고 있다는 것을 확인할 수 있다.

Clone this wiki locally