이 포스트의 목적

  • 싱글턴의 기초적인 기능 구현을 정리하기 위해

이 포스트의 준비물

  • Firefox 4.0 b7 - 이제 쓸만해 졌다.

참조 서적

  • 안드레 알렉산드레스쿠 저. Modern C++ Design. 이기형 역.
    Addiston-Wesley. 인포북. 초판 2003.07.30. page(222~228)

내용

기본적으로 지원해야 하는 것은 "단일 객체 보장", "전역 접근" 이다.

먼저 "단일 객체 보장"을 위해서 C++ 에서 할 수 있는 것은 다음과 같다.

  • 기본 생성자를 private 에 두기 - 그래야 생성자로 생성을 못한다.
  • 복사 생성자, 복사 할당자(대입 연산자)도 private 에 두기 - 그래야 복사로 인해 생성을 못한다.

그리고 "전역 접근"은 C++ 에서 전역 접근 통로를 만들어 주기만 하면 된다. 전역 통로로는 다음과 같은 것들이 있다.

  • 전역 변수
  • 전역 함수
  • calss/struct public static 멤버 변수
  • calss/struct public static 멤버 함수

이 중에 변수는 루틴을 추가 할수 없으므로, 함수에 초점을 두고, 객체 형태로 사용할 것이므로, static 멤버 함수를 사용한다. 이러한 규칙들을 모아두면, 다음과 같은 싱글턴 클래스를 만들수 있다.

설명

  • instance 함수가 참조자(&)를 반환한 이유는 실수라도 delete 연산을 막기 위해서이다.
  • 소멸자가 private 이기 때문에 역시 delete 연산을 막을 수 있다.

기초적인 이 싱글턴에서 추가로 생각해야 할 부분은 "언제 객체를 파괴 시킬까?" 이다.

간단히 생각해 보면, 싱글턴 기능 중 단일 객체가 보장 되었다면, 프로그램 종료까지 객체가 살아 있는건 객체의 크기가 작다면 메모리 누수라고 볼수도 없다. 더군다나, OS 단에서도 프로그램 종료하면 메모리를 날려 주기도 한다.

하지만 이렇게 만든 싱글턴 객체를 이용하여, OS 리소스 를 만들고 해제 하지 않는다면 "리소스 릭:Resource Leak" 이 발생하게 된다. 그러므로 싱글턴 객체의 소멸자에 리소스 해제 기능을 놓고, 싱글턴 객체를 파괴함으로써 이러한 문제를 피해 갈수 있다.

이 문제를 해결하기 위해, 다음과 같이 코드를 수정 할 수 있다.

하지만 이것도 완벽하지 않다. 다음 포스트에 이 싱글턴(Singleton)이 대처하지 못하는 사례를 하나 들고, 코드 변경을 해보자.

여담

  • 멀고도 먼 싱글턴의 세계
  • 함수에 static 지역 변수를  넣고 싱글턴을 구현한 방식을 "마이어스 싱글턴" 이라고 부른다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기