티스토리 뷰
Javascript - 싱글톤 패턴 (singletone pattern)
Ideveloper2 2018. 12. 8. 20:48Javascript
:싱글톤 패턴 (singletone pattern)
"자바스크립트 핵심 가이드 라는 책을 읽던중, 모듈 부분에 대해서 학습중에 모듈 패턴을 사용하면, 전역변수 사용을 없앨 수 있고, 이 패턴을 사용하면, 정보은닉과 그 외 다른 좋은 설계 방식을 따를 수 있게 하고, 애플리케이션이나 다른 싱글톤 패턴들을 효과적으로 캡슐화 할 수 있게 한다" 는 부분이 나왔습니다. 싱글톤 패턴에 대해서는 어렴풋이 알고 있어, 이 기회에 제대로 알아보기 위해 학습을 해보았습니다.
| 싱글톤이란?
- 싱글톤 패턴은 전체 시스템에서의 하나의 인스턴스만 존재하도록 보장하는 객체 생성패턴이라고 합니다.따라서, 객체 리터럴도 모두 싱글톤 패턴이라고 할 수 있다고 합니다.
- 또한 싱글톤은 특정 클래스의 인스턴스를 오직 하나만 유지하고, 동일한 클래스로 새로운 객체를 생성해도 처음 만들어진 객체를 얻게 됩니다.
- 싱글톤 패턴은 객체지향 언어에서 여러개의 인스턴스 생성을 피하는 유용한 패턴입니다. 그러나 클래스 기반의 언어라고 말할 수 없는 자바스크립트에서는 이패턴이 그렇게 유용한 편은 아니라고 합니다.
- 또한 js에서의 객체 리터럴이 싱글턴 패턴의 대표적인 예입니다. 하지만 모든 속성이 다 공개 되어있기 때문에, 비공개로 만드는 것이 제대로 된 싱글턴이라고 합니다.
객체 리터럴만으로는 비공개 상태나 함수를 정의 할 수 없습니다. 따라서 외부에서 접근을 할 수 없도록 비공개 멤버를 정의해야 한다고 하는데요, 여기서 당연히 필요한 개념은 클로저입니다.
즉, 싱글톤 객체를 생성하기 위해선 객체 리터럴 + 클로저의 조합이 필요하다고 합니다.
| 싱글톤 예제
아래에서 볼수 있듯이, IIFE로 비공개 멤버 변수를 만들었고, init 함수 안에 있는 객체가 실제 객체의 모습을 띄게 됩니다. 여기서는 a 가 비공개 변수가 되었습니다.
getInstance 함수를 호출할때, 인스턴스의 유무를 판단하고 없을시에는 init함수를 호출하여, 객체를 생성하고 있을시에는 기존 instance를 return 하게 됩니다.
즉, 하나의 인스턴스만 존재하는 싱글톤 패턴을 유지하게 되는것입니다.
var singleton = (function() {
var instance;
var a = 'singleton';
function init() {
return {
a: a,
b: function() {
console.log(a);
}
};
}
return {
getInstance: function() {
if (!instance) {
instance = init();
}
return instance;
}
}
})();
var singletone1 = singleton.getInstance();
var singletone2 = singleton.getInstance();
console.log(singletone1 === singletone2); // true;
위에서 알수 있듯이, 싱글톤 패턴은 또한 모듈 패턴을 활용한 패턴입니다.
따라서, 앞서 말했던 "자바스크립트 핵심 가이드 라는 책을 읽던중, 모듈 부분에 대해서 학습중에 모듈 패턴을 사용하면, 전역변수 사용을 없앨 수 있고, 이 패턴을 사용하면, 정보은닉과 그 외 다른 좋은 설계 방식을 따를 수 있게 하고, 애플리케이션이나 다른 싱글톤 패턴들을 효과적으로 캡슐화 할 수 있게 한다" 라는 부분이 이제 이해가 갈 것입니다.
| 참조한 사이트
- https://www.zerocho.com/category/JavaScript/post/57541bef7dfff917002c4e86
- http://webclub.tistory.com/150
- https://wonism.github.io/js-pattern-1/
'Computer Engineering > Javascript' 카테고리의 다른 글
Javascript - 객체와 객체지향 프로그래밍 (0) | 2019.02.03 |
---|---|
Javascript - 자식 element가 여럿 있을때 event 전파 막는 효과적인 방법 (1) | 2019.01.16 |
Javscript - 자바스크립트함수 [선언방식, hoisting, 반환값,arguments] (0) | 2018.06.26 |
Javascript - 속 깊은 자바스크립트 [3.자바스크립트의 변수] (0) | 2018.05.07 |
Javascript - 속깊은 자바스크립트 [2. 자바스크립트의 스코프와 클로저 -클로저] (0) | 2018.04.23 |