티스토리 뷰
Singleton Pattern - 디자인 패턴
참고서적 : Head First Design Pattern
소스코드 다운로드 : http://www.wickedlysmart.com/headfirstdesignpatterns/code.html
패턴 정의 #6 - Singleton Pattern
싱글턴 패턴 (Singleton Pattern)은 해당 클래스의 인스턴스가 하나만 만들어지고,
어디서든지 인스턴스에 접근할 수 있도록 하기 위한 패턴입니다.
가장 널리 사용하는 디자인 패턴이 아닌가 합니다.
굳이 디자인 패턴을 모르더라도 자바 프로그래밍에서 자주 사용하기도 하죠~~
싱글턴 패턴은 클래스에서 자신의 단 하나뿐인 인스턴스를 관리하도록 만들면 됩니다.
그리고 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하도록 해야 합니다.
인스턴스가 필요하면 반드시 클래스 자신을 거치도록 해야 되겠죠..
- uniqueInstance 클래스 변수에 싱글턴의 유일무이한 인스턴스가 저장됩니다.
- getInstance() 메소드는 정적 메소드, 즉 클래스 메소드입니다.
그냥 Singleton.getInstance() 라는 코드만 사용하면 언제 어디서든 이 메소드를 호출할 수 있습니다.
전역 변수에 접근하는 것만큼이나 쉬우면서도 게으른 인스턴스 생성을 활용할 수 있다는 장점을 제공합니다.
- 싱글턴 패턴을 구현한다고 해서 여기 있는 Singleton 클래스처럼 간단해야 하는 것은 아닙니다.
그냥 일반적인 클래스를 만들 때와 마찬가지로 다양한 데이터와 메소드를 사용할 수 있습니다.
싱글턴 패턴을 사용할 경우, 한가지 고려해야 할 사항이 바로 멀티스레딩 관련 문제입니다.
두 개의 쓰레드가 동시에 생성할 경우, 인스턴스가 두 개 생길 수도 있다는 것이죠..
그래서 이에 대한 해결책으로 다음과 같은 세가지 방법을 사용합니다.
참고하시기 바랍니다.
1. synchronized 키워드를 사용한다.
synchronized로 동기화 하게 되면 비용 측면에서의 문제가 발생할 수 있으므로
getInstance()의 속도가 그리 중요하지 않을 경우, 사용해야 한다고 합니다.
2. 인스턴스를 필요할 때 생성하지 말고, 처음부터 만들어 버린다.
실행중에 만들지 않고 처음부터 Singleton 인스턴스를 만드는 방법입니다.
클래스가 로딩 될 때, JVM에서 Singleton의 유일한 인스턴스를 생성한다고 합니다.
그러므로 JVM에서 유일한 인스턴스를 생성하기 전에는 어떤 쓰레드도 uniqueInstance 변수에 접근할 수 없습니다.
3. DCL(Double Checking Locking)을 써서 getInstance()에서 동기화 되는 부분에 대한 체크를 줄입니다.
DCL은 Java 5 이전 버전에는 사용할 수 없습니다. 즉, 1.4 버전에서는 지원이 안된다는 것이죠~
어쨌든 동기화를 체크하는 부분이 처음에만 이루어지므로 성능에 큰 영향을 주지 않게 됩니다.
volatile 키워드를 사용하면 멀티쓰레딩을 쓰더라도 uniqueInstance 변수가 Singleton 인스턴스로 초기화 되는 과정이 올바르게 진행되도록 할 수 있습니다.
'XML Developer > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴#8] 어댑터와 퍼사드 패턴 (0) | 2007.08.10 |
---|---|
[디자인 패턴#7] 커맨드 패턴 (0) | 2007.06.01 |
[디자인 패턴#5] 추상 팩토리 패턴 (0) | 2007.05.09 |
[디자인 패턴#4] 팩토리 메소드 패턴 (0) | 2007.05.03 |
[디자인 패턴#3] 데코레이터 패턴 (0) | 2007.04.27 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 맥
- 클라우드
- XML
- SCORM
- 모바일
- 구글
- 웹
- Hadoop
- 애플
- 빅데이터
- 마케팅
- 자바스크립트
- 프로젝트
- 아이폰
- java
- 안드로이드
- fingra.ph
- 하둡
- 분석
- HTML
- 자바
- mysql
- r
- 책
- 도서
- 세미나
- 통계
- ms
- 디자인
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
Blog is powered by
Tistory / Designed by
Tistory