본문 바로가기

액션스크립트 3.0

문자열을 이용한 함수제어법


개요

여러개의 객체가 놓여져 있고, 그 객체를 클릭했을 때 하나의 리스너에 공통으로 이벤트를 각각 전달한다.
이런 상황에서 각각 객체들의 이벤트를 받아 실행될 함수들이 정의되어 있다고 생각하자. 이럴 때 보통 if 문이나 switch 문을 사용해서 실행될 함수들을 핸들링 하는데, 아래 기존 예제와 같다. 이때 도트연산자 접근법을 배열형태로 접근하게 되면 handler 함수 실행부를 좀 더 간결하게 처리할 수 있다.

사실 이방법은 동적레퍼런스를 접근할 때 주로 사용하는 방법이다. 보통 반복문을 이용해서 여러개의 변수에 접근하고 싶을 때 도트연산자를 배열형태로 접근해서 사용한다. 배열접근법은 변수를 문자열로 접근이 가능하게 해준다. 그럼 도트연산자를 어떠한 상황일 때 사용할 수 있을까? 만약 사용을 할 수 없다면? 이라는 의문이 생길 수도 있다. 플래시는 최종 결과물을 SWF로 출력한다. 다행이도 SWF 자제도 하나의 객체로 간주되기 때문에 우리가 작업하는 플래시 루트에 this 라는 키워드를 허용해 준다. 우리가 그 위치에 변수나 함수를 정의하면 도트연산자를 이용해서 접근할 수 있기 때문에 동적레퍼런스가 가능해진다.
 
AS1.0 에서 eval( 자바스크립트에서 사용) 이라는 키워드를 사용해서 동적참조를 했던 기억이 난다. evel( "문자열변수", 값 );  이런식으로 사용했던 기억이...
플래시에서는 this 키워드를 사용하길 권장한다. eval 이란 키워드는 지금 AS3.0에 와서는 거의 구경조차 할 수 없는 키워드가 되긴 했지만, 그 당시만 해도 정말 사막의 오아시스 같은 존재였던 아주 고마운 녀석이였다.

참고로 변수와 함수, 속성과 메서드 라고 부르는데 같은 의미이긴 하지만 궂이 구분을 하자면, 객체내부에 정의되어 있는 변수를 속성, 함수를 메서드라고 생각하면 되겠다.

아래 수정예제는 도트연산자를 배열형태로 바꿔 ["문자열"]을 이용해서 함수를 제어할 수 있음을 보여주고 있다.

기존 예제 -----

controBtn 객체 내부에는 'play', 'stop', 'pause'  3가지 이름을 각각 인자로 넘겨주는  이벤트를 발생한다.

controlBtn.addeventListener( Event.CHANGE, handler );
function handler( e: Event ): void
{
    var fn: String =  e.funcName as String;
    switch( fn )
    {
        case "play":
            play();
            break;

        case "stop":
            stop();
            break;

        case "pause":
            pause();
            break;
    }
}
function play(): void { trace( "재생" );  };
function stop(): void { trace( "정지" );  };
function pause(): void{ trace( "일시정지" ); };

수정 예제 ----- 코드가 훨씬 간결해 졌음.

controlBtn.addeventListener( CustomEvent.CHANGE, handler );
function handler( e: Event ): void
{
    var fn: String =  e.info.funcName;
    this[fn](); 
}
function play(): void { trace( "재생" );  };
function stop(): void { trace( "정지" );  };
function pause(): void{ trace( "일시정지" ); };


CustomEvent 는 기본적으로 이벤트를 상속받고 있고, info라는 오브젝트 타입을 인자로 넘겨주고 있다. 개인적으로 사용하고 있는 사용자 정의 이벤트이다.