본문 바로가기
My Image
프로그래밍/Design_Pattern

[Design_Pattern] 싱글톤 패턴(Sigleton Pattern)

by Lim-Ky 2017. 6. 14.
반응형

이번시간에는 자바 싱글톤패턴을 알아보도록 합시다.


실제 안드로이드 업무를 해보면서 처음으로 접해봤던 패턴 중 하나였습니다.



싱글톤 패턴이란?


하나의 클래스에 대해 어플리케이션이 시작될 때 최초의 한번만 메모리를 할당하고(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




반응형

댓글