상세 컨텐츠

본문 제목

[C++] 싱글톤(singleton) 디자인 패턴과 Lazyitaliztion

c++/디자인패턴

by 뿡뿡이형 2019. 9. 10. 14:30

본문

싱글톤 패턴이란?

단 하나의 인스턴스만 갖도록 보장하는 디자인 패턴.

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
#include <iostream>
template <typename T>
class SingleTon {
private:
   static T* Instance;
 
protected:
   SingleTon() {}
   ~SingleTon() {}
   SingleTon(const SingleTon& instance) {};
 
public:
   static T* GetInstance()
   {
      if (!Instance)
         Instance = new T();
 
      return Instance;
   }
};
template <typename T> T* SingleTon<T>::Instance;
 
//상속받은 클래스
class AA :public SingleTon<AA> {
public:
   void printHellowWorld() { printf("Hellow World"); }
};
 
 
int main()
{
   AA::GetInstance()->printHellowWorld();
}
 

코드를 보면 getInstance함수에서 instance가 있는지 확인하고 없다면 만들어주고 있으면 Instance를 반환 해준다.

이런식으로 인스턴스를 하나만 만들어 그 인스턴스를 사용하는 패턴이다.

장점

  • 고정된 메모리 영역을 얻으면서 하나의 인스턴스를 사용하여 메모리를 낭비하지 않음
  • 전역 인스턴스라 데이터 공유가 쉬움

단점

  • 다른 클래스의 인스턴스들 간의 결합도가 높아져 "개방 폐쇄의 원칙"을 위배함

Lazyitaliztion(게으른 초기화, 지연 초기화)

객체 생성을 지연하는 전술

Lazyitaliztion이란 객체를 필요할 때 만드는것이다.

1
2
3
4
5
6
//그냥 초기화하는 경우
Class Student {
    private List<Grade> grades = new ArrayList<Grade>();
 
}
 
 
1
2
3
4
5
6
7
8
9
10
//게으른 초기화를 사용하는경우
Class Student {
  private List<Grade> grades;
  ...
  ...
  public List<Grade> createGrades(){
      if( grades != null)
          return grades;
      return new ArrayList<Grade>();
  }
 
 
 

적합한 경우

  • 정의된 필드가 많은 경우 사용되지 않는 상황이나 초기화를 빨리 수행하고 부가작업을 뒤로 미루고 싶을때 적합하다.

피해야 하는 경우

  • 최적화를 통해 성능 저하를 해결해야 하는 상황이 아니라면 초기화의 지연을 사용하지 않아야한다. 어떤 경우에는 초기화 지연기법이 디버깅을 어렵게 할 수 있기때문이다.