-
[JAVA]객체 지향 디자인 패턴 - Singleton Pattern프로그래밍/Java 2022. 3. 22. 14:20반응형
Singleton Pattern
- 생성패턴의 일종으로 기초가 되는 가장 쉬운 디자인 패턴 하지만, 많이 중요한 디자인 패턴
- 프로그램에서 존재해야 하지만 객체 하나만 할당 받아 사용해야하는경우
- 생성된 객체가 어디에서든지 참조가 가능해야함
Singleton Structure
- 싱글턴 구조는 하나의 객체가 있어야 하며, 한번만 생성되는 영역이 있어야함
- 그리고 다른 곳에서(FirstPage, SecondPage)에서 그 영역에 공통적으로 접근이 가능해야하며 동일 값을 가져 올 수 있도록 해야함
Singleton Example 1 (출처. 얄팍코딩)
- settings라는 객체가 있다고 가정
- settings에 화면 darkmode, lightmode가 있다고 하고 이것을 darkmode로 설정하면 모든 페이지에서 darkmode로 전환되어야 한다고 한다면, 아래와 같은 코드를 작성할 수 있다.
public class Settings { //settings는 모든 프로그램에서 공통으로 사용하는 객체 이미로 하나만 존재해야 해서 private으로 작성한다. private Settings () {} //초기값은 null로 지정하고 static으로 작성하여 하나만 작성되도록 구현한다. private static Settings settings = null; //instance가 있는지 없는지 파악하여 없으면 생성, 잇으면 그대로 반환한다, public static Settings getSettings() { if(settings == null) { settings = new Settings(); } return settings; } //settings는 하나여야만 하지만 내부 동작은 여러개여도 상관 없기 때문에 //나머지 변수나 객체들은 getter, setter로 구현하여 사용한다. private boolean darkMode = false; private int fontSize = 13; public boolean getDarkMode () {return darkMode;} public int getFontSize () {return fontSize;} public void setDarkMode (boolean darkMode) {this.darkMode = darkMode;} public void setFontSize (int fontSize) {this.fontSize = fontSize;} }
- 이렇게 작성하게 되면 Static영역에 settings라는 객체가 하나만 존재하게 되며, 그안에 settings에 설정한 내용은 유동적으로 변경이 가능하게 된다.
public class Firstpage { private Settings settings = Settings.getSettings(); public void setAndPrintSettings() { settings.setDarkMode(true); settings.setFontSize(15); System.out.println(settings.getDarkMode()+ " " + settings.getFontSize()); } //출력 //True 15 }
public class SecondPage { private Settings settings = Settings.getSettings(); public void printSettings() { System.out.println(settings.getDarkMode()+ " " + settings.getFontSize()); } //출력 //True 15 }
- 위와 같이 첫번째 두번째 페이지에서 똑같은 출력값을 얻을 수 있다.
Singleton Example 2
- 다른 예제를 살펴 보면 더 이해가 될 것 같다. windows에 Printer를 생각해 보자 Printer는 여러개 존재 할 수 있지만, Printer를 출력 할 때는 하나의 Printer를 설정한 후 출력을 해야한다. Printer라는 것이 여러개 설정이 된다면, 어쩔때는 사장님 사무실에서 어쩔 때는 다른 위치의 사무실에서 동시에 출력이 되거나, 다른 위치에서 출력이 되는 경우가 발생 할 것이다. 그래서 하나의 객체에서 위치와 내용을 설정하는 코드가 필요 할 것인데 이부분을 코드로 살펴보면
public class Printer { //하드웨어 시스템상 프린터는 하나만 존재해야한다. private Printer() {} private static Printer printer = null; public static Printer getPrinter() { if(printer == null) { printer = new Printer(); } return printer; } //프린트 주소와 이름 등은 그리고 안에 출력할 출력 내용은 그때 그때 할당하여 사용하기 때문에 동적으로 생성해야한다. private String printAddr; //프린트 출력 주소(ex: ip) private String printName; //프린트 이름 private int printNum; //프린트 장수 private String printFontSize; //프린트 폰트 사이즈 public String getPrintAddr() {return printAddr;} public String getPrintName() {return printName;} public int getPrintNum() {return printNum;} public String getPrintFontSize() {return printFontSize;} public void setPrintAddr(String printAddr) {this.printAddr = printAddr;} public void setPrintName(String printName) {this.printName = printName;} public void setPrintNum(int printNum) {this.printNum = printNum;} public void setPrintFontSize(String printFontSize) {this.printFontSize = printFontSize;} }
위와 같이 정의 할 수 있을 것같다. 프린터라는 객체는 하나만 존재 해야 혼동이 오지 않을 것이고, 나머지 하위 부분의 정보는 동적으로 할당해도 될것이다. 왜냐하면 프린터 주소와 이름 그리고 내용물 등은 달라 질 수 있기 때문이다.
싱글턴은 settings, Interfacing, Lazy loading등과 같은 곳에서 많이 사용된다. api서버 구동하는 곳에서도 사용되는 디자인 패턴이라 잘 알고 넘어가면 좋을 것같다.
싱글턴 패턴은
- 한곳에서만 생성되는 객체일 때
- 생성된 객체가 모든 다른 영역에서 같은 값으로 사용해야할 때
사용한다는 것을 기억해 두면 좋을 것같다.
반응형'프로그래밍 > Java' 카테고리의 다른 글
[JAVA]객체 지향 디자인 패턴 - State Pattern(상태 패턴) (0) 2022.03.22 [JAVA]객체 지향 디자인 패턴 - Strategy Pattern(전략 패턴) (0) 2022.03.22 [Java Interface] 인터페이스를 사용하는 이유 (0) 2022.03.20 [JAVA abstract]추상화 클래스 , 메서드 알아보기 (0) 2022.03.20 [Java Overriding] 오버라이딩과 다형성 (0) 2022.03.20