Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

승쨩개발공부

[DP] Singleton Pattern 본문

Design Pattern

[DP] Singleton Pattern

Unknowns 2021. 12. 14. 15:32

싱글톤 패턴

-> 오직 한 개의 클래스 객체(instance)만을 갖도록 보장하고, 이에대한 전역적인 접근접을 제공

-> 쉽게 구현이 가능해서 자주 사용되는 디자인 패턴 중 하나로 계속 생성하여도 실제로 생성되는 객체는 하나가 된다.

-> 최초 이후에 호출된 생성자는 최초의 객체를 리턴하는 방식.

-> 공통적으로 쓰이는 자원을 관리, 저장하는 객체를 만들 떄 자주 사용됨.

예를들어 게임에서 PlayerObject 같은 단일 객체 일 경우 싱글턴 패턴을 사용하면 관리가 편해짐.

 

 

 

 

싱글톤 패턴 단점

-> 싱글톤 객체(instance)가 너무 많은 일을 해서 많은 데이터를 공유시킬 경우

다른 클래스의 인스턴스들 간의 결합도가 높아진다.

-> 멀티스레드 환경에서 동기화 처리를 해줘야 한다. 동기화 처리를 하지 않으면

인스턴스가 두 개 생기는 경우가 발생 할 수도 있다.

 

 

 

 

기본적인 싱글톤

-> private 생성자와 Get_Instance라는 함수를 통해서 자신을 반환하는 클래스

-> 위의 코드에 대한 문제점은 메모리 관련 문제가 발생 한다.

-> 일단 static 멤버이기 떄문에 Data영역에 할당되며 메모리를 계속 잡고 있고 여기서 더 큰 문제는

-> 다른 전역 객체의 생성자에게 참조 할 경우 문제가 발생 할 수도 있다.

-> 이런 현상이 발생하는 이유는 c++ 에서는 전역인 객체들 생성 순서가 명확히 정해져있지 않다.

-> 그래서 객체의 생성 시점을 변경해야 한다.

 

 

 

늦은 초기화 개념을 도입한 싱글톤

-> 이 객체는 Get_Intance() 를 호출을 하게 되는 시점에 생성이 된다.

-> static Pointer형인 m_pInstance를 새로 생성했기 떄문에 동적메모리 할당이 이루어지고,

-> 해제는 어떻게 할 것인가 생각하게 된다.

-> 이런식으로 사용을 하게되면 자원을 효율적인 메모리와 함께 관리를 하게 된다.

-> 늦은 초기화(Lazy Initialization) 개념에 대해선 Effective C++ 에서 확인해볼 수 있다.

 

 

1. 생성자는 private 으로 막는다, 외부에서 new 를 통한 instance 생성을 할 수 없게 만든다.

 

2. 인스턴스 하나를 담을 수 있는 포인터변수를 선언,

static 으로 설정해서, 오직하나만 존재할 수 있게 만든다.

 

3. m_pInstance를 가져오거나(Get), 메모리 해제(Destroy)할 수 있는 멤버 함수들을 선언

static 변수에 접근할 수 있어야 하고 외부에서 해당 함수들을 쓸 수 있어야 하므로 public 으로 지정.

 

4. Get_Instance() 함수를 구현, m_pInstance가 nullptr이라면, 새로 생성하여 instance를 초기화 해준뒤,

앞으로도 호출될떄마다 이미 생성된 instance를 return 하도록 한다

 

5. Destroy_Instance() 함수를 구현, m_pInstance를 지우고 nullptr 처리한다.

 

6. m_pInstance를 초기화 해주기 위해서는 static 멤버 변수 이므로, 생성자가 아닌 클래스 외부에서.

 

 

 

 

 

 

 

'Design Pattern' 카테고리의 다른 글

[DP] Object Pool  (0) 2022.05.13