싱글톤 패턴
객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미
ublic 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");
}
}
싱글톤 패턴의 사용 이유 #
메모리 측면에서의 이점 #
최초 한번의 new 연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체 인스턴스에 접근할 때 메모리 낭비를 방지할 수 있다.
데이터 공유 #
클래스의 데이터간에 공유가 쉽다는 것이 또 하나의 이유다.
싱글턴 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다.
하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴스에 데이터를 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 이점을 유의해서 설계해야한다.
이 외에도 도메인 관점에서 인스턴스가 한 개만 존재하는 것을 보증하고 싶은 경우 싱글톤 패턴을 사용해도 된다.
싱글턴 의문제점 #
구현하는 코드의 양 #
싱글톤 패턴을 구현하는 코드 자체가 많이 필요하다. 앞서 소개한 구현 방법 외에도 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우에 멀티 스레딩 환경에서 발생할 수 있는 동시성 문제를 해결하기 위해 syncronized 키워드를 사용해야한다.
두 번째는 테스트가 어렵다.
싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다. 그렇지 않으면 어플리케잇녀 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못한다.
세 번째로 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다. new 키워드를 직접 사용하여 클래스에서 객체를 생서하고 있으므로, 이건 SOLID중 DIP를 위반하게 되고 OCP 원칙 또한 위반할 가능성이 높다.