자바스크립트 싱글 패턴 스토리 - I

사용자 삽입 이미지
여담 :
   참으로 싱글이 더욱 추워지는 날씨 입니다.
   내일은 싱글은 정말 속상한 하루 입니다.

   하지만 둘 일때 느끼는 추위는 싱글이 느끼는 추위보다
   더욱 춥습니다.


   그리고 더 추운 사람들은 둘이 할 수 없는
  사람들입니다.

  그런 사람들을 위해 따뜻한 손길을 뻗을 수 있는
  연말이 되었으면 합니다.




자바스크립트에서도 다양한 디자인 패턴이 가능합니다.
GoF 패턴 POSA 패턴 등 말이죠..

아마 UI 개발자 분들 중 javascript 를 이용하시는 분들은 대부분 패턴을 적용하신지 모른체 사용하고 계실꺼에요.  저도 Java 디자인 패턴 교육을 10일 동안(?) 참여했었는데요.  그 교육의 모든 예제가  Java 였습니다.  대형 프로젝트는 대부분 Java로 하니깐요..

또한 설계의 중요함을 포함해야 하는 언어이기도 하니깐요..
교육 중 다양한 패턴을 javascript 포팅을 해봤습니다. 큰 어려움은 없었습니다.






자자 서론이 길어졌습니다. 본론으로 들어가겠습니다.



위의 예제는 간단한 클래스 입니다.  foo() 를 new Operator를 통해서 foo()를 참조하는 인스턴스를
생성하였습니다.

bar와 zoo 의 constructor 는 같습니다.

하지만 인스턴스는 서로 다른 인스턴스를 같습니다.



위의 소스를 실행하보면 간단하게 알 수 있습니다.
당연히 다른 결과가 찍힐꺼라 생각됩니다.  여기서 잠시 삼천포로 빠지겠습니다.

저는 여러 예제를 봤습니다. 디자인 패턴 -> 싱글톤 도대체 이런것이 무슨 의미를 갖고 의미는 알 지언정
언제 적용해야하는 걸까? 적용해서 어떤 이점이 있을까?
또한 어떤 이점이 있고 언제 적용해야한다. ...  뭐 다양한 언어에 대해서 좋은 예시와 개념들이
많은 사이트에서 제공되고 있습니다.

하지만 몰랐습니다.  패턴이란걸 언제 쓰고 어디다 쓰고 해야하는 지!!

객체 지향에 대한 개념이 없었다는 것이었죠..  하지만 봐웠던게 도움이 많이 되었던것 같습니다.
개념을 정리하는 것이 단지 남의 예제와 예시를 보고 이해하는게 아닌 자기것으로 만드는 것
남앞에 "싱글 패턴"이 무엇이다 라고 사전적인 개념이 아닌 사전적 예시가 아닌 실제로
코드로 보여줄 수 있는 ... 역시 삼천포로 빠지는건 정리가 안됩니다...

결론은 한번 봐 놓으면 언젠간 도움이 됩니다.  아키텍쳐로 가는 것에 매우 도움이 될 것입니다.

결과는 수행해 보셨나요?

자 그러면 이해가 되지 않더라도 왜 이 글을 보고 있는지도 모르고 싱글 패턴이 먼지도 모르고 도대체
뭘 하려는 글인지 알지도 못할 지언정 "싱글 패턴이 무엇인가?" 라는 것만 꼭 올고 싶다면 위의 소스를 수행해보고 지금 이 소스를 수행해 보세요.



수행해 보셨어요?  결과는 처음 예제와는 조금 틀린 결과가 나왔네요.
당연히 new Operator 를 사용하지 않았기 때문 아니냐 라는 반문을 한다면 !!

여기서 잠깐 GoF에 나오는 싱글 패턴에 대한 소개!!
1. 접근하는 인스턴스는 오직 하나란 것이 보장이 되는 방법을 제시 해야 하며
2. 이렇게 유일한 인스턴스에 접근 할 수 있는 방법을 제공하여야 한다.

2번을 통해서 유일한 인스턴스를 제공하기 위해서 방법을 제공하였습니다.

또 하나.. 하지만 다른 누군가는 이것을 사용할때 new Operator 를 사용하면 어떻게 되느냐?
그러면 싱글 패턴이 깨지는 거 아니냐?

맞습니다. 

그렇다면 new Operator가 수행될 때 foo() 내에서 생성자를 통한 인스턴스 생성인지
아니면 싱글 패턴을 위한 방법(getInstance)에 의한 생성인지를 체크해서 new Operator를 사용할 경우에는
예외 처리를 하거나 하나의 인스턴스만 생성해 주면 되겠네요.

이 부분은 다음 시간에 다루겠습니다.

이어서 위의 소스를 잠깐 설명을 드리면 유일한 인스턴스를 제공하기 위한 메서드를 통해서
하나의 인스턴스를 생성하기 위해 new Operator 로 접근하는게 아니라

foo.getInstance() 를 통해서 접근하였습니다.
이는 foo() 의 인스턴스화 되면서 __instance__ static vairable가 설정되고 이 variable에 자신의 인스턴스가
저장됩니다.

즉 한번 생성된 foo 의 인스턴스는 null이던 this.__instance__ 에 저장되며 getInstance로 접근하게 되면
저장된 __instance__ 값을 계속해서 반환하게 됩니다.

이렇게 싱클 패턴의 조건을 만족하게 됩니다.
Posted by Rhio.kim

댓글을 달아 주세요

  1. BlogIcon Lucifer 2009.01.29 00:32  댓글주소  수정/삭제  댓글쓰기

    하나의 인스턴스만을 사용하여야 할경우 싱글턴을 적용한다.. 라고 하셨는데.. 더더군다나 new 키워드를 제공하지 않는 방법을 쓰고자 하였을경우 자바스크립트의 static 객체만을 이용해도 같은 효과가 날것 같습니다.. function 으로 원형을 정의해두지 않더라도 static Object 내부에서 this로 자기 자신을 참조할 수 있으니까요.. 이러한 방법은 싱글턴으로 해석할수 없는것인지요?

    • BlogIcon Rhio.kim 2009.01.31 09:49 신고  댓글주소  수정/삭제

      var Print = {
      _spool_ : [],
      output : function() {
      this._spool_.push(arguments);
      }
      }

      여기에서 Print 라는 객체 참조 변수를 보는 관점에 따라서 해석이 틀려지겠네요.
      Print 는 Object Notation { } 에 의해서 내부적으로 JavaScript의 Object가 인스턴스화가
      되어지는 관점이라면 Print는 JavaScript 개발되어진 시스템 내에서 Print를 관장하는 객체로
      유일한 인스턴스라 봐도 될것 같구요.

      그렇지 않고 단지 프로그래밍 언어적인 측면에서 Print라는 하나의 오브젝트에 대한 특징적으로
      동일한 효과(?)를 볼 수 있다는... 접근은 싱글톤이라 해석하기엔 다소 부족함이 있을 것 같은데요.

      하지만 Ross Harmes and Dustin Diaz 저 Pro JavaScript Design Pattern의 내용에 보면
      설명하신 내용에 대한 답변이 있습니다.

      댓글로 나누기엔 집고 넘어가야할 부분도 너무 많구요. ^^; 몹시 오해스러운 JavaScript..

  2. BlogIcon Lucifer 2009.02.16 23:17  댓글주소  수정/삭제  댓글쓰기

    이제서야 댓글을 봤네요 ^^; 설명을 듣고보니 자바스크립트라는 프로그래밍언어의 언어학적 관점으로 보았을때는 다소 해석의 차이가 있을것 같네요.. 덕분에 좀 더 자세히 알고 갑니다 ^^ 앞으로도 종종 들를께요...