[Design_Pattern] 싱글톤 패턴(Sigleton Pattern)
이번시간에는 자바 싱글톤패턴을 알아보도록 합시다.
실제 안드로이드 업무를 해보면서 처음으로 접해봤던 패턴 중 하나였습니다.
싱글톤 패턴이란?
하나의 클래스에 대해 어플리케이션이 시작될 때 최초의 한번만 메모리를 할당하고(Static을 이용),
그 메모리에 인스턴스를 new한다.
즉 말 그대로 싱글. 단 하나의 인스턴스를 생성한다.
싱글톤을 써야하는 이유는?
어플리케이션의 탄생부터 종료될 때 까지 변하지 않는 고정된 메모리영역을 얻으면서 동시에 단 한번만 new를 써서 인스턴스를 얻었기 때문에 메모리 낭비를 방지할 수있고, 메모리적으로 효율적이다.
또한 싱글톤으로 만들어진 인스턴스는 전역적으로 사용되기 때문에
다른 클래스의 인스턴스들이 데이터를 공유하고 변경할 수 있다.
싱글톤 패턴의 유의할 점
너무 싱글톤 인스턴스에게 많은 일을 위임하거나 너무 많은 데이터를 공유시킬 경우 싱글톤 인스턴스와 다른 클래스 인스턴스들 간에Coupling이 많아지고 결합도가 높아져 개방폐쇄원칙에 위배된다. 때문에 너무 남발하지 말자....
멀티스레드환경에서 Data 동기화문제가 발생할 수 있으므로, synchronized 키워드를 사용해서 방지할 수 있다.
(아래 싱글톤 예제를 확장한 다양한 싱글톤 버전은 추후 스크랩할 예정이다.)
주로 안드로이드 개발을 실무에서 했기 때문에 예제로 안드로이드 싱글톤 코드를 첨부했습니다.
public class DataManager {
private static DataManager instance = null;
private Activity activity;
private DataManager(){
//생성자앞에 private으로 선언하면서,
//다른 클래스에서 new 키워드를 사용하여 인스턴스를 만들 수 있는 여지를 막음.
}
public static DataManager getInstance(){
if(instance == null){
instance = new DataManager();
}
return instance;
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
}
위 싱글톤 예제에서 주목할 점은 Activity 를 얻어오는 점이다.
그 이유는 싱글톤 클래스의 인스턴스를 생성한 Activity의 생명주기에 따라 영향을 받을 수 있게 하기 위해서다.
만약 Activity 생명주기에 영향을 받지 않게 하기 위해선 Application 레벨의 Context를 받는 것으로 대체할 수 있다.
Application 레벨의 Context를 만약 받게되면, 하나의 어플리케이션 생명주기에 영향을 받게된다.
나는 Activity의 생명주기와 관련하여 싱글톤을 써야했기 때문에 위와 같이 Activity를 받았지만,
각자 개발자 의도에 맞게 커스터마이징 해서 사용하면된다.
http://stevenjsmin.tistory.com/107