Skip to content

Instantly share code, notes, and snippets.

@djkeh
Last active August 1, 2017 06:22
Show Gist options
  • Save djkeh/3cbbce75df1617541ecfee2638255784 to your computer and use it in GitHub Desktop.
Save djkeh/3cbbce75df1617541ecfee2638255784 to your computer and use it in GitHub Desktop.
static 사용을 제한한 싱글턴 구조의 표현
// static 사용을 제한한 싱글턴 구조의 표현 예제
using System;
public class SingletonService
{
public string GetMessage() => "Hello World";
}
public class ClientModule
{
private readonly SingletonService _service;
public ClientModule(SingletonService service)
{
_service = service ?? throw new ArgumentNullException(nameof(service));
}
public void PrintMessage() => Console.WriteLine(_service.GetMessage());
}
public class IocContainer
{
private readonly Func<ClientModule> _factory;
public IocContainer(Func<ClientModule> factory)
{
_factory = factory ?? throw new ArgumentNullException(nameof(factory));
}
public ClientModule GetModule() => _factory.Invoke();
}
public class Program
{
public static void Main(string[] args)
{
var singleton = new SingletonService();
var container = new IocContainer(() => new ClientModule(singleton));
Run(container);
}
private static void Run(IocContainer container)
{
for (int i = 0; i < 5; i++)
{
ClientModule module = container.GetModule();
Execute(module);
}
}
private static void Execute(ClientModule module) => module.PrintMessage();
}
@djkeh
Copy link
Author

djkeh commented Jul 19, 2017

@gyuwon

안녕하세요,

https://justhackem.wordpress.com/2017/07/05/singleton-is-not-static/

위 글을 읽고 잘 이해가 안 됐던 부분을 개인적으로 질문드렸었는데요,

"싱글턴 규칙을 더 엄격하게 하려면 인터페이스를 정의하고 구현체 non-public final 클래스를 만들어 private 기본 생성자와 public static 인스턴스를 사용할 수 있다"고 말씀해 주셨습니다. 이에 몇 가지 이어서 떠오른 질문을 드리고 싶습니다.

  1. 저는 자바 개발자입니다. 자바 클래스의 종류라면 public 클래스, package scope 클래스, final 클래스, 추상 클래스 정도가 있는데요, non-public 클래스가 무엇인지 모르겠습니다.
  2. 엄격한 적용을 위해 public static 인스턴스를 사용한다면, 결국 엄밀한 싱글턴 적용에는 static이 필요한 요소가 되는 것인가요? 블로그 원문은 static하지 않은 싱글턴의 디자인을 논하고 있었기 때문에 아마 이런 의도로 말씀하신게 아니었을 것으로 생각하지만, 잘 이해하지 못했습니다.
  3. 싱글턴 패턴을 적용할 때, 적용을 하는 하나의 조건이 있는게 아니라 엄격한 정도에 따라 다른 레벨의 싱글턴 패턴들이 있는 것인가요? '인스턴스가 오로지 하나만 존재한다'는 조건만 성립하면 모두 같은 레벨의 싱글턴이라고 생각했었기 때문에 싱글턴 규칙을 더 엄격하게 적용한다는 말씀을 약간 어렵게 느끼고 있었습니다.

제가 C# 코딩은 미숙하여, 샘플 코드는 건드리지 않고 블로그의 것을 그대로 옮겨왔습니다.
여유가 있으실 때 한 번 읽어봐 주시길 부탁드립니다.

감사합니다.

@gyuwon
Copy link

gyuwon commented Jul 21, 2017

  1. public은 공개 범위를 뜻합니다. final인가, abstract인가는 직교 차원이죠. 따라서 Java의 경우 non-public이라 하면 패키지 범위가 되겠죠.
  2. 서비스를 구현하는 측에서 static을 사용하는 것과 서비스를 소비하는 측에서 static을 사용하는 것은 많이 다릅니다.
  3. 경우에 따라 단일 인스턴스 사용이 바람직하지만 필수적이진 않을 수 있습니다. 이 땐 다중 스레딩으로 인해 둘 이상의 인스턴스 생성 가능성이 존재하더라도 관대하게 넘어갈 수 있죠. 하지만 만약 한 프로세스 메모리에 반드시 인스턴스가 하나만 존재해야 하며 둘 이상이 만들어지면 문제가 발생하는 경우라면 엄격한 방법을 선택하게 됩니다.

@djkeh
Copy link
Author

djkeh commented Aug 1, 2017

Gist에 알림 기능이 없어 댓글을 이제야 확인했습니다. 늦은 답신 죄송합니다. 싱글턴 패턴을 적용할 때 그 정도를 관대하거나 엄격하게 조절할 수 있다는 사실이 신선하게 다가오네요. 친절한 답변 정말 감사합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment