-
[생성 패턴] SingletonCS/디자인패턴 2021. 5. 25. 19:24
1. Singleton 이란?
시스템에 존재하는 딱 하나의 인스턴스
싱글톤을 사용하는 주목적은 단 한개의 인스턴스를 보증 하거나 자원 공유의 편의를 제공하기 위함이다.
2. Structure
싱글톤의 구조는 매우 간단하다.
Singleton Sturcture 클래스 내부에 private 한 static 변수를 사용하여 자기 자신을 저장하도록 구현. 다른 클래스에서 이 클래스의 인스턴스를 얻고자 할 때는 getInstance() 메서드를 통해서만 얻을 수 있도록 함.
3. Example
이 구조를 토대로 만들 수 있는 하나의 코드 예시를 살펴보면 다음과 같다.
public class SingletonExample { private static SingletonExample instance = new SingletonExample(); private SingletonExample() { // private 생성자 } public static SingletonExample getInstance() { return instance; } }
이 코드의 문제는 JVM에 해당 클래스가 등록됨과 동시에 인스턴스가 생성된다는 것이다. 언제 사용될지도 모르는 인스턴스가 메모리에 상주하고 있다는 점은 메모리 사용 측면에서 좋은 구조라 할 수 없을 것이다.
그래서 또다른 형태의 싱글톤을 다음과 같이 구현할 수 있다.
public class SingletonExample { pricate static SingletonExample instance = null; private SingletonExample() { // private 생성자 } public static SingletonExample getInstance() { if (instance == null) { instance = new SingletonExample(); } return instance; } }
이 코드의 문제는 무엇일까. 일반적인 환경이라면 몰라도, 멀티 쓰레드 환경이라면 단일 인스턴스를 보장하지 못하는 문제가 있다.
예를 들어 Thread A가 getInstance()를 처음 호출하여 if구문에 접어들었다고 하자. 이 순간에 Context Switch가 일어나 Thread B가 getInstance()를 호출하면, 아직 Thread A가 인스턴스를 만들지 않았기 때문에 B는 새로운 인스턴스를 만들게 된다. 이 상태에서 A 차례가 되면, A는 멈췄던 구문에서 재실행되므로 새 인스턴스를 만드는 구문을 실행시킬 것이다. 결국 싱글톤 패턴을 사용했지만, 두 개의 인스턴스가 만들어지는 결과를 갖게 되는 것이다.
이 문제를 해결하기 위해서 JAVA에서는 synchronized 키워드를 사용할 수 있다.( 주의 _ synchronized를 사용하더라도 다른 여러 상황으로 싱글톤 패턴이 파훼될 수 있음)
4. Pros & Cons
싱글톤 패턴의 장점은 위에서 몇 번 언급했으므로, 단점에 대해서만 살펴보면 다음과 같다.
- SRP(단일 책임 원칙)을 위배할 수 있다.
- 테스팅 과정을 어렵게(복잡하게) 만든다.
싱글톤 인스턴스에 어떤 역할을 부여하고 어떤 기능을 하게 할 것인가에 따라서 SRP, OCP와 같든 SOLID 원칙을 위배할 가능성이 큽니다.
다양한 테스팅 프레임워크들이 모의 객체를 만드는 과정에서 상속을 사용하곤 하는데, 이때 싱글톤 패턴을 위한 정적(static) 메소드에 대한 오버라이딩이 필요하다. 문제는 대부분의 언어가 정적 메서드에 대한 오버라이딩이 불가능하다는 것이고, 이는 테스팅 과정을 복잡하게 만들 수 있다.
Reference
- Rohit Joshi. 2015. "Java Design Pattern". Java Code Geeks
- https://refactoring.guru/design-patterns/singleton. accessed 2021.05.25
'CS > 디자인패턴' 카테고리의 다른 글
[구조 패턴] Bridge (0) 2021.06.03 [구조 패턴] Adapter (0) 2021.05.26 [생성 패턴] Builder (0) 2021.05.21 [생성 패턴] Prototype (0) 2021.05.20 [생성 패턴] Abstract Factory Method (0) 2021.05.19