본문 바로가기

공부/컴퓨터

[디자인패턴] Singleton 패턴

반응형
==========================================================================
이 글은 이론적으로 아는 것을 직접 설명 및 구현을 해 봄으로써 제 자신의
실력을 다지기 위한 글 입니다. 물론 정확한 이론. 용어도 아님을 밝힙니다.
이 글을 직.간접적으로 사용함으로써 발생되는 모든 불이익을 책임지지 않습니다.

문의점, 오류, 잘못된 용어들은 저의 홈페이지 Work 게시판을 이용하여 주시고
이상의 사항에 대하여는 최대한 덧글 ( 코멘트 ) 를 이용해 주십시오.

본 글은 저의 홈페이지인 http://ggaman.com 과
싸이월드의 (JPSC) JAVA program study club 에서 보실수 있습니다.

homepage : http://ggaman.com e-mail n MSN : chan at ggaman.com

20030924 - Chan
==========================================================================
안녕하세요.
찬 입니다.

오늘은 Singleton 패턴에 대하여 이야기 해 보겠습니다.

싱글톤 패턴은 그 클래스의 인스턴스가 단 한개만 만들어지도록 고안된 클래스 입니다.

즉 객체 생성이 단 하나만 되는 클래스 겠죠?

그러므로 .. 이것은 UML 차트(?)가 필요 없습니다.

여러 클래스들과 연동 되는 것이 아니라. UML 없이 소스만 확인하셔도 충분히
이해하실거라 믿어 의심치 않습니다.;

인스턴스가 하나만 만들고 싶을때, 프로그래머가 실수를 해도.
더이상 객체게 생성 되면 안될것입니다.
( 프로그래머는 항상 실수 할수 있습니다. )
( 마치 사용자가 프로그램을 제 마음대로 사용하듯이 .. )

간단한 클래스입니다.

public calss Singleton {
    
    // 스태틱으로 싱글톤의 객체를 하나 만든다.
    // 물론 static 이기 때문에 여러번 객체를 만들려고 시도해도 한번만 실행 될것이다.
    private static Singleton single = new Singleton();

    // 생성자가 private 이므로 외부에서는 생성하지 못한다.
    // 즉 내부, private static Singleton single = new Singleton(); 에 의해서만 사용된다.
    private Singleton() {
        // to Something
    }

    // 만약 만들어진 객체를 얻고 싶다면 getInstance() 를 이용해서 객체를 얻을수 있다.
    // 단 getinstance를 처음 호출 하면 private static Singleton single = new Singleton(); 이
    // 실행되므로 return single; 가 가능해 진다.
    public static Singleton getInstance() {
        return single;
    }
}


위의 클래스를 보다시피 Singleton 클래스는...
생성자를 private로 가지고 있으므로 해서 외부에서 new 로 생성할수 없게 되어 있습니다.
그렇다면 언제 생성자가 실행 되느냐 하는 문제가 있습니다.

바로 getInstance() 메소를 호출 할때 ( 만약 다른 메소드가 있다면 그 메소드를 호출 할때 )
실행 하게 되어 있습니다.
그 이유는 바로 , 제일 위의 private static Singleton single = new Singleton(); 에 있습니다.

우선 static 메소드는 클래스 이름으로 호출 할수 있습니다.
Singleton.getInstance(); 라고 호출 한다면
private static Singleton single = new Singleton(); 가 실행 될것이고.
new Singleton(); 이 실행 될것입니다. Singleton() 생성자는 내부에서 사용할수 있으므로
private Single()  { ... } 는 제대로 실행 될것입니다. 이렇게 해서 생성자가 실행이 되게 됩니다.

또, getInstance() 호출 한다면 static로 만들어진 single를 리턴 시킵니다.

만약 다시 한번 Singleton.getInstance() 를 호출 한다고 해도 새로운 객체가 생성되지 않습니다.
single 객체게 바로 static로 선언되어 있기 때문에 최초 첫번째만 생성되기 때문입니다.

한번만 차근히 생각해 본다면 어렵지 않은 패턴이라고 생각 됩니다.


JAVA 언어로 배우는 디자인 패턴 입문 이라는 책에
[독자의 사고를 넓혀주는 힌트] 라는 글을 요약해 보겠습니다.

. 왜 제한이 필요한가 ? 인스턴스가 다수개 존재하면 인스턴스 상호간 영향을 주어
                                생각지 못한 버그가 발생할 수 있습니다.

. 유일한 하나의 인스턴스는 언제 생성 되는가 ?  위에 설명 되어 있습니다.



Singleton 패턴에서 중요한것은
여러개가 생성되지 않도록 생성자를 private로 설정하고,
하나의 인스턴스를 저장할 static 변수를 하나 만들어야 합니다.
물론 그 변수(객체)를 얻을수 있는 getInsatance() 라는 메소드 역시 구현해야 합니다.


많은 도움 되시길 바랍니다.


즐거운 하루 되세요~~!! ^^
반응형