디자인 패턴

생성 패턴 - 1. 싱글톤(Singleton)

츄빙 2024. 4. 29. 20:02

📌 싱글톤 패턴이란?

-객체의 인스턴스가 1개만 생성되는 패턴

 

클래스 다이어그램(출처: https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4)

 

//Singleton.java

package creational.singleton;

public class Singleton {
	private static Singleton instance = null;

	private Singleton() {	
	}
	
	public static Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		
		return instance;
	}
}

 

//Client.java

package creational.singleton;

public class Client {

	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		
		System.out.println(s1==s2);
	}

}
  • 싱글톤 생성자는 외부에서 호출하지 못하도록 private 접근 제어자가 필요하다.
  • 싱글톤 인스턴스를 static으로 선언하여 다른 클래스의 인스턴스들이 접근하여 사용 가능
  • 외부에서는 getInstance()를 통해서만 싱글톤 인스턴스에 접근할 수 있다.

 

언제 사용해야하는가?

  • 프로그램 내에서 여러 클래스가 공유하는 단 하나의 인스턴스가 필요할 때
  • ex) 데이터베이스 연결을 담당하는 클래스에서 싱글톤을 사용하여 모든 곳에서 동일한 연결 공유

 

싱글톤 패턴의 문제점

  • 동시성 문제 - 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 멀티스레딩 환경에서 동시성 문제가 발생할 수 있다. 이를 위해 syncronized 
  • 높은 의존성 - 클래스의 객체를 미리 생성한 뒤에 필요한 경우 정적 메서드를 사용하므로 클래스 사이에 의존성이 높아진다.
  • 단위 테스트에서의 어려움 - 인스턴스 자원을 공유하고 있어, 테스트 시 매번 인스턴스의 상태를 초기화시켜야한다.
//수정된 Singleton.java

package creational.singleton;

public class Singleton {
	private static Singleton instance = null;

	private Singleton() {	
	}
	
	// synchronzied로 동시성 문제 해결
	public static synchronized Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		
		return instance;
	}
}