반응형
싱글톤 패턴이란? singleton pattern
- 여러 디자인 패턴 종류 중 하나로, 하나의 클래스에 오직 하나의 객체 인스턴스만 가지는 패턴이다.
* 디자인 패턴: 프로그램을 설계할때 발생했던 문제점들을 객체 간 상호관계 등을 통해 해결할 수 있도록 하나의 '규약'형태로 만들어 놓은 것. - 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 어디에서든 공유하며 접근, 사용할수 있다.
- 싱글톤 패턴으로 만들어진 클래스는 생성자가 여러번 호출 되더라도, 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 보낸다.
- 주로 공통된 객체를 여러 개 생성해서 사용하는 DBCP (Database Connection Pool)와 같은 데이터베이스 연결 모듈에 많이 사용된다.
싱글톤 패턴의 장점
- 인스턴스가 단 하나이기 때문에 인스턴스를 생성할때 드는 비용이 줄어든다.
- static을 사용하여 별도의 메모리 영역을 얻으면서 한번의 new 연산자로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할수 있다.
- 싱글톤패턴으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유할 수 있다.
- 예를들어 configration의 설정값인 경우, 객체가 여러개 생성되면 설정값이 변경되어 상이해질 위험이 있는데, 인스턴스가 1개만 생성되는 싱글톤 패턴을 사용하면 하나의 인스턴스를 메모리에 등록해서 여러 스레드가 동시에 해당 인스턴스를 공유하도록 할 수 있다.
예제소스)
Settings class (Singleton)
public class Settings{
private Settings(){};
//생성자를 private으로 생성 -> 다른 클래스에서 인스턴스 생성 불가. 즉,new 연산자로 생성할 수 없음.
//대신 클래스의 method와 field를 static으로 선언하여 외부에서 접근할 수 있도록 한다.
private static Settings settings = null;
//static 선언으로 별도의 지정된 메모리 공간에만 존재.
public static Settings getSettings(){
if(settings == null){
// 초기값이 null이므로 최초로 호출된 경우
settings = new Settings(); // 객체 선언 1번!
}
//초기값인 null이 아니라면 이미 어디선가 호출된 경우
return settings; //그대로 반환
}
private int fontSize = 10;
private String backgroundColor = "black";
public void setFontSize(int fontSize){ //set method
this.fontSize = fontSize;
}
public int getFontSize(){ //get method
return fontSize;
}
public void setFontSize(String backgroundColor){
this.backgroundColor = backgroundColor;
}
public int getBackgroundColor(){
return backgroundColor;
}
}
other class
public class Test1{
private Settings settings = Settings.getSettings();
//static 메소드이므로 new 연산자 없이 바로 호출가능. new Settings()가 아닌 Settings.getSettings();
public void setSettings(){
settings.setFontSize(20);
settings.setBackgroundColor("red");
}
System.out.println(settings.getFontSize());
System.out.println(settings.getBackgroundColor());
}
//결과
20
red
public class Test2{
private Settings settings = Settings.getSettings();
System.out.println(settings.getFontSize());
System.out.println(settings.getBackgroundColor());
}
//결과
20
red
예제소스처럼 Test1 클래스에서 세팅한 정보가 Test2에서도 세팅을 해주지 않았음에도 적용된것을 확인할 수 있다.
이미 Test1에서 호출하면서 new연산자로 객체생성을 했기 때문에 (null 이 아니기 때문에 ) 바로 해당값을 반환해준 것.
싱글톤 패턴의 단점
- 싱글톤 인스턴스를 여러곳에서 많이 공유할 경우 다른 클래스의 인스턴스 간 의존성이 높아질 수 있다.
(객체간의 독립성을 지향하는 객체지향 원칙에 어긋남) - 의존성이 높아지면 수정작업이나 테스트를 진행하기 어려워진다.
- 멀티스레드 환경에서 객체가 1개이상 생성되어 오류 발생의 여지가 있음. (이를 해결할 수 있는 언어별로 다양한 솔루션이 있다)
싱글톤 패턴의 기본 구조
반응형
'Back-end > CS knowledge' 카테고리의 다른 글
객체지향 프로그래밍 OOP (0) | 2022.08.02 |
---|---|
자바가상머신 JVM 이란? (0) | 2022.07.25 |
컴파일러compiler와 인터프리터interpreter의 차이? + 자바컴파일러와 자바인터프리터의 역할 (0) | 2022.07.25 |