티스토리 뷰

반응형

싱글톤(Singleton)이란 무엇일까?


간단히 말해 1개의 Class에 1개의 Instance를 말합니다.

다르게 표현하면 Instance가 사용될 때 똑같은 Instance을 만드는 것이 아니라, 동일 Instance 을 사용하도록 합니다.


기본적으로 사용하는 Singleton은 다음과 같습니다.


1
2
3
4
5
6
7
8
public final class Singleton(){
  private static final Singleton instance = new Singleton();
  private Singleton(){}
  
  public static Singleton getInstance() {
     return instance;
  }
}



Lazy initialization

인스턴트가 사용하는 시점에 인스턴스 생성하는 방식도 있습니다. 

multi thread 방식에서 동일 시점에 인스턴스 생성 시 두 번 생길 수 있는 문제를 방지하기 위해서 synchronized 을 붙였습니다.


1
2
3
4
5
6
7
8
9
10
public final class Singleton(){
  private static Singleton instance = null;
  private Singleton(){}
  
  public static synchronized Singleton getInstance() {
    if (instance == null){
   instance = new Singleton(); 
    return instance;
  }
}



Effective Java에서 언급된 내용인데, 클래스 사용 시 무조건 생성자를 생성하는 것이 아니라 public static 함수를 사용하는 어떨지 고민하고 사용하길 권장합니다.

enum 싱글턴

JDK 1.5 부터 싱글턴을 구현할 때 새로운 방법을 할 수있습니다.

원소가 하나뿐인 enum 자료형의 정의합니다. 간결하며, 직렬확 자동으로 처리되는 장점이 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public enum  Singtuns {
    INSTANSE;
 
    private int a = 0;
 
    private Singtuns(){
        System.out.println("Singtuns C");
        a = 10;
    }
 
    @Override
    public String toString() {
        System.out.println("a = " + String.valueOf(a));
//        Log.d("TEST", "a = " + String.valueOf(a));
        return super.toString();
    }
 
    public void hi(){
        a = 1;
        System.out.println("hi");
    }
}
 
...
 public static void main(String[] args) {
      System.out.println(Singtuns.INSTANSE.toString());
      Singtuns.INSTANSE.hi();
      System.out.println(Singtuns.INSTANSE.toString());
}



enum 싱글턴 접근법은 public 필드와 사용하는 구현법과 동등합니다. 


아직 널리 사용되고 있지않지만 가장 좋은 싱글턴 방법이지 않을까 생각된다고 Effective Java 는 언급하였습니다.



참고

* https://blog.seotory.com/post/2016/03/java-singleton-pattern

https://en.wikipedia.org/wiki/Singleton_pattern

* Effective Java 2/E



반응형

'프로그래밍 > Design Patterns' 카테고리의 다른 글

역할 사슬(Chain of Responsibility) 패턴  (0) 2022.01.21
빌더(Builder) 패턴  (0) 2022.01.20
브리지(Bridge) 패턴  (0) 2022.01.14
템플릿 메소드 패턴  (0) 2021.09.27
데코레이터 패턴(Decorator Pattern)  (0) 2021.08.09
댓글