Post

[C++ / Design Pattern] 싱글톤 패턴 #2

1. 싱글톤 패턴이란?

싱글톤 패턴은 어떠한 클래스의 인스턴스가 오직 1개만 생성되는 패턴을 의미합니다.
싱글톤 패턴을 다양한 방법으로 구현될 수 있지만,
이번 예시에서는 인스턴스를 얻어올 때 전에 생성된 인스턴스가 있는지 검사하는 방식으로 구현하겠습니다.

2. 싱글톤 구현

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
#include <stdlib.h>
#include <iostream>

using namespace std;

class Singleton {
public:
    int value = 0;

    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
            atexit([]() {
                delete instance;
            });
        }
        return instance;
    }

private:
    Singleton() {};
    Singleton(const Singleton& other) {};
    ~Singleton() {};

    static Singleton* instance;
};

Singleton* Singleton::instance = nullptr;

int main() {
    Singleton* singleton1 = Singleton::getInstance();
    Singleton* singleton2 = Singleton::getInstance();

    cout << singleton1->value << endl;

    singleton2->value = 5;

    cout << singleton1->value << endl;
}
1
2
3
0
5

위에서 사용된 함수 atexit은 프로그램이 종료되기 직전에 호출될 함수를 등록해주는 함수입니다.
따라서 new 연산자로 생성된 객체로 인한 메모리 누수를 막을 수 있습니다.

또한 실행 결과로 알 수 있듯이 singleton2 객체의 value 프로퍼티를 5로 할당하고
singleton1 객체의 value 프로퍼티를 출력한 결과 5가 출력된 것을 확인할 수 있습니다.
이는 싱글턴 패턴의 특징 때문으로 Singleton 클래스의 인스턴스는 실질적으로 1개만 생성되기 때문에
singleton1singleton2가 동일한 객체를 가르키는 포인터라는 것을 알 수 있습니다.

This post is licensed under CC BY 4.0 by the author.