[2023 동계 모각코] 6회차 회고 & [JAVA] Singleton

춤추는 머쉬룸·2024년 2월 18일
0

2023-24 동계 모각코

목록 보기
12/12
post-thumbnail

목표

  • Singleton 이해하기
  • Java 로 Singleton 구현

Singleton

프로그램에서 내에서 특정 객체가 무조건 하나만 생성되고, 그렇게 만들어진 객체를 어디에서나 쓸 수 있음을 보장하는 디자인 패턴

Eager 방식

객체 생성을 미리 해놓는다

방법 및 과정 (기본)

  • static 을 사용해 class 가 로딩될 때 객체를 생성한다.
  • 기본 생성자로 접근하지 못하도록 private 로 막는다.
class Singleton {
	
	private static Singleton singleton = new Singleton(); 
	
	private Singleton() {} //생성자에 접근 x
	
	public static Singleton getInstance() {
		return singleton;
	}
}

Lazy 방식

객체 생성이 필요할 때에 된다

방법 및 과정1 (기본)

  • 객체가 존재하지 않으면 생성해주고 존재하면 기존 객체를 반환한다.
  • 기본 생성자로 접근하지 못하도록 private 로 막는다.
  • 다만 이 방법은 멀티 스레드 환경에서 동기화 문제가 발생한다.
class Singleton {
	private static Singleton singleton; 
	
	private Singleton() {}
	
	public static Singleton getInstance() {
		if (singleton == null) singleton = new Singleton();
		return singleton;
	}
}

방법 및 과정2 (Bill Pugh)

  • Bill Pugh 라는 사람이 고안했다.
  • Inner Helper class 를 사용한다.
  • 다만, reflection 으로 패턴이 깨질 수 있다.

  • Inner Class로 선언되어 Class Loader에 의해 로딩될 때 로딩되지 않다가 getInstance()가 호출될 때 JVM 메모리에 로드되고 객체를 생성한다.
class Singleton {

	private Singleton() {}

	private static class SingletonHelper {
		private static final Singleton SINGLETON = new Singleton();
	}
	
	public static Singleton getInstance(){
	    return SingletonHelper.SINGLETON;
	}
}

이 외에도 다양한 방법이 있다. 다만 가장 많이 쓰이는 방법은 Bill Pugh 방식이다.

0개의 댓글