설모의 기록

싱글톤(singleton) 패턴 본문

언어/Javascript

싱글톤(singleton) 패턴

HA_Kwon 2017. 12. 16. 23:07

대학교 유니티 강의를 들을 때 GameManager 스크립트를 만들면서 싱글톤에 대해 살짝 배웠는데, 그때는 중요한지도 모르고 어려워서 넘겼던 개념인데,,

회사에 다니면서 직접 싱글톤으로 코드를 구현하다보니 정말 중요한 패턴이라는 것을 꺠달았습니다.

싱글톤 패턴은 어떤 특정 클래스의 인스턴스를 단 하나만 생성하는 것입니다. 따라서 동일한 클래스를 이용해 인스턴스를 여러개 생성해도 처음 생성한 인스턴스를 공유하게 되는 것입니다.

싱글톤 패턴은 여러 언어에서 사용되지만, 지금은 자바스크립트를 기반으로 설명드리겠습니다.

자바스크립트에서 객체를 생성하는 방식은 두가지가 있습니다. 각 방법마다 싱글톤을 구현하는 방법을 설명드리겠습니다.



1. 리터럴 방식

리터럴 방식으로 생성을 한다면 그 자체가 싱글톤 패턴입니다. 변수 obj2 에 위와같은 리터럴을 정의한다고 해서 (obj === obj2) 가 true 이지는 않습니다.



2. new 함수( )

자바스크립트에서는 함수를 클래스처럼 사용합니다. 함수를 이용해 싱글톤 방법으로 구현하려면 3가지 방법이 있습니다.

  1. 전역변수에 인스턴스를 한번 생성해 저장하고, 이후에는 전역변수릐 타입을 체크해 객체라면 전역변수를 사용합니다.

  2. 생성자의 static 프로퍼티에 인스턴스를 저장합니다.

  3. 인스턴스를 함수의 클로저로 감싸 비공개로 만들고 외부에서 수정할 수 없도록 합니다.

위의 세 가지 방법을 하나씩 살펴보겠습니다.


  • 전역변수 사용
전역변수를 사용해 인스턴스를 저장하면 편리하지만 전역이라는 위험이 따릅니다. 전역 변수를 사용하는 것은 좋지 않은 코딩 습관이기에 이 방법은 사용하지 않는 것이 좋습니다.

  • static 프로퍼티 사용
자바스크립트에서 함수는 객체입니다. 객체는 프로퍼티를 가질 수 있기 때문에 함수의 프로퍼티로 인스턴스를 저장하고 이후에는 프로퍼티의 값을 이용합니다. 그러나 이 방법 또한 전역변수처럼 static 프로퍼티가 공개되어 있기 때문에 외부에서 수정가능합니다.



  • 클로저 사용

생성자 함수 내에서 변수를 클로저로 감싸서 반환합니다. 이 방법으로 구현을 한다면, 처음 함수를 호출한 후 함수의 프토로타입에 프로퍼티를 붙여도 싱글톤 객체에는 영향을 끼치지 않습니다.

위의 코드처럼 구현한다면, 나중에 함수의 프로토타입에 추가되는 cry() 와 같은 프로퍼티들은 싱글톤 인스턴스 객체에 영향을 줄 수 없습니다. 따라서 p1.cry(); 코드를 실행하면 undefined 에러가 발생합니다.

'언어 > Javascript' 카테고리의 다른 글

async.waterfall() 메소드  (1) 2018.01.08
bcrypt-nodejs 모듈 사용하기  (0) 2018.01.08
Map 과 Set  (0) 2018.01.04
자바스크립트 메모이제이션(Memoization) 패턴  (0) 2017.12.16
자바스크립트 함수  (0) 2017.12.16
Comments