티스토리 뷰

애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함