디자인 패턴

싱글톤 패턴(Singleton Pattern)

윤돌_99 2022. 2. 27. 15:58

싱글톤 패턴이란?

 

어플리케이션이 시작될 때, 어떠한 클래스가 한번만 생성되어 최초의 한번만 메모리가 할당되게 하는 것이다.

하나의 객체를 여러 클래스에서 공유해야 할 때 사용된다.

 

예제 )

다크모드와 라이트모드를 지원하는 어플리케이션이 있다. 애플리케이션은 각각의 화면에 따라 클래스를 다르게 구성한다.

이 과정에서 애플리케이션이 현재 다크모드인지 라이트모드인지 상태가 공유되지 않을 수 있다. 이런 경우를 대비하기 위해 싱클톤 패턴을 사용한다.

 

< 어플리케이션 화면 코드 >

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 전공지식 노트