Article Category

분류 전체보기 (202)
사는 이야기 (15)
Programming (174)
Photo (5)
게임 (2)
프로젝트 (0)

Recent Comment

Recent Trackback

Calendar

«   2019/05   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Archive

  • Total96,493
  • Today0
  • Yesterday2

ActionScript 3.0 환경에서는 클래스내에서 함수의 오버로딩(overloading)을 지원하지 않고 있다. 그래서 클래스 설계시 알게 모르게 어려움이 따르게 된다.  보통 함수는 method1, method2 등으로 이름을 붙여서 오버로딩이 아니더라도 해결이 가능하다. 하지만 생성자의 경우에는 클래스에 딱 하나의 함수만 가능하므로 오버로딩 기능이 절실해진다. 다행히도 완벽하지 않지만 오버로딩처럼 구축하는 것은 가능하다.

다음 예제를 보자.


view source
print?
01.package
02.{
03.    public class Foo
04.    {
05.        public function Foo( ...args )
06.        {
07.            if( args[ 0 ] is Date )
08.            {
09.                _init( args[ 0 ] );
10.            }
11.            else
12.            {
13.                if( args.length == 3 )
14.                {
15.                    if( args[ 0 ] is Number && args[ 1 ] is Number && args[ 2 ] is Number)
16.                    {
17.                        _init( new Date( args[ 0 ], args[ 1 ], args[ 2 ] ) );
18.                    }
19.                    else
20.                    {
21.                        throw new ArgumentError( "인자는 Number형이여야 합니다." );
22.                    }
23.                }
24.                else if( args.length == 6 )
25.                {
26.                    try
27.                    {
28.                        if( args[ 0 ] is Number && args[ 1 ] is Number && args[ 2 ] is Number &&
29.                            args[ 3 ] is Number && args[ 4 ] is Number && args[ 5 ] is Number)
30.                        {
31.                            _init( new Date( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ], args[ 4 ], args[ 5 ] ) );
32.                        }
33.                        else
34.                        {
35.                            throw new ArgumentError( "인자는 Number형이여야 합니다." );
36.                        }
37.                    }
38.                    catch( e:Error )
39.                    {
40.                        throw new ArgumentError( e.message );
41.                    }
42.  
43.                }
44.                else
45.                {
46.                    throw new ArgumentError( "인자수가 3개 또는 6개 여야합니다." );
47.                }
48.            }
49.        }
50.  
51.        private function _init( date : Date ) : void
52.        {
53.            //do something
54.            trace( date.toString() );
55.        }
56.    }
57.}

생성자에 ...args를 받는 것을 볼 수 있다. ActionScript 3.0은 ...args를 이용해 함수에 입력되는 인자의 수 및 형태에 구애받지 않고 인자를 넘겨줄 수 있다. args는 Array이므로 args.length 속성을 이용해 인자수를 받을 수 있고 각각의 인자를 args[0]과 같은 방법으로 접근이 가능하기 때문에 형태도 체크할 수 있다. 이것이 ActionScript 3.0에서 문법적으로 안되는 Overloading을 해결하는 열쇠가 된다. 컴파일시에 문법적 문제를 해결할 수 없지만 그래도 런타임시에는 throw를 이용해 Error를 던져줄 수 있게 된다. 위 코드는 아래처럼 사용한다.


view source
print?
1.var bar : Foo;
2.bar = new Foo( new Date() );
3.bar = new Foo( 2007, 7, 12 );
4.bar = new Foo( 2007, 7, 12, 12, 3, 4 );
5.//bar = new Foo( "2007", "07", "12" ); //String으로 입력하여 Error발생
6.//bar = new Foo( 2007, 7 ); //인자수가 맞지 않아 Error발생

C++이나 Java등에서는 당연히 객체지향프로그래밍에서 중요하게 언급되는 Overloading이 ActionScript 3.0에서는 안되니깐 정말 답답하기 그지 없었지만 다행히 이 방법으로 해결해본다. 완벽하지 않지만 분명 오도가도 못할때 도움이 될 수 있는 팁이다. ^^;


Trackback 0 and Comment 1

싱글톤 패턴 사용하기

인사이드플렉스 2008/01/02 22:47
translate this to English (via Google)
この文を日本語で翻訳 (NAVERを通じて)
소스를 보다가 싱글톤 패턴이 적용된 내용을 보았습니다.
저야 아이들 아빠니깐 그다지 싱글에는 관심이 없었지만..ㅎㅎ
(새해부터 죄송합니다. 이런 무리한 글을..ㅠㅠ)

사실 패턴 관련해서는 GoF 의 디자인 패턴부터 Java 언어로 배우는.., 자바디자인패턴과 리팩토링 등등 많은 책을 보유하고 있으나 제대로 읽고 적용해본 내용이 없더군요.
그나마 최근 읽고 있는 '패턴 그리고 객체지향적 코딩의 법칙/문우식/한빛미디어' 에서
위안이 되는 글을 찾았습니다.

더 정확히 이야기하면 불필요한 부분에 패턴을 적용하기 위해 머리를 싸매지 마라.
여러분들은 객체지향 프로그래밍을 하는 것이지 패턴 프로그래밍을 하는 것이 아니다.
경험이라는 이름의 시행착오를 거치지 않고는 아무리 패턴을 많이 사용해도 절대 좋은 코드를 얻을 수 없다는 점을 알아야 한다.

그래 아직 경험이 부족한 탓이구나...~~ 라고..

본론을 이야기하면 ActionScript 3 에서는 싱글톤 패턴을 구현할때 Java 와 같이 구현할 수가 없습니다.
일반적으로 Java 에서는 생성자에서 private 을 사용하여 싱글톤 패턴을 만든다고 하더군요.
하지만 ActionScript 3 에서는 생성자에서 public 을 사용하여야만 합니다.
private 나 protected 를 사용하지 못한다는 것이지요.
때문에 싱글톤 패턴을 구현하기 위하여 일종의 꽁수가 들어갑니다.

이렇게 된 원인(?)은 ActionScript 3 개발당시에 ECMA 4th edition(자바스크립트 2) 의 스펙이 아직 확정되지 않았기때문에 잠정적인 위험을 배제하기 위하여 어쩔 수 없는 선택이었던것 같습니다.
AS3 -- on the lack of private and protected constructors
http://weblogs.macromedia.com/sho/archives/2006/04/as3_--_on_the_l.cfm

하지만 아직 자바스크립트 2 의 스펙이 다 제정된것은 아니지만 해당 생성자에 대한 부분은
처리가 된것 같군요.
해당 부분을 어떻게 처리할지 모르겠으나 조만간 반영이 되지 않을까 생각해봅니다.
(Resolved) Private constructors are useful, common, and need to be supported
http://bugs.ecmascript.org/ticket/166

하지만 아직은 지원되는게 아니니깐.
필요하시다면
AS3.0 Better Singletons
http://blog.pixelbreaker.com/flash/as30-better-singletons/
  1.     
  2. package 
  3. {  
  4.     public class Singleton  
  5.     {  
  6.         public static var instance:Singleton;  
  7.  
  8.         public static function getInstance():Singleton  
  9.         {  
  10.             if( instance == null )  
  11.             {  
  12.                 instance = new Singleton( new SingletonEnforcer() );  
  13.             }  
  14.             return instance;  
  15.         }  
  16.  
  17.         public function Singleton( pvt:SingletonEnforcer )  
  18.         {  
  19.             // init class  
  20.         }  
  21.     }  
  22. }  
  23.  
  24. internal class SingletonEnforcer{}  


또는 아래 에서 제안하는 형식을 따라주면 될것 같습니다.
AS3 Singletons, the other way
http://www.nulldesign.de/2007/11/20/as3-singletons-the-other-way/
  1.    
  2. package {  
  3.     public class Singleton {  
  4.         private static var instance:Singleton;  
  5.         private static const checker:Object = {};  
  6.  
  7.         public function Singleton(initObj:Object) {  
  8.             if(initObj != checker) {  
  9.                 throw new Error("Private constructor!");  
  10.             }  
  11.         }  
  12.  
  13.         public static function getInstance():Singleton {  
  14.             if(instance == null) {  
  15.                 instance = new Singleton(checker);  
  16.             }  
  17.             return instance;  
  18.         }  
  19.     }  
  20. }  
Trackback 0 and Comment 0