public class Singleton{
private static Singleton instance = new Singleton();
// 생성자는 외부에서 호출할 수 없게 private로 지정해야 한다.
private Singleton(){
// 구현부
}
public static Singleton getInstance(){
return instance;
}
public void sayHi(){
System.out.println("Bello");
}
}
단 하나의 인스턴스를 생성하여 사용하는 디자인 패턴을 말하고 위의 코드는 객체를 미리 생성해두고 가져오는 방법이다.
최초 한 번의 new 연산자를 통해 고정된 메모리 영역을 사용하기 때문에 나중에 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다.
이미 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다.
싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴슬들이 접근하여 사용할 수 있다.
여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하면 동시성 문제가 발생할 수 있기 때문에 이 점을 유의해서 설계해야 한다.
도메인 관점에서 인스턴스가 1개만 존재하는 것을 보증하고 싶을 때 사용한다.
싱글톤 패턴을 구현하는 코드 자체가 많이 필요하다.
정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우 멀티스레드 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 한다.
싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수해오디려면 매번 인스턴스의 상태를 초기화시켜주어야 한다.
싱글톤 패턴은 해당 인스턴스가 절대적으로 1개만 존재한다는 것을 보증 또는 동일한 인스턴스를 자주 생성해야 하는 경우 메모리 낭비 방지를 위해 사용한다.
객체 지향 설계의 원칙에 적합하지 않고 LifeCycle 제어가 힘들며 멀티스레드 환경에서 여러 개의 객체가 생성되는 문제가 발생할 수 있다.
멀티스레드 환경이라면 static
앞에 synchronized
키워드를 붙여 동기화 작업을 추가해야 하는데 이는 성능을 저하시킨다.