본문 바로가기

C, C++

[C++] 싱글톤 패턴

싱글톤 패턴(Singleton pattern)

 

싱글톤 패턴은 C++ 외에 객체지향언어에서 작성하기 쉬우면서 유용하게 쓰이기에 많이 사용되는 디자인패턴 입니다.

 

 

 

어떨때 사용하나요?

언제 어디서나 객체를 참조가 가능하다는 이유로 싱글톤 패턴을 정의하는 경우가 있는데.. 그것 보다는 프로그램 내에 단 하나만 존재해야하는 객체가 필요할 때 사용하는것이 일반적입니다.

예를들면 환경설정을 관리하는 객체같은 경우는 여러개가 존재 할 필요가 없으니 싱글톤 객체로 설계하는것이 좋습니다.

 

단점도 있어요!

아무래도 싱글톤 패턴의 특성상 객체가 static 으로 선언되기 때문에 싱글톤 객체를 사용하지 않더라도 일단 메모리에 올려놓습니다.

사용하지 않는 싱글톤 객체를 메모리에 잡아두니, 메모리 낭비가 될 수 밖에 없죠. 하지만 단점보다 장점이 많기에 많은 개발자들이 사용합니다.

 

간단한 일반적인 싱글톤 패턴의 설계

 

(▼ Singleton.h)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
 
class Singleton
{
private:
    Singleton() {}
    static Singleton* inst;
 
public:
    static Singleton* getInstance();
    void showMessage();
};
 
 
cs

 

[5~7] private 로 생성자가 정의되어 있습니다. 이는 외부에서 생성자를 통한 싱글톤 생성을 막아두기 위함입니다.

또, 전역 static 형식으로 Singleton 객체를 선언하였습니다.

[9~11] 어디서든 싱글톤 객체에 접근할 수 있게 하기위해 static으로 함수를 정의하였습니다.

 

 

(▼ Singleton.cpp)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Singleton.h"
#include <iostream>
 
Singleton* Singleton::inst = nullptr;
 
Singleton* Singleton::getInstance()
{
    if (inst == nullptr)
        inst = new Singleton();
 
    return inst;
}
 
void Singleton::showMessage()
{
    std::cout << "I am Singleton" << std::endl;
}
 
cs

 

[7~9] 싱글톤 객체가 이미 선언되어있는지 체크하고 선언되어 있다면 이미 선언되어있는 객체의 주소값을 반환합니다.

하지만 선언되어 있지 않다면 싱글톤 객체를 생성자를 통해 생성합니다.

 

(▼ main.cpp)

1
2
3
4
5
6
7
8
9
10
#include<iostream>
#include"Singleton.h"
 
 
int main(void)
{
    Singleton::getInstance()->showMessage();
 
    return 0;
}
cs

[7] getInstance() 함수를 이용해서 전역으로 선언된 싱글톤 객체에 접근하여 함수를 호출하였습니다.

'C, C++' 카테고리의 다른 글

[C++] 랜덤 함수  (0) 2016.02.18
[C언어] 10진수를 2진수데이터로 바꾸기  (0) 2015.05.28