싱글톤 패턴은 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당(static)하고,
이후로는 해당 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.
즉 하나의 인스턴스만 생성하여 인스턴스가 필요할 때,
똑같은 인스턴스를 만드는 것이 아닌 기존의 인스턴스를 활용하는 방법이다.
인스턴스를 여러 개 생성하였을 때 자원을 낭비하게 되거나, 버그를 발생시키는 상황을 미연에 방지하고자 등장한 디자인 패턴이다.
그 해결책으로 오직 하나의 인스턴스만을 생성하고 사용하도록 하는 것이 싱글톤 패턴의 목적이다.
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// 생성자는 외부에서 호출하지 못하도록 private 으로 지정해야 한다.
}
public static Singleton getInstance() {
return instance;
}
public void say() {
System.out.println("hi, there");
}
}
var singleton = (function() {
var instance;
var a = 'hello';
function initiate() {
return {
a: a,
b: function() {
alert(a);
}
};
}
return {
getInstance: function() {
if (!instance) {
instance = initiate();
}
return instance;
}
}
})();
var first = singleton.getInstance();
var second = singleton.getInstance();
console.log(first === second); // true;
OOP의 경우 객체 생성 시마다 메모리 영역을 할당받아야 한다.
최초 한 번의 new
연산자를 통해 객체를 생성할 경우 고정된 메모리 영역를 사용하기에,
추후 해당 객체로의 접근 시 메모리 낭비를 방지할 수 있다.
싱글톤 인스턴스는 전역으로 사용되는 인스턴스이므로 다른 클래스의 인스턴스가 접근해 사용할 수 있다.
이 때 동시에 싱글톤 인스턴스에 접근하여 동시성 문제가 발생할 수 있으므로 유의해야 한다.
인스턴스의 동시성 문제 - 동시성 이슈
싱글톤 패턴 구현을 위해 작성해야 할 코드 자체가 많이 필요하다.
정적 팩토리 메서드에서 객체 생성 확인 및 생성자 호출의 경우 멀티 스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 synchronized
키워드를 사용해야 한다.
싱글톤 인스턴스들은 자원을 공유하고 있다.
테스트가 격리된 환경에서 수행되기 위해 매번 인스턴스의 상태를 초기화시켜주어야 한다.
new
키워드를 직접 사용해 클래스 내에서 객체를 생성하는 싱글톤 패턴은 SOLID원칙 중 DIP를 위반하며 OCP 원칙을 위반할 가능성이 높다.
객체지향 개발의 5대 원리 : SOLID 원칙