유일무이한 객체
- 싱글턴패턴은 인스턴스가 하나 뿐인 특별한 객체를 만들 수 있게 해주는 패턴
- 어떤 용도로 쓰는 건가?
- 스레드 풀이라던가, 캐시, 대화상자, 사용자설정, 디바이스드라이버 등등 객체가 전체프로그램에서 오직 하나만 생성되어야 하는 경우에 사용
- 그럼 전역변수로 static 으로 선언해서 사용하면 되지 않느냐?
전역 변수로 객체를 생성하면 어플리케이션이 실행 될 때 객체가 생성될 것이다.(P208 맨밑줄)
그 객체가 자원을 많이 차지 한다면 사용도 되기전에, 괜히 자원만 차지한다. 사용하지 않는다면 아무 쓸 데 없는 객체가 되겠지.
고전적인 싱글턴 패턴 구현법
- 조심하세요.. 이 코드에 문제가 있다는 것을 알게 될 것입니다.
public class Singleton { //private으로 Sinleton클래스의 유일한 인스턴스를 저장하기 위한 정적 변수를 선언 private static Singleton uniqueInstance; //생성자를 private로 선언했기 때문에 Singleton에서만 클래스를 만들 수 있다. private Singleton() {} //클래스의 인스턴스를 만들어서 리턴해 준다. public static synchronized Singleton getInstance() { if(uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } }
초콜릿 공장
- 만약 애플리케이션에서 ChocolateBoiler 인스턴스가 두 개 이상 만들어지게 되면 어떤 문제가 생길까?
Non-Singleton | Singleton |
---|---|
public class ChocolateBoiler { private boolean empty; private boolean boiled; private ChocolateBoiler() { //이 코드는 보일러가 비어있을 때만 돌아갑니다 empty = true; boiled = false; } public void fill() { if (isEmpty()) { //보일러가 비어있을 때만 재료를 집어 넣습니다. //원료를 가득 채우고 나면 empty와 boiled 플래그를 false로 설정합니다. empty = false; boiled = false; // 보일러에 우유/초콜릿을 혼합한 재료를 집어넣음 } } public void drain() { //보일러가 가득 차 있고(비어있지 않고), 다 끓여진 상태에서만 //보일러에 들어있는 재료를 다음 단계로 넘깁니다. //보일러를 다 비우고 나면 empty 플래그를 다시 true로 설정합니다. if (!isEmpty() && isBoiled()) { // 끓인 재료를 다음 단계로 넘김 empty = true; } } //보일러가 가득 차 있고 아직 끓지 않은 상태에서만 //초콜릿과 우유가 혼합된 재료를 끓입니다. //재료가 다 끓고 나면 boiled 플래그를 true로 설정합니다 public void boil() { if (!isEmpty() && !isBoiled()) { // 재료를 끓임 boiled = true; } } public boolean isEmpty() { return empty; } public boolean isBoiled() { return boiled; } } |
public class ChocolateBoiler { private static ChocolateBoilerSingleton cb; private boolean empty; private boolean boiled; private ChocolateBoiler() { empty = true; boiled = false; } public static ChocolateBoilerSingleton getInstance(){ if(cb == null) cb = new ChocolateBoilerSingleton(); return cb; } public void fill() { if (isEmpty()) { empty = false; boiled = false; } } public void drain() { if (!isEmpty() && isBoiled()) { empty = true; } } public void boil() { if (!isEmpty() && !isBoiled()) { boiled = true; } } public boolean isEmpty() { return empty; } public boolean isBoiled() { return boiled; } } |
싱글턴 패턴의 정의
- 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어 짐
- 어디서든지 그 인스턴스에 접근할 수 있도록 함
- 클래스에서 자신의 단 하나뿐인 인스턴스를 관리하도록 만들면 됨
'Java' 카테고리의 다른 글
Hotspot JVM GC 방식 (0) | 2014.12.09 |
---|---|
[모델1] 간단한 로그인 시스템 (0) | 2014.11.01 |
Path 클래스 사용하기 (0) | 2014.10.01 |
Heap 영역과 Stack 영역 (0) | 2014.09.04 |
Java Hashtable (0) | 2014.06.16 |