싱글톤 패턴
Sun, Jan 15 2023 04:25:08싱글톤이라는 말에 싱글
이라는 말이 들어가 있습니다.
그래서 하나라는 걸 대충 짐작은 할 수 있습니다.
언어를 떠나서 싱글톤이 어떠한 개념인지 그것부터 알아야 됩니다.
어플에서 싱글톤의 개념
보통은 어떤 어플을 실행시키면 어플이 중복적으로 계속해서 실행됩니다. 예를 들어 파일 탐색기를 반복적으로 실행시키면 여러 개 띄울 수 있지요.
그런데 어플이 1개 떴는데 또 어플을 실행시키면 새로운 어플을 띄우지 말고 이미 뜬 어플이 화면에 나타나도록 하고 싶은 경우도 있죠. 실제로 음악 연주 어플인 리듬박스(rhythmbox)를 여러번 실행시켜도 중복적으로 어플창이 뜨지 않고 딱 하나밖에 안 뜹니다. 이러한 개념이 싱글톤입니다.
어플을 중복적으로 실행시켰을 때 어플이 딱 1개만 뜨게끔 하려면 어떻게 해야 할까요? 주로 파일 락킹 메카니즘을 사용합니다. 그외 unix socket 을 만들어서 주소가 사용 중인지 체크하는 방법이 있습니다.
디자인 패턴에서 말하는 싱글톤 패턴의 개념
객체의 생성자를 여러번 호출하더라도 객체 인스턴스가 1개만 생성되도록 하는 것이 싱글톤 패턴입니다. 이런 것이 왜 필요할까요? 예를 들어, 입력기를 만든다고 할 때, 언어 엔진을 언어별로 하나만 생성해두고 응용 프로그램 내에서 공유하면 메모리 소비가 줄겠죠. 그래서 싱글톤 패턴을 사용하는 것입니다. C 언어로는 어떻게 구현하면 될까요? 전역변수를 사용해야 되는 것이 껄끄럽지만 아래처럼 하면 싱글톤 원리를 구현할 수 있습니다.
#include <stdlib.h>
#include <stdio.h>
typedef struct _Singleton Singleton;
struct _Singleton
{
int dummy;
};
static Singleton *singleton_instance;
Singleton *singleton_new ()
{
if (!singleton_instance)
singleton_instance = malloc (sizeof (Singleton));
return singleton_instance;
}
void singleton_free ()
{
if (singleton_instance)
{
free (singleton_instance);
singleton_instance = NULL;
}
}
int main ()
{
Singleton *singleton1;
Singleton *singleton2;
singleton1 = singleton_new ();
singleton2 = singleton_new ();
/* 동일한 주소를 가르키고 있음을 알 수 있습니다 */
printf ("%p %p\n", singleton1, singleton2);
singleton_free ();
return 0;
}