ONRECU
article thumbnail

한 번 처음부터 끝까지 구현을 하고 리팩토링 시간도 가지다 보니 재사용할 수 있는 객체지향 소프트웨어는 정말 만들기 힘든 것이었다.

구현 할 때는 마감 시간에 쫓기느라 어영부영 만들었는데 나중에 돌아보니 이런 문제점이 있었다.

  1. 난 애초에 만들 때 재사용 가능한 이라는 키워드를 전혀 고려하지 않았다.
  2. 1번과 같은 식으로 구현을 했을 때 문제점을 전혀 느끼지 못 했다.
  3. 이걸 고려하고 만들려고 할 때 어떤 방향이 옳고 그른지를 모른다.

그런 이유로 GOF의 디자인 패턴 책을 조금씩 정리해 본다.

생성 패턴 (Creational Patterns)

특정 목적을 달성하기 위한 하나의 클래스를 만드는 데에는 굉장히 많은 다른 클래스들의 인스턴싱 등이 필요할 것이다.

수많은 클래스가 모여야만 → 하나의 완성된 역할을 수행하는 클래스가 만들어지는데,

이 수많은 클래스를 어떻게 만들면 유연하게, 문제가 있을 때 적게 고치게 만들 수 있을 것인가를 고민해보아야 한다.

이 때 사용하는 것이 생성 패턴이다.

생성 패턴에는 여러가지가 있지만, 일단 단일체부터 공부해 본다.


단일체 (싱글톤 / Singleton)

오로지 하나의 인스턴싱만을 보장한다.

같은 종류의 인스턴스를 필요할 때마다 불러서 여러벌 만들어 버리면 메모리를 낭비하게 된다.

싱글톤 패턴은 이를 방지하기 위해 어플리케이션 실행 시에 한 번만 메모리에 할당한 뒤(Static) 그것을 재활용하는 것이다.

아무리 여러번 호출된다고 하더라도 실제로 생성된 객체는 최초로 생성된 시점의 인스턴스 하나이다.

구현 시 고려 사항

1. 인스턴스가 유일해야 함을 보장한다.

  • 준비물 : Static 멤버 함수, Static 멤버 변수, protected에 생성자
class Singleton {
public:
	static Singleton* Instance();
protected:
	Singleton();
private:
	static Singleton* _instance;
};

//구현
Singleton* Singleton::_instance = 0;

Singleton* Singleton::Instance() {
	if (_instance == 0) {
    	_instance = new Singleton;
	}
    
    return _instance;
}
  • 사용자는 반드시 Instance() 함수를 통해서만 인스턴스에 접근할 수 있다.
  • 생성자가 protected에 선언되어 있으므로 new Singleton()과 같은 기존 인스턴싱 방법은 오류가 난다.

2. Singleton 클래스의 서브클래싱

  • Singleton의 서브클래스를 만들었다고 가정하자.
    그렇다면 이 서브클래스도 Singleton이어야 하지 않은가? 그런데 1번의 코드로는 서브클래스의 Singleton 성질을 보장할 수 없다. 이러한 확장성 문제를 해결하기 위해 아래와 같은 레지스트리 등록 방법을 사용한다.
class Singleton {
public:
	static void Register(const char* name, Singleton*);
	static Singleton* Instance();
protected:
	static Singleton* Lookup(const char* name);
private:
	static Singleton* _instance;
};
  • Register() 메서드를 이용해 Singleton 클래스를 등록한다.
  • Lookup() 메서드를 이용해 Singleton 클래스를 찾는다.

문제점

  • 멀티스레딩 환경에서 동기화가 제대로 이루어지지 않을 경우, 여러 벌의 인스턴스가 생성될 위험이 있다.
  • Global 객체인 싱글톤 클래스를 여러 곳에서 사용하게 되기 때문에 생기는 문제가 항상 있다.
    • 디버깅이 어렵다.
    • 데이터를 변경하면 다른 곳에서도 일괄 변경되기 때문에, 어느 곳에서 문제가 발생할 지 예측할 수 없다.

 

따라서, 매우 조심히 사용하여야 하는 패턴 중 하나이며, 객체 지향 패턴에서는 그 활용도가 떨어질 수 있다.

그러나 데이터가 고정되어 있거나 하나의 시스템에 의해서만 절대적으로 변화하는 구조 등에 잘 사용해 볼 수 있겠다.

경험해본 바로는 게임에서의 날씨 시스템 정도를 싱글톤 패턴으로 디자인하여 사용하였다.

'Memo' 카테고리의 다른 글

티스토리 구리다  (0) 2022.12.30
캡슐화 (Encapsulation)  (0) 2022.12.27