티스토리 뷰
애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴
즉, 싱글톤 패턴은 '하나'의 인스턴스만 생성하여 사용하는 디자인 패턴이다.
자바에선 생성자를 private로 선언해서 생성 불가하게 하고 getInstance() 메서드를 통해 받아서 사용한다.
장점
- 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
- DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용한다.
- 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용한다.
- 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아진다.
예시
프린터 관리자 만들기
프린트 하나를 10명이 공유해서 사용한다고 하자.
public class Printer {
public Printer() { }
public void print(Resource r) { ... }
}
그러나 Printer 클래스를 사용해 프린터를 이용하려면 Client 프로그램에서 new Printer()가 반드시 한 번만 호출되도록 주의해야 한다. (프린터는 하나이기 때문에)
이를 해소하는 방법은 생성자를 외부에서 호출할 수 없게 하는 것이다.
- Printer 클래스의 생성자를 private으로 선언
public class Printer {
private Printer() { } // Printer 생성자를 외부에서 사용 불가
public void print(Resource r) { ... }
}
자기 자신 프린터에 대한 인스턴스를 하나 만들어 외부에 제공해줄 메서드가 필요하다.
static 메서드 / static 변수
- 구체적인 인스턴스에 속하는 영역이 아니고 클래스 자체에 속한다.
- 클래스의 인스턴스를 통하지 않고서도 메서드를 실행할 수 있고 변수를 참조할 수 있다.
만약 new Printer()가 호출되기 전이면 인스턴스 메서드인 print() 메서드는 호출할 수 없다.
public class Printer {
// 외부에 제공할 자기 자신의 인스턴스
private static Printer printer = null;
private Printer() { }
// 자기 자신의 인스턴스를 외부에 제공
public static Printer getPrinter(){
if (printer == null) {
// Printer 인스턴스 생성
printer = new Printer();
}
return printer;
}
public void print(String str) {
System.out.println(str);
}
}
Client에서의 사용
public class User {
private String name;
public User(String name) {
this.name = name;
}
public void print() {
Printer printer = printer.getPrinter();
printer.print(this.name + " print using " + printer.toString());
}
}
public class Client {
private static final int USER_NUM = 5;
public static void main(String[] args) {
User[] user = new User[USER_NUM];
for (int i = 0; i < USER_NUM; i++) {
// User 인스턴스 생성
user[i] = new User((i+1));
user[i].print();
}
}
}
'StudyingRecords > Design Pattern' 카테고리의 다른 글
[DesignPattern / StrategyPattern] (0) | 2022.03.03 |
---|---|
[DesignPattern / Iterator패턴] (0) | 2022.02.28 |
어댑터 패턴(Adapter Pattern) (0) | 2021.12.29 |