개발자 면접 공부/C-C++

싱글톤 패턴(SingletonPattern)

chogyujin 2022. 8. 4. 21:29
728x90

오늘은 싱글톤 패턴에 대해 공부하겠습니다.


싱글톤

프로그램안에서 어떤 클래스의 인스턴스가 단 1개만 존재 하도록, 폐쇄적으로 클래스를 디자인 하는 것

 

이러한 이득은

 

1. 코드의 가독성

여러개의 클래스가 아닌 하나의 클래스를 독자적으로 사용함

 

2. 불필요한 객체생성 피함

프로그램 코드를 짜다보면 불필요한 객체들이 여러 생성됩니다.

 

3. 코드의 세밀함

싱글톤을 만들기로 맘을 먹었다면 최대한 여러곳에서 사용할 수 있도록 설계해야함

 


#include<iostream>

using namespace std;

class Singleton
{
private:
	Singleton() {}
	~Singleton() {}
private:
	static Singleton* m_Singleton;
public:
	static Singleton* GetInstance()
	{
		if (m_Singleton == nullptr)
		{
			m_Singleton = new Singleton();
		}
		return m_Singleton;
	}
	static void DestroyInstance()
	{
		if (m_Singleton == nullptr)
		{
			return;
		}
		delete m_Singleton;
		m_Singleton = nullptr;
	}
};

Singleton* Singleton::m_Singleton = nullptr;

int main()
{
	Singleton* s = Singleton::GetInstance();
	Singleton* s1 = Singleton::GetInstance();
	return 0;
}

우선 코드를 보면 Singleton클래스 안에 생성자 소멸자를 private안에 넣어줬습니다. 이 뜻은 생성자와 소멸자를 사용을 안하겠다는 의미이기도 합니다 (외부에서 new를 사용하여 인스턴스 생성 방지).

또한 GetInstance를 통해 class내부에 있는 변수 m_Singleton을 메모리에 할당을 해주었습니다. 오직 하나의 인스턴스만 실행하겠다는 뜻 입니다.

GetInstance를 static으로 선언한 이유는 GetInstance에 접근을 하기위해서는 Static 선언을 해주어야 하고 또한 변수도 static을 선언해야 외부에서 접근이 가능합니다. 또한 public으로 정한것은 외부에서 함수를 접근하기 위함입니다.

싱글톤 변수를 클래스 밖에서 초기화 해줍니다.

 

이러한 싱글톤을 굳이 사용하는 이유가 무엇일가요? 그냥 static 변수에 객체를 하나 담아서 사용하면 그만인데?

 

싱글톤 vs 전역변수

 

만약 메모리가 큰 클래스가 있으면 클래스 자체를 전역변수로 선언하여 그 클래스의 인스턴스를 사용하지 않아도 이미
메모리상에 올라가버리게 됩니다.
반면 싱글톤은 클래스를 사용하기 전에는 메모리를 사용하지 않습니다 클래스를 사용하는 그 시점에 객체를 생성하기 떄문에 불필요한 낭비를 줄일 수 있는것이지요

 

class A()
{
	public:
    A(){}
    ~A(){}
}
static *A a,b;

이런식으로 A클래스를 a,b 인스턴스 생성도 가능합니다. 그래서 전역변수랑은 다릅니다.

하지만 단점은?

꼭 하나만 생성하기때문에 클래스 안에있는 변수는 계속 고정입니다 또한 메모리 해제도 꼭 해줘야하지요

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

C++ RAII  (0) 2022.08.11
업 캐스팅 다운 캐스팅  (0) 2022.08.08
Struct vs Class  (0) 2022.08.03
(C++) 이동생성자(Move Constructor)  (0) 2022.08.02
(C,C++) L-Value, R-Value  (0) 2022.08.02