본문 바로가기

용어정리/#디자인패턴

용어정리-[#디자인패턴] 4.Singleton Pattern

[ Singleton Pattern ]

싱글턴 패턴


2018 - 06 - 01


싱글턴 패턴이란 인스턴스를 하나만 만들어 사용하기 위한 패턴이다.



커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러 개 만들게 되면

 불필요한 자원을 사용하게 되고, 또 프로그램이 예상치 못한 결과를 낳은 수 있다.


싱글턴 패턴은 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다.


싱글턴 패턴을 적용할 경우 의미상 두 개의 객체가 존재할 수 없다. 

이를 구현하려면 객체 생성을 위한 new에 제약을 걸어야 하고,

만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다.

따라서 필요한 요소를 생각해 보면 다음 세 가지가 반드시 필요하다.


  • new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다.
  • 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.

  • 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다.


코드를 보면서 이해해 보자.


Singleton.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package singletonPattern;
 
public class Singleton.java {
    static Singleton SingletonObject; // 정적 참조 변수
 
    private Singleton() { }; // private 생성자
 
    //객체 반환 정적 메서드
    public static Singleton getInstance() {
        if (singletonObject == null){
            singletonObject = new Singleton();
        }
 
    return singletonObject;
    }
}
cs


Client.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package singletonPattern;
 
public class Client {
    public static void main(String[] args){
        // private 생성자이므로 new를 통해 생성할 수 없다.
        // Singleton s = new Singleton();
 
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        Singleton s3 = Singleton.getInstance();
 
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
 
        s1 = null;
        s2 = null;
        s3 = null;
    }
}
cs


6번째 줄의 주석을 풀면 바로 에러가 나는 것을 확인할 수 있다.

private 생성자이기에 Singleton 외부에서 new 를 이용해 객체를 생성할 수 없기 때문이다.

주석을 풀었을 때 표시되는 에러 메세지는 다음과 같다.


The constructor Singleton() is not visible


기억해둘 싱글턴 패턴의 특징은 다음과 같다.


  • private 생성자를 갖는다.

  • 단일 객체 참조 변수를 정적 속성으로 갖는다.

  • 단일 객체 참조 변수가 참조하는 단일 객체를 반환하는 getInstance() 정적 메서드를 갖는다.

  • 단일 객체는 쓰기 가능한 속성을 갖지 않는 것이 정석이다.


싱글턴 패턴을 한 문장으로 정리하면


"클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴"


출처

스프링 입문을 위한 자바 객체 지향의 원리와 이해

김종민 저