일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- thread
- 유니크포인터
- observer pattern
- 멀티코어
- 옵저버
- 쓰레드
- random access
- MultiCore
- stl
- EFFECTIVE C++
- multi-core
- 게임공학과
- 멀티쓰레드
- 옵저버 패턴
- c++
- vector
- 복사생성자
- Unreal
- Atomic
- 멀티코어 프로그래밍
- Multithread
- 디자인패턴
- 스마트포인터
- sequential
- C
- Design Pattern
- 한국산업기술대학교
- 프레임워크
- 메모리관리
- material
- Today
- Total
태크놀로지
싱글턴 패턴이란 본문
싱글턴 패턴이란?
오직 한개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다. 즉 어플리케이션이 작동하는동안 딱 한번만 생성되고, 어디서나 클래스에 접근할 수 있어 static의 분위기를 갖고 있습니다.
싱글턴을 왜 사용하는가?
어디서나 접근할 수 있다는 가장 큰 장점을 갖고 있는동시에, 인스턴스를 여러개 만들수도 없기 때문에 메모리 낭비에 대한 걱정이 줄어든다. 또한 싱글턴은 처음 사용될때 초기화되므로, 게임 내에서 전혀 사용되지 않는다면 아예 초기화 되지 않는다.
싱글턴의 문제점
게임이 복잡해지면서 싱글턴을 많이 사용하게 된 대가가 따른다. 싱글턴 과다사용 혹은 잘못된 사용은 커플링을 조장한다.
협업 시 코드를 이해하기 어렵게 한다.
전역의 분위기를 갖고 있는 싱글턴 객체는 멀티스레딩과 같은 병렬성 프로그래밍과 맞지 않는다. 공유자원이 증가할수록 쓰레드간의 교착상태 경쟁상태 등, 동기화 버그가 생기기 쉽다.
싱글턴을 사용하기전 다시 한번 생각해보자
첫번째 인스턴스는 한개로 강제하고 싶지만, 전역 접근을 원하지 않는다면, 반대로 클래스를 전역에서 접근하고 싶은데 인스턴스는 여러개 여야 한다면?
예를들어 Log 클래스를 싱글턴으로 구현하였을시, 전역에서 접근이 가능하여 어디서나 로그를 찍을 수 있다. 하지만 인스턴스가 한개여서 로그 파일이 뒤죽박죽 한곳에 쌓여버린다.
실습
싱글턴 패턴의 가장 기초적인 두가지 특징
- 오직 한개의 클래스 인스턴스만을 갖도록 보장
- 전역적인 접근점을 제공
protected:
// 생성자 소멸자 private
TemplateSingleton() {};
virtual ~TemplateSingleton() {};
.
.
.
private:
static Type* m_pApp;
- 생성자와 클래스의 인스턴스는 private으로 감춰놓고 함수를 통해서만 접근할 수 있도록 한다.
static Type* GetApp()
{
if (m_pApp == nullptr)
m_pApp = new Type;
return m_pApp;
};
- static의 분위기를 만들기 위해, 호출이 되지 않는다면 객체 또한 메모리 할당을 하지않도록 한다.
- 인스턴스가 존재하는지를 검사하는 FLAG를 설정하여, 한개 이상의 인스턴스를 생성하지 않도록 한다.
최종 예시코드 - TEMPLATE SINGLETON
template <typename Type>
class TemplateSingleton
{
protected:
// 생성자 소멸자 private
TemplateSingleton() {};
virtual ~TemplateSingleton() {};
public:
static Type* GetApp()
{
if (m_pApp == nullptr)
m_pApp = new Type;
return m_pApp;
};
static void DestroyApp()
{
SAFE_DELETE_PTR(m_pApp);
};
private:
static Type* m_pApp;
};
template <typename Type> Type* TemplateSingleton<Type>::m_pApp = nullptr;
싱글턴을 사용해보며 느낀 소감
싱글턴이란 가장 기초적이면서 정말 생각해야할 부분이 많은 클래스인것 같다. 책에나 인터넷에 나와있는 그대로 싱글턴을 사용하게 된다면 커플링이라는 어마무시한 숙제와 오류가 따라온다.
약 7개월간 졸업작품을 진행하며, 긴시간 프로젝트 프레임워크를 개발하였는데 이로인해 멀티쓰레딩으로 인한 원인 모를 버그와 커플링으로 인해 고치기에는 시간이 너무 많이 소요되는 상황이 발생하였다.
약 7개월이라는 짧은기간동안, 학업과 병행하여 클라이언트 개발자 2인이 게임 하나를 완성시켜야하는 상황과 아직 부족했던 기본 지식으로 인해, 발생했던 에러상항이였던것 같다. 하지만 이러한 문제점을 발견하고 느끼고 있다는 점만으로도 많은것을 이루었다고 생각이 든다.
출처
교수님과 선배들이 추천해준 좋은 책이다.
'디자인 패턴' 카테고리의 다른 글
단점을 보안한 옵저버 패턴 (0) | 2020.09.15 |
---|---|
옵저버 패턴이란? (0) | 2020.09.13 |
커맨드 패턴이란? (0) | 2020.09.11 |
컴포넌트 패턴이란 (0) | 2020.09.08 |
인덱스를 사용한 씬관리 방법 (0) | 2020.09.03 |