본문 바로가기

코딩 이야기/Gof 디자인 패턴

싱글톤 패턴 C++로 구현하기(Singleton pattern)

반응형

싱글톤 패턴이란?

 

싱글톤 패턴은 아무리 많은 객체를 생성해도, 단 하나의 인스턴스만을 생성한 것과 같은 디자인 패턴이다.

원래 같으면 여러 개의 객체를 생성하면 각각의 객체가 가진 변수는 값을 공유하지 않는다.

#include<iostream>

class Math{
    public:
        int score = 0;
        void setscore(int a){
            score = a;
        };
        int getscore(){
            return score;
        };
};

using namespace std;

int main(){
    Math *math1 = new Math(); //math1이라는 객체 생성
    Math *math2 = new Math(); //math2이라는 객체 생성
    cout << math1->getscore() << endl;
    cout << math2->getscore() << endl;
    math1->setscore(4); //math1 객체의 score값을 변경
    cout << math1->getscore() << endl; //4 출력
    cout << math2->getscore() << endl; //0 출력
}

위의 코드를 보면 math1의 score와 math2의 score는 다르다는 것을 알 수 있다.

math1의 score를 4로 바꿨지만 math2의 score는 그대로 값이 0이다.

 

하지만 싱글톤 패턴을 사용하면, math1의 score값만 바꿔도 결국 생성된 인스턴스는 1개이므로 math1과 math2의 score값은 같게 된다.

 


 

C++ 코드

 

Singleton.h

#include<iostream>

class Singleton{
    private:
        static Singleton* instance;
        Singleton(const Singleton& other);
        Singleton(){value = 5;};
        ~Singleton(){}; //생략가능
        int value;
    public:
        static Singleton* GetInstance(){
            if(instance == NULL){
                instance = new Singleton();
            }
            return instance;
        }
        int GetValue(){return value;};
        void SetValue(int a){value = a;};
};
Singleton* Singleton::instance = nullptr;

Singleton.h 설명 

 

인스턴스는 단 한개만 존재해야하고 값이 다시 선언되지 않도록, private에 static을 달아서 instance를 선언해준다.

 

생성자가 다른 스크립트에서 생기면 안되므로, 생성자에 private를 달아주고, value의 값을 설정해준다.

그리고 소멸자도 생성해준다. 소멸자는 함수가 소멸될 때, 호출되므로 동적할당을 한 것을 삭제하거나, 함수를 사용한 main함수가 끝날 때도 실행이 된다. 사실 위의 코드 예제에서는 별 중요한 역할이 아니다.

 

GetInstance함수를 만들어서 객체를 아무리 만들어도 하나의 인스턴스만 생기도록 함수를 만들어준다. instance가 생성되지 않았을 경우 instance에 new Singleton();으로 함수를 할당해 주고, 이미 instance가 생성된 적이 있다면, 생성된 instance를 반환한다.

 

int value와 GetValue와 SetValue는 단순히 인스턴스가 한 개만 생성되었는 지 확인하기 위한 것들이다.

 

 


 

 

main.cpp

#include<iostream>
#include "Singleton.h"

using namespace std;

int main(){
    Singleton* singleton = Singleton::GetInstance();
    Singleton* singleton2 = Singleton::GetInstance();
    cout << singleton->GetValue() << endl; //5 출력
    cout << singleton2->GetValue() << endl; //5 출력
    singleton->SetValue(3);
    cout << singleton->GetValue() << endl; //3 출력
    cout << singleton2->GetValue() << endl; //3 출력
}

main.cpp 설명

 

Singleton 패턴은 외부 스크립트에서 생성자를 사용하면 안되므로, 위에서 만들어둔 GetInstance를 사용해서 2개의 객체를 만든다.

그리고 GetValue로 값을 출력하면 두 객체 모두 위에서 설정해둔 5로 출력이 될 것이다.

그리고 SetValue를 통해 하나의 객체만 값을 바꿔도, GetValue로 확인해보고면 둘다 바뀌어있는 것을 알 수 있다.

 

 

 

끝맺는 말

 

싱글톤 패턴은 간단하지만 많이 사용되고 강력한 디자인 패턴이므로, 필수로 알아두도록 하자.

 

 

 

반응형

'코딩 이야기 > Gof 디자인 패턴' 카테고리의 다른 글

Gof 디자인 패턴이란 무엇인가?  (0) 2021.10.16