티스토리 뷰

Study/디자인 패턴

02 Singleton 패턴

Lkt_Programmer 2017. 9. 9. 00:49
반응형

Singleton 패턴

 

디자인 패턴에서 싱글톤 패턴은 특정 클래스에 대해 new 연산자로 생성되는 인스턴스를 Stack 메모리에 한 번만 할당하여 이후에 new 연산자를 통한 객체 생성 요구에 대해서는 최초에 생성되었던 객체를 반환하는 디자인 패턴입니다. 즉 프로그램의 특정 클래스에 대한 유일 객체를 보장하는 패턴이라고 볼 수 있습니다.

 

일반적으로 앱에서 공통적으로 사용하는 데이터 클래스에 대해서 이와 같은 싱글톤 패턴 형식으로 작성하게 됩니다.


객체 생성을 위한 new 연산자는 해당 클래스의 인스턴스를 stack 메모리에 저장하게 되는데 싱글톤 패턴이 적용된 경우에는 new 사용을 통한 무분별한 인스턴스 생성을 막기 때문에 메모리 낭비를 방지할 수 있습니다.

 

 

<소스코드>

 

 singleton.class

 

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
 
 
public class singleton {
    private static singleton instance;
    private singleton() {}
    private int data=10;
    public static singleton getInstance()
    {
        if(instance == null)
        {
            instance = new singleton();
        }
        return instance;
    }
 
    public void set_data(int data)
    {
        this.data=data;
    }
 
    public int get_data()
    {
        return data;
    }
}

 

Singleton이 적용된 클래스를 살펴보겠습니다. 먼저 생성자의 경우 private로 선언을 하면서 외부터에서 new 사용을 막고 있습니다. 인스턴스를 생성하기 위해서는 getInstance()를 사용하여 instance가 null일 경우에만 new 연산자로 인스턴스를 생성하게 됩니다.

즉, 한번 인스턴스가 생성 된 후에는 계속해서 같은 인스턴스만을 반환하게 되는 겁니다.



 

나머지 get/set 메서드는 정말로 한개의 클래스가 한개의 인스턴스만을 가지는 것을 보장하는지 확인하기 위해 임의로 넣은 메서드 입니다.

 

Main.class

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
 
    public static void main(String[] args)
    {
        singleton instance1 = singleton.getInstance();
        singleton instance2 = singleton.getInstance();
        singleton instance3 = singleton.getInstance();
        
        System.out.println(instance1.get_data());
        System.out.println(instance2.get_data());
        System.out.println(instance3.get_data());
 
        instance1.set_data(20);
 
        System.out.println(instance1.get_data());
        System.out.println(instance2.get_data());
        System.out.println(instance3.get_data());
    }
}
 

 

Main 클래스의 모습입니다. getInstance()를 통해 3개의 인스턴스를 생성하고 있습니다.

앞에 싱글톤 패턴이 제대로 적용 되었다면 instance1, instance2, instance3는 모두 같은 인스턴스 일 것입니다. 실제로 13Line에서 data의 값을 20으로 세팅을 하고 15,16,17 Line의 결과값을 확인하면 모두 같은 결과를 내놓게 됩니다.

 

 

<결과화면>

 

 

 

 

반응형

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

06 프록시 패턴 (Proxy Pattern)  (0) 2017.09.21
05 어댑터 패턴 (Adapter Pattern)  (0) 2017.09.16
04 Builder 패턴  (0) 2017.09.14
03 Template Method 패턴  (2) 2017.09.10
01 Strategy 패턴  (0) 2017.09.04