Singleton이란?
Singletone 패턴은 애플리케이션이 시작 될 때 어떤 클래스가 최초 한번만 메모리를 할당하고 (Static으로) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.
또한 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후 호출된 생성자는 최초에 생성한 객체를 반환한다.
단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.
(자바에서는 생성자를 Private로 선언하여 생성불가로 막아놓고 getInstance()로 받아서 사용함)
1
2
3
4
5
6
7
8
9
|
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("Singleton Instance Created..");
}
public static Singleton getInstance() {
return singleton;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
Singleton을 사용하는 이유
고정된 메모리 영역을 얻으면서 한번의 new를 사용하여 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있고 다른 클랫스의 인스턴스들이 데이터를 공유하기 쉽다는 장점이 존재한다.
Singletone의 문제점
Singleton 채턴을 사용하게 되면 인스턴스 자체가 하는 역활이 너무 많아질 뿐만아니라 데이터를 공유 시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아지는 단점을 가지고 있다.
이와같은 단점으로 수정이 어려워 지고 테스트가 힘들어 지는 결과가 발생한다. 또한 멀티쓰레드 환경에서 동기화 처리를 하지 않는다면 인스턴스가 두개 생성이 되는 상황일 발생할 수 있다.
해결책
1. 정적 변수에 인스턴스를 만들어 바로 초기화하는 방법 (Eager Initialization)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Printer {
// static 변수에 외부에 제공할 자기 자신의 인스턴스를 만들어 초기화
private static Printer printer = new Printer();
private Printer() { }
// 자기 자신의 인스턴스를 외부에 제공
public static Printer getPrinter(){
return printer;
}
public void print(String str) {
System.out.println(str);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
2. 인스턴스를 만드는 메서드에 동기화는 하는 방법(Thread-Safe Initialization)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class Printer {
// 외부에 제공할 자기 자신의 인스턴스
private static Printer printer = null;
private int counter = 0;
private Printer() { }
// 인스턴스를 만드는 메서드 동기화 (임계 구역)
public synchronized static Printer getPrinter(){
if (printer == null) {
printer = new Printer(); // Printer 인스턴스 생성
}
return printer;
}
public void print(String str) {
// 오직 하나의 스레드만 접근을 허용함 (임계 구역)
// 성능을 위해 필요한 부분만을 임계 구역으로 설정한다.
synchronized(this) {
counter++;
System.out.println(str + counter);
}
}
}
|
[Design Pattern] 싱글턴 패턴이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
'SpringBoot' 카테고리의 다른 글
Java Design 패턴 - Strategy 패턴 (0) | 2019.08.16 |
---|---|
JSON & XML (0) | 2019.08.12 |
디자인 패턴 (0) | 2019.08.08 |
AWS RDS 인스턴스 생성 및 설정 (0) | 2019.07.30 |
AWS Lambda & 간단한 Hello from Lambda예제 시작 (0) | 2019.07.26 |