2009년 08월 02일
싱글턴(Singleton) 디자인 패턴
어떤 객체가 전역적으로 참조할 필요가 있고, 단 객체의 인스턴스 갯수를 하나로 제한할 필요가 있는 경우 아래와 같은 방법들을 생각할 수 있다.
[1] 인스턴스를 하나 만들고, 참조가 필요한 곳에 인수로 인스턴스의 참조를 전달한다.
[2] 역시 인스턴스를 하나 만들되, extern 선언으로 참조한다.
위에서 첫번째 방법은 객체의 인스턴스를 필요로 하는 모든 곳에 해당 인스턴스의 참조를 인수로 넘기는데 이것은 매우 비효율적이다. 추가된 인수는 매번 스택에 넣어지는 추가 비용을 치르게 된다. 두번째 방법으로 extern 선언은 코드의 요소 간에 결합도(binding)가 커지고 가독성이나 명확성을 떨어뜨려 유지보수와 재사용에 좋지않은 결과를 가져온다.
이를 해결하기 위한 것이 아래와 같은 싱글턴(Singleton) 디자인 패턴이다.

먼저 위의 코드에서 특이한 점은 6~7번 줄에 Singleton 클래스의 생성자(ctor)가 protected 속성으로 선언된 것이다. 따라서 클래스 외부에서는 객체에 대한 인스턴스를 만들 수 없게 된다. 따라서 객체의 인스턴스는 내부에서만 생성할 수 있게 되었다. 이런 객체의 생성과 외부로의 접근을 위해서 public 속성의 멤버함수 GetInstance()를 정의하고 있는데, 중요한 것은 이 함수와 이 함수에서 Singleton 객체의 인스턴스를 할당받는 포인터 변수는 정적(static)멤버라야 한다는 것이다. 왜냐하면 인스턴스가 없는 상태에서 정적으로 선언된 GetInstance()를 통해서 정적변수 pInstance에 인스턴스를 할당해야 하기 때문이다.
이 싱글턴 패턴을 이용하면 어느 상황에서도 항상 하나의 변수만을 생성할 것이다.
참고로 동적할당된 싱글턴 객체의 해제는 언제하는 것인가를 고민할 수도 있는데 위의 코드에서 할당된 객체는 프로그램 종료 시에 해제되므로 걱정할 필요는 없다. 메모리 누수는 루프 등에서 지속적으로 메모리 할당을 하는데 해제는 하지않는 상황에서 발생하는 문제일 뿐이기 때문이다. 이런 싱글턴 객체는 한 번 이상 생성될 수 없으므로 메모리 누수 문제에 대해선 비교적 안전하다.
# by | 2009/08/02 12:20 | Design Pattern | 트랙백 | 핑백(1) | 덧글(0)


