반응형
인스턴스가 하나만 존재하는 것을 보증하는 패턴을 Singleton 패턴이라고 부른다.
- 요소가 하나뿐인 집합
시스템 안에 1개만 존재한다는 것을 프로그램으로 표현하고 싶을 때
- 컴퓨터 시스템 전체를 표현한 클래스
- 현재 시스템 설정을 표현할 클래스 혹은 각종 상수 등
프로그래머가 주의를 기울여서 new MyClass()를 한 번만 실행해 인스턴스를 하나만 생성하는 방법이 있지만
-지정한 클래스의 인스턴스가 반드시 1개만 존재한다는 것을 보증하고 싶을 때
-인스턴스가 하나만 존재한다는 것을 프로그램 상에서 표현하고 싶을 때
이름 | 설명 |
Singleton | 인스턴스가 하나만 존재하는 클래스 |
Main | 동작 테스트용 클래스 |
클래스 다이어그램
Singleton 클래스
- 인스턴스를 하나만 만들 수 있다.
- static 필드(클래스 변수)로 정의되고 Singleton 클래스의 인스턴스에서 초기화한다.
- 초기화는 Singleton 클래스를 로드할 때 한 번만 실행된다.
- Singleton 클래스의 생성자는 private되어 있다.
- Singleton 클래스 외부에서 생성자 호출을 금지하기 위해서이다.
new Singleton()
- 위에 코드가 이 클래스 외부에 있어도 컴파일할 때 에러가 발생한다.
- Singleton 패턴은 프로그래머가 어떤 실수를 하더라도 인스턴스가 하나만 생성되는 것을 보증하는 패턴이다.
- 보증을 위해서 생성자를 private로 해 두는 것이다.
- Singleton 클래스의 유일한 인스턴스를 얻는 메서드로 getInstance가 제공된다.
- Got Factory Method 패턴과는 다른 인스턴스 생성을 위한 클래스 메서드인 static Factory Method
- 유일한 인스턴스를 얻기 위한 메서드이다.
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){
System.out.println("인스턴스를 생성했습니다.");
}
public static Singleton getInstance(){
return singleton;
}
}
Main 클래스 - Singleton 클래스를 이용하는 클래스
Singleton 클래스의 getInstance 메서드를 사용해 Singleton 인스턴스를 얻는다.
public class SingleMain {
public static void main(String[] args) {
System.out.println("Start");
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if (obj1 == obj2){
System.out.println("obj1과 obj2는 같은 인스턴스 입니다.");
} else {
System.out.println("obj1과 obj2는 다른 인스턴스 입니다.");
}
System.out.println("End.");
}
}
/* 출력
Start
인스턴스를 생성했습니다.
obj1과 obj2는 같은 인스턴스 입니다.
End.
*/
- 조건문 obj1 == obj2를 통해서 같은 인스턴스가 얻어지는지 확인했다.
왜 제한이 필요가 있을까?
Singleton 패턴에서는 인스턴스 수를 제한하고 있다.
- 제한을 둔다는 것은 전체 조건을 늘린다는 뜻이다.
- 인스턴스가 여러 개 존재하면 인스턴스가 서로 영향을 미쳐 뜻밖의 버그를 만들 수 있다.
- 인스턴스가 하나뿐이라는 보장이 있다면 그 전체 조건 하에서 프로그래밍을 할 수 있다.
유일한 인스턴스는 언제 생성되는가?
- 프로그래밍 실행 후 처음 getInstance 메서드를 호출할 때 Singleton 클래스가 초기화 된다.
- 이 때 static 필드가 초기화되며 유일한 인스턴스가 만들어진다.
enum을 이용한 Singleton
enum의 요소는 상수로서 인스턴스의 유일성을 보증받는다.
- java.time.Month.APRIL은 달력의 4월을 나타내는 인스턴스이자 시스템에서 유일한 인스턴스이다.
- 요소를 하나만 가지는 enum을 이용하여 다음과 같이 Singleton 패턴을 구현할 수 있다.
public enum Singleton {
INSTANCE;
public void hello(){
System.out.println("hello is called");
}
}
- 유일한 인스턴스에는 Singleton.INSTANCE라는 식으로 엑세스할 수 있다.
- hello 메서드를 호출하는 구문은
Singleton.INSTANCE.hello();
관련 패턴
Abstract Factory 패턴
Builder 패턴
Facada 패턴
Flyweight 패턴
Prototype 패턴
State 패턴
반응형
'책 > Java 언어로 배우는 디자인 패턴 입문' 카테고리의 다른 글
[디자인 패턴] Prototype패턴 (0) | 2023.03.12 |
---|---|
[디자인 패턴] Factory Method패턴 (0) | 2023.03.11 |
[디자인 패턴] Template Method패턴 (0) | 2023.03.11 |
[디자인 패턴] Adapter패턴 (0) | 2023.03.11 |
[디자인 패턴] Iterator패턴 (0) | 2023.02.10 |