디자인패턴 Singleton(싱글턴) 패턴

황제낙엽 2007.11.25 11:38 조회 수 : 43 추천:87

sitelink1  
sitelink2  
sitelink3 http://1 
extra_vars4 ko 
extra_vars5  
extra_vars6 sitelink1 

7.    Singleton(싱글턴) 패턴

1)     정의

Singleton 클래스의 인스턴스느 오직 하나임을 보장하며 이 인스턴스에 접근할 수 있는 방법을 제공한다.

 

싱글턴 패턴은 유일무일한 단 하나의 객체를 생성하는 패턴이다.

즉 중복된 것을 제외 하고 유일한 것을 뽑는 패턴이라고 할 수 있다.

그런데 유일무이한 객체를 생성해서 어디에 어떻게 사용을 해야 할까?

 

2)     예제

평소에 게임을 너무 좋아하던 다은이는 게임 개발사에 프로그래머로 취업을 했다. 처음으로 맡은 일이 맵툴을 만들어서 타일을 불러들여서 맵을 세팅하는 부분을 코딩하는 일이였는데, 처음에는 타일을 읽어와서 찍어주는 일만 하면 되려니 하고 쉽게 생각하다 보니, 예상치 못한 복병을 만나게 되었다. 지금 만드는 WIDE WORLD 라는 타이틀의 게임의 맵이 너무너무 넓어서 타일을 불러와서 찍기만 하는 방식으로는 엄청난 로딩양과 리소스의 낭비가 존재하기 때문이다. 그렇다면 어떻게 해결해야 할까?

 

 npe72_gamediz.jpg

 

8과 같이 20Km X 15Km나 되는 방대한 맵이 있다고 해보자.

타일 하나의 크기는 100m X 100m 라고 할 때, 위의 맵은 30000개의 타일이 깔려야 한다. 게임에서 이렇게 방대한 맵을 한번에 읽어들이면 게임이 엄청나게 느려질 것이다.

 

그래서 다은이는 싱글턴 패턴을 이용해서 맵을 읽어들이기로 했고 부분적으로 다른 패턴을 조합하여 사용하기로 했다. 대략 다음과 같은 순서이다.

 

    맵을 생성할 때 타일이 유일무이한 것인지 판단한다.

    유일한 것이면 타일세트에 추가한다.

    타일세트에 추가되어 있는 것이면 저장되어 있는 것을 사용한다.

 

위의 방식의 핵심은 실제로 맵에 타일이 찍히는 부분이 아니라 타일세트에 있다.

실제 맵에 바로 타일을 찍는 게 아니라 타일세트라는 부분에서 로딩 및 체크를 담당하여 맵을 생성해주기 때문에 맵을 전체를 읽어줄 필요가 없어서 속도도 확보되고 리소스도 확보 할 수 있는 것이다.

 

이처럼 싱글턴 패턴은 사실 타일이 유일무이한 것인지만 판단하면 끝이지만, 관리 기능과 혼합하여 사용하면 활용도가 대폭 증가할 수 있다.

 

비슷한 예로 네이버에 존재하는 블링크라는 것이 있다.

블링크는 글을 쓴 후에 글을 링크시키는 기능만 가지고 있는데, 링크 시킬 때 일종의 타이틀을 둘 수 있다. 대략 ‘XXX 좋아해’, ‘XXX 할래와 같은 타이틀로 링크를 시킬 수 있는데 만약 글을 쓴 후에 전지현 좋아해라고 블링크에 등록하면 네이버가 자동으로 검색을 하여 전지현 좋아해라는 블링크가 존재하면 하위에 글을 붙여버리고, 존재하지 않으면 자동으로 블링크를 생성하여 그 글을 첫글로 등록한다.

여기에서 블링크의 ‘XXX 좋아해라는 영역 자체가 싱글턴 패턴을 사용한 예라고 할 수 있다.

 

* 2007년 10월 6일 설명추가(마이즈님 질문 답변을 겸한....)

싱글턴은 단순하게 유일한 객체를 생성하는 패턴이고 사실 이게 전부입니다. 블링크의 예를 든건 블링크에 글을 올리는 유저들은 사실 아무 생각없이 글을 쓰고, XX 좋아해 라고 등록만 하면, 네이버의 블링크 관리 모듈이 이 글이 최초 등록된 글이면 자동으로 블링크를 생성하여 첫글로 등록하고 기존에 등록되어 있는 블링크가 있으면 해당 블링크를 찾아서 링크를 시켜줍니다.
여기서 싱글턴에 해당되는 부분은 관리 모듈이 체크해서 기존에 존재하지 않으면 즉 유일무이한 것이면 블링크를 생성하는 바로 이 부분입니다. 싱글턴은 이렇게 유일무이한 것인지 체크를 하는 형태로 사용됩니다. 다만... 이런 형태로 유일무이한지 체크를 하는 것에서 끝내게 되면 싱글턴의 활용도는 극히 떨어지게 됩니다. 그래서 일종의 관리 방식을 접목 시킨게 네이버 블링크인데... 유일무이한 것이면 생성, 그렇지 않으면 글 붙이기 라는 관리 방식을 사용했습니다. 이러한 형태로 싱글턴과 관리 방식이 겸해지면 싱글턴을 보다 효율적으로 사용할 수 있을 꺼 같아서 예를 들었습니다. 글 쓰고 보니 이 덧 설명이 없으면 이해가 좀 어렵겠네요 ^^;



싱글턴 샘플


public class Singleton {   

  

       // 싱글톤 클래스의 유일한 인스턴스를 저장하기 위한 정적 변수   

       private volatile static Singleton uniqueInstance;   

  

       /*  

        * 기타 인스턴스 변수 선언  

        * ...  

        */  

  

  

       /**  

        * 생성사를 private으로 선언했기 때문에 Singleton에서만 클래스의  

        * 인스턴스를 만들 수 있습니다.  

        */  

       private Singleton() {}   

  

  

       /**  

        * 클래스의 인스턴스를 만들어서 리턴합니다.  

        *   

        * @return 싱글턴 인스턴스 리턴  

        */  

       public static Singleton getInstance() {   

             if (uniqueInstance == null) {   

                    synchronized (Singleton.class) {   

                           if (uniqueInstance == null) {   

                                uniqueInstance = new Singleton();   

                           }   

                    }   

             }   

  

             return uniqueInstance;   

       }     

}