싱글톤패턴 --------------------------------------------------------------------------------------------------

싱글톤 패턴은 객체를 1개만 생성하게 하는 문제를 해결해주는 패턴이다.

자 생각해보자. 어떠한 cpp에서 어떠한 클래스에 대해서 알고 있다면 그 클래스를 지속적으로 객체화 시킬수 있을 것이다.

싱글톤 패턴이란 클래스의 생성자체를 클래스 내부의 함수로 국한시키고 그 함수를 통해서만 객체를 공개함으로서 그 함수의 객체를 1개로 유지시키는 패턴이다.

싱글톤은 일반적으로 사람들이 클래스에 대한 정의만 알면 어디에서든 가져다 쓸 수 있다는 점에만 집중하는데 

싱글톤 패턴의 가장 중요한 점은 생성에 관련해서는 어떤방식으로 함수를 호출해도 객체는 유저가 정한 1개만큼 호출된다는 것이다.


즉 가장 중요한점은.

1. 객체의 생성은 그 클래스의 함수를 통해서만 이루어진다.


싱글톤은 다양한 방법으로 구현이 가능하지만 처음 프로그래밍을 배울때 단순히 편하다는 이유로 마구 남발하는 경우가 있었다.

어떤 유명프로그래머는 싱글톤패턴은 궁극적으로는 결국 프로그램의 구조를 나쁘게한다고 이야기하기도 했다.

현재 내가 생각하는 단점은 한가지이다. 

싱글톤패턴은 프로그래머의 고민을 없애버린다.

고민이란 점점더 발전하여 더 좋은 구조를 짜나가는 것을 의미한다고 본다.

그런데 싱글톤은 그 길을 그냥 직빵으로 뚫어버릴 때가 많다.

게임 프로그래밍이란 결국 값에 대한 저장이고 값에 대한 조작이다.

싱글톤은 그 값에 대한 접근을 너무 용이하게 하는 경우가 많다.


코드 -----------------------------------------------------------------------------------------------

패턴적용 스토리는 딱히 없다. 싱글톤이란 말그대로 응용하기에 따라서 무궁무진하게 적용이 가능하다. 말그대로 모든 패턴과 연관지을수 있기 때문이다.


도도하게 떠있는 싱글톤 이름에 어울리는 uml이다.


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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#pragma once
#include "include.h"
 
class CSingleTon
{
private:
    int        iNum;
 
public:
    void SetiNum(int i)
    {
        cout << i << "숫자 바꿈" << endl;
        iNum = i;
    }
 
private:
    static CSingleTon* m_pInst;
 
public:
    static CSingleTon* GetInst( void )
    {
        if(m_pInst == NULL)
            m_pInst = new CSingleTon;
        return m_pInst;
    }
 
    static void DestroyInst( void )
    {
        if(m_pInst) { SAFE_DELETE(m_pInst); }
    }
 
private:
    CSingleTon( void ) {}
 
public:
    ~CSingleTon( void ) {}
};
 
CSingleTon* CSingleTon::m_pInst = NULL;
 
#include "stdafx.h"
#include "include.h"
#include "SingleTon.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    for(int i = 0 ; i < 10 ; ++i)
    {
        CSingleTon::GetInst()->SetiNum(i);
    }
 
    CSingleTon::DestroyInst();
    return 0;
}
 
 



보면 알겠지만 CSingleTon클래스의 생성자는 private로 설정되어있다. 즉 외부에서는 이 클래스에 대한 객체를 생성이 불가능하다. 

하지만 static로 선언된 자기자신에 대한 포인터를 가지고 있고 GetInst()라는 함수를 통해서 이 포인터를 동적할당하여 힙영역에 할당한다. 

어디에서 먼저 시작했건 이 클래스에 대한 인스턴스는 단 1개만 유지된다.

static로 선언되어있기 때문에 그것은 더욱더 보장된다.

즉 클래스에 대한 접근권한을 GetInst()로 국한시키고, 그안에서 생성할수 있는 개수를 제한한다.

그렇게 생성된 객체를 통해서 내부의 맴버함수에 접근할수 있게 됨으로서 언제 어디서든지 헤더만 추가하면 이 클래스에 대한 접근과 고유한 객체생성에 대한 보장을 받게 된다.

Posted by JJOREG