본문 바로가기

소프트웨어/Java + Spring

자바 디자인패턴 싱글톤 (singleton)

 

오늘은 프로그래머라면 무조건 알아야 할 디자인패턴에 대해서 작성하려고 합니다.

그중에서도 가장 많이 사용되는 싱글톤 패턴입니다.

우선 디자인패턴의 기본은 바로 객체지향프로그램에서 사용됩니다. 실제로는 최근 모든 언어들이 객체지향프로그램 언어입니다. 상속, 다형성, 인터페이스, 클래스 라는 단어를 들어보았다면 우리는 객체지향프로그램을 공부한 적이 있는겁니다.

 

처음에는 저도 디자인패턴을 공부하지 않고 코딩을 먼저 시작하여, 많은 어려움이 있었는데 그런 시행착오를 줄여줄수 있는 것이 바로 디자인패턴 공부인것 같습니다.

 

소프트웨어 엔지니어라면 무조건 알아야 할 부분이라고 감히 말씀드리고 싶습니다.

싱글톤은 객체를 전체 프로그램 통틀어 딱 하나만 생성하는 것이라고 말씀드리고 싶습니다.

싱글톤이 필요한 경우는 너무 많습니다. 간단한 예로 APP의 옵션 설정의 경우 많은 곳에서 조절이 가능합니다.(다양한 메뉴 설정버튼이 존재함으로..) APP의 전역 글자크기라던지, 혹은 다크모드 설정등은 APP에서는 딱 하나의 변수만을 가지고 조절이 되야지, 변경할때 마다 객체를 생성하면 부르는 위치에 따라 다른 설정들이 적용이 될 것입니다. 이럴때 사용되는 것이 바로 싱글톤입니다.

 

이미 생성이 되었다면 해당 객체의 이용하고, 아직 만들어 진적이 없다면, 새로운 객체를 만든다. 하지만 이후에는 한번 만들어 졌으므로 두번다시 새롭게 생성을 안합니다.

 

주석을 달아두었으니 코드를 실행시켜보면 됩니다.

 

Setting.java 

 

package singleton.after;
import java.io.Serializable;
public class Setting implements Serializable{

    private Setting(){};  // 생성자를 private으로 설정한다.   
    private static Setting _instance = null; // 자신을 객체로 private을 선언해보자

    public static Setting getSetting() {
      if (_instance == null){
        _instance = new Setting();
      }
  return _instance;
} // 외부에서 불러올 수 있는 함수를 생성하자

  // 여기부터는 공통적으로 사용하는 변수를 적어보자
  private boolean darkMode = false;
  private int fontSize = 13;

  public boolean getDarkMode() {
    return this.darkMode;
  }

  public void setDarkMode(boolean darkMode) {
    this.darkMode = darkMode;
  }

  public int getFontSize() {
    return this.fontSize;
  }

  public void setFontSize(int fontSize) {
    this.fontSize = fontSize;
  }
}


FirstPage.java

package singleton.after;
public class FirstPage {
   private Setting _instance = Setting.getSetting();
   public void setFirstSet(){
        _instance.setDarkMode(true);
        _instance.setFontSize(15);
        System.out.println("FirstPage 모드 :" + _instance.getDarkMode() + " " + "글자크기" + _instance.getFontSize());
   }
}


SecondPage.java

package singleton.after;
public class SecondPage {
   private Setting _instance = Setting.getSetting();
   public void setSecondSet(){
        System.out.println("SecondPage 모드 :" + _instance.getDarkMode() + " " + "글자크기" + _instance.getFontSize());
   }
}


MyProgram.java

package singleton.after;
public class MyProgram {
    public static void main(String[] args) throws Exception {
       Setting _instance =  Setting.getSetting();
       System.out.println("initial 모드 :" + _instance.getDarkMode() + " " + "글자크기" + _instance.getFontSize());
       new FirstPage().setFirstSet();
       new SecondPage().setSecondSet();
    }
}


최종결과화면

initial 모드 :false 글자크기13
FirstPage 모드 :true 글자크기15
SecondPage 모드 :true 글자크기15

 

결과에서 알수 있듯이, FirstPage에서 생성한 객체의 SecondPage 에서 동일하게 적용하여 사용하고 있습니다.

 

감사합니다.