sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | http://1 |
extra_vars4 | ko |
extra_vars5 | |
extra_vars6 | sitelink1 |
7. Singleton(싱글턴) 패턴
1) 정의
Singleton 클래스의 인스턴스느 오직 하나임을 보장하며 이 인스턴스에 접근할 수 있는 방법을 제공한다. |
싱글턴 패턴은 유일무일한 단 하나의 객체를 생성하는 패턴이다.
즉 중복된 것을 제외 하고 유일한 것을 뽑는 패턴이라고 할 수 있다.
그런데 유일무이한 객체를 생성해서 어디에 어떻게 사용을 해야 할까?
2) 예제
평소에 게임을 너무 좋아하던 다은이는 게임 개발사에 프로그래머로 취업을 했다. 처음으로 맡은 일이 맵툴을 만들어서 타일을 불러들여서 맵을 세팅하는 부분을 코딩하는 일이였는데, 처음에는 타일을 읽어와서 찍어주는 일만 하면 되려니 하고 쉽게 생각하다 보니, 예상치 못한 복병을 만나게 되었다. 지금 만드는 WIDE WORLD 라는 타이틀의 게임의 맵이 너무너무 넓어서 타일을 불러와서 찍기만 하는 방식으로는 엄청난 로딩양과 리소스의 낭비가 존재하기 때문이다. 그렇다면 어떻게 해결해야 할까?
표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;
}
}
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
23 | 비즈니스 패턴 | 황제낙엽 | 2008.04.10 | 158 |
22 | SOA Service Benefit Pattern | 황제낙엽 | 2008.04.10 | 129 |
21 | 패턴 입문가에게 권하는 책 - Head First Design Patterns (스토리가 있는 패턴 학습법) | 황제낙엽 | 2007.11.25 | 240 |
20 | 디자인 패턴(GoF) 카다로그 | 황제낙엽 | 2007.11.25 | 160 |
19 | 해석자(Interpreter) | 황제낙엽 | 2007.11.25 | 205 |
18 |
책임연쇄(Chain of Responsibility) 패턴
![]() | 황제낙엽 | 2007.11.25 | 205 |
17 |
복합체(Composite) 패턴
![]() | 황제낙엽 | 2007.11.25 | 180 |
» |
Singleton(싱글턴) 패턴
![]() | 황제낙엽 | 2007.11.25 | 148 |
15 | Prototype(프로토 타입) 패턴 | 황제낙엽 | 2007.11.25 | 242 |
14 | Builder(빌더) 패턴 | 황제낙엽 | 2007.11.25 | 311 |
13 |
Factory Method(팩토리 메소드) 패턴
![]() | 황제낙엽 | 2007.11.25 | 310 |
12 |
Abstract Factory(추상 팩토리) 패턴
![]() | 황제낙엽 | 2007.11.25 | 185 |
11 |
디자인패턴의 개요&기본 개념 정리
![]() | 황제낙엽 | 2007.11.25 | 128 |
10 | 디자인패턴과 리팩토링의 관계 | 황제낙엽 | 2007.11.20 | 209 |
9 | Template Method Pattern | 황제낙엽 | 2007.06.29 | 169 |
8 | The Facade Pattern | 황제낙엽 | 2007.05.23 | 131 |
7 | Factory Pattern | 황제낙엽 | 2007.04.21 | 132 |
6 | Decorator Pattern | 황제낙엽 | 2007.04.21 | 133 |
5 |
해드퍼스트 디자인패턴 샘플 예제 모음
![]() | 황제낙엽 | 2007.04.11 | 185 |
4 | Observer Pattern | 황제낙엽 | 2007.04.05 | 139 |