싱글톤 패턴

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;
}