개발 기록지
싱글톤 패턴 본문
자바 싱글톤패턴이란?
어떤 클래스의 인스턴스를 오직 하나만 생성하여 글로벌하게 접근하는 방법
예를 들어 게임 환경설정 메뉴
public class Settings {
private static Settings instance = new Settings();
private Settings(){ }
public static Settings getInstance(){
return instance;
}
}
public class Main {
public static void main(String[] args) {
Settings settings1 = Settings.getInstance();
Settings settings2 = Settings.getInstance();
System.out.println(settings1 == settings2);
}
}
싱글톤 구현 방법
- new를 사용해 인스턴스를 초기화하는 것을 방지하기위해 private 생성자를 사용
- static 메소드와 변수를 사용하여 외부에서 접근을 허용해야한다. (기본생성자를 통해 접근이 불가하기때문에)
다양한 싱글톤 패턴구현 방법
1. Thread safe + Eager init
public class Settings {
private static Settings instance = new Settings();
private Settings(){ }
public static Settings getInstance(){
return instance;
}
}
위 방법은 클래스가 로딩되는 시점에 바로 초기화 되기 때문에 Thread safe한 방법이다. 즉 미리 만들어 놓은 인스턴스를 반환하는 방법이다. 다만 단점은 미리 만든다라는 점이다. 만들어 놓기만하고 쓰지 않는다고하면 자원을 낭비하는 꼴이기 때문이다.
2. Thread safe + Lazy init
public class Settings {
private static Settings instance;
private Settings(){ }
public static synchronized Settings getInstance(){
if(instance == null){
instance = new Settings();
}
return instance;
}
}
위 방법은 인스턴스를 쓸 시점에 초기화하는 방법이다. Thread safe를 위해 synchronized 키워드를 사용하여 메소드를 구현한다는 점에서 성능저하를 일으킬 수 있다.
싱글톤 패턴의 문제점
- private 생성자를 갖고 있어 상속할 수 없다.
- 싱글톤은 테스트하기가 어렵다.
- 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.
- 싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.
Comments