싱글톤 패턴이란?
어플리케이션이 시작될 때, 어떠한 클래스가 한번만 생성되어 최초의 한번만 메모리가 할당되게 하는 것이다.
하나의 객체를 여러 클래스에서 공유해야 할 때 사용된다.
예제 )
다크모드와 라이트모드를 지원하는 어플리케이션이 있다. 애플리케이션은 각각의 화면에 따라 클래스를 다르게 구성한다.
이 과정에서 애플리케이션이 현재 다크모드인지 라이트모드인지 상태가 공유되지 않을 수 있다. 이런 경우를 대비하기 위해 싱클톤 패턴을 사용한다.
< 어플리케이션 화면 코드 >
public class FirstPage {
// 라이트모드, 다크모드 여부
// new Setting() 가 아니라 getSettings()로 불러옴.
private Settings settings = Settings.getSettings();
public void setAndPrintSettings () {
settings.setDarkMode(true);
settings.setFontSize(15);
}
}
< 다크모드, 라이트모드 상태 class >
public class Settings {
private Setting() {};
// 자기자신으로 static으로 선언
private static Settings settings = null;
public static Settings getSettings () {
if(settings == null) {
settings = new Settings();
}
return settings;
}
private boolean darkMode = false;
private int fontSize = 13;
public boolean getDarkMode () { return darkMode; }
public int getFontSize () { return fontSize; }
public void setDarkMode (boolean _darkMode) {
darkMode = _darkMode;
}
public void setFontSize (boolean _fontSize) {
fontSize = _fontSize;
}
}
싱글톤 패턴은 데이터베이스 연결모듈에도 많이 쓰인다.
<자바스크립트>
const URL = 'mongodb://localhost:11808/youndol'
const createConnection = url => ({"url" : url})
class DB {
constructor(url) {
if(!DB.instance) {
DB.instance = createConnection(url)
}
return DB.instance
}
connect () {
return this.instance
}
}
const a = new DB(URL);
const b = new DB(URL);
<자바>
class Singleton {
private static class singleInstanceHolder {
private static final Singleton INSTANCE = new Singletion();
}
public static synchronized Singleton getInstance() {
return singleInstanceHolder.INSTANCE;
}
}
public class HelloWorld {
public static void main(String[] args) {
Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
싱글톤 패턴의 단점
싱글톤 패턴은 TDD(Test Driven Development) 시행 시 걸림돌이 될 수 있다.
단위테스트는 테스트가 독립적이어야지 어떤 순서로든 실행될 수 있다. 하지만 싱글톤 패턴은 각 테스트마다 '독립적인' 인스턴스를 만들기가 어렵습니다.
출처: 면접을 위한 cs 전공지식 노트