본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



싱글턴 패턴이란 인스턴스를 하나만 만들어 사용하기 위한 패턴이다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러 개 만들게 되면 불필요한 자원을 사용하게 되고, 또 프로그램이 예상치못한 결과를 낳을 수 있다. 싱글턴 패턴은 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다.


싱글턴 패턴을 적용할 경우 의미상 두 개의 객체가 존재할 수 없다. 이를 구현하려면 객체 생성을 위한 new에 제약을 걸어야 하고, 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다.


싱글턴 패턴의 중요 포인트


1. new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다.

2. 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.

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



싱글턴 패턴의 특징


1. private 생성자

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

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

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


아래 예제는 위의 중요 포인트와 특징을 전제로 작성한 코드이다. 2번째 줄을 보면 유일한 단일 객체를 참조할 정적 참조 변수인 obj를 선언하였고, 단일 객체를 반환하는 getInstance()메서드를 6번 라인에서 확인할 수 있다. 또한 new 생성자로 새로운 인스턴스 생성을 막기 위해 3번째 줄에서 private로 생성자를 선언했다. getInstance() 메서드에서는 참조 변수의 객체가 할당되어 있지 않으면(null 일 경우에) 새로운 객체를 생성해서 변수에 변수에 할당하고 return 한다. 아래 예제와 결과 값을 확인해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Singleton {
    private static Singleton obj;
    private Singleton(){};
    public int data = 0;
    
    public static Singleton getInstance() {
        if(obj == null) {
            obj = new Singleton();
        }
        
        return obj;
    }
}
 
 
public class SingletonPattern {
    public static void main(String[] args) {
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
        Singleton obj3 = Singleton.getInstance();
        
        System.out.println(obj1.hashCode() + " : " + obj1.data);
        System.out.println(obj2.hashCode() + " : " + obj2.data);
        System.out.println(obj3.hashCode() + " : " + obj3.data);
        
        System.out.println("\n========obj1의 data를 2로 변경해보자.!========\n");
        obj1.data = 2;
        
        System.out.println(obj1.hashCode() + " : " + obj1.data);
        System.out.println(obj2.hashCode() + " : " + obj2.data);
        System.out.println(obj3.hashCode() + " : " + obj3.data);
    }
}



결과 값


1
2
3
4
5
6
7
8
9
366712642 : 0
366712642 : 0
366712642 : 0
 
========obj1의 data를 2로 변경해보자.!========
 
366712642 : 2
366712642 : 2
366712642 : 2




싱글턴 패턴을 요약하자면 "클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴" 이라고 할 수 있다.