본문 바로가기
Theory/Design Pattern

SINGLETON PATTERN

by y.j 2021. 7. 20.
728x90

Sinlgeton pattern

싱글톤 패턴은 "유일한 인스턴스를 생성하고 이것을 global하게 접근할 수 있도록 제공하는 것이다."
싱글톤 패턴은 아래의 2가지 문제에 대해 해결책을 제시해 준다.

1.어떻게 단 한개의 인스턴스를 생성 할 수 있을까?
2.이 유일한 인스턴스를 global하게 접근 할 수 있을까?


싱글톤 패턴은 왜 필요할까?
증권사 시스템을 개발한다고 가정해보자! 한꺼번에 다양한 사람들의 주문이 들어오는데 여러객체가 각 각 처리한다면 어떤 현상이 발생할까? 매도 주문을 100개 밖에 없는데 1000개가 처리되는 기이한 현상이 일어날 것이다. 단 한개의 인스턴스가 처리하게 만든다면 매수 주문을 100개 이상 처리 할 수 없도록 만들 수 있다.

 

Background

static

접근 제한자는 객체를 메모리에 상주시키는 제한자이다. 항상 메모리에 Load되어 있기 때문에 메모리에 다른 인스턴스에서 접근 할 수 있도록 해준다면 global하게 접근 할 수 있다.

 


private

접근 제한자는 같은 class내에서만 사용 할 수 있도록 제한해준다. 외부에서 접근이 불가능 하기 때문에 다른 인스턴스들이 마음대로 조작 할 수 없도록 막아준다. 따라서 인스턴스가 유일 할 수 있도록 제한해주는 것이다.

 

Solution

맨 처음 해야 할 일은 유일한 객체를 생성하도록 제한을 해주어야 한다는 것이다. 아래 소스코드를 보면 private static final로 제한하고 있는데 말로 풀어보자면 항상 메모리에 load하고 있으며(static), 변경 할 수 없고(final), class내에서만 접근이 가능하다(private) 로 말 할 수 있다. 또한, 생성자또한 private으로 정의되어 있어 new Singleton()으로 클래스를 생성 할 수 없다는 점에 유의해야 한다.

package com.sample.singleton.basic;
public class Singleton { 
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() { }
    public static Singleton getInstance() { 
        return INSTANCE;
    } 
}

그렇다면 어떻게 광범위하게 접근 할 수 있을까? 그것은 getInstance() 메소드를 보면 알 수 있다. 새로운 생성자를 제한하는 대신에 Singleton이라는 클래스가 가지고 있던 INSTANCE를 return해주는 것이다. getInstance()의 return값을 받게 되기 때문에 접근이 가능하게 된다.

아래 예제 코드를 통해 ref1, ref2가 getInstance메소드를 통해 같은 인스턴스 여부를 확인 할 수 있다.

 package com.sample.singleton.basic;
 public class MyApp {
     public static void main(String[] args) {
         Singleton ref1 = null, ref2 = null;
         ref1 = Singleton.getInstance();
         ref2 = Singleton.getInstance();
         if (ref1 == ref2) {
                 System.out.println("Singleton instantiated only once.");
        }
   }
} 

 

Advantage

 getInstance 메소드를 통해 클래스의 인스턴스의 수를 조절 할 수 있다.

 

Disadvantage

 1. 싱글톤도 위에서 언급된 것 처럼 전역성을 띄면서 다른 객체와 공통으로 사용하는 경우와 같은 몇 가지 케이스에서만 사용할 때 효율적이며 그 외에는 문제점이 생길 수 있다.

 2. 일단 싱글톤으로 만든 객체의 역할이 간단한 것이 아닌 역할이 복잡한 경우라면 해당 싱글톤 객체를 사용하는 다른 객체간의 결함도가 높아져서 객체 지향 설계 원칙에 어긋나게 된다. (개방-폐쇄)

 3. 또한 해당 싱글톤 객체를 수정할 경우 싱글톤 객체를 사용하는 곳에서 사이드 이팩트 발생 확률이 생기게 되며, 멀티 쓰래드환경에서 동기화 처리 문제등이 생기게 된다.

 

Reference 

https://elfinlas.github.io/2019/09/23/java-singleton/

728x90

'Theory > Design Pattern' 카테고리의 다른 글

Factory Method Pattern  (0) 2022.04.10
Builder Pattern  (0) 2022.03.29
ABSTRACT FACTORY PATTERN  (0) 2022.03.27
ADAPTER PATTERN  (0) 2021.07.22
Introduction  (0) 2019.06.08

댓글