Flash ActionScript 사용기

사용기라고 하니 뭔가 거창하지만, 오전에 Flash CS3 trial을 받고, 오후에 코드 제네레이터 초안까지 잡았으니 일단 사용기는 사용기.

C++과 통신할 수 있는 ActionScript 모듈을 만들어내는게 목표였는데, 사용하다 괴로운 점이 한 두가지가 아니었다.

약 타입 언어주제에 제한이 많다

완전히 동적 타입이라 사용하기 쉬운 것도 아니고, 그렇다고 함수형 언어의 강력한 ((그래봐야 잘 만든 테스트들보다는…)) 정적 타입 검사랑은 비교도 안되는 주제에 이런 저런 안되는게 왜 그리 많은지…

게다가 타입 지정이 기본도 아니라는 것은 참 아스트랄 ((타입을 지정하지 않고도 변수를 사용해도 되고, 경고도 없다. 이럴거면 차라리 python처럼 duck–typing을 해줘…))

텍스트 기반의 소켓 구현

사용해야 했던게 Flash 8 / ActionScript 2.0이라소 binary socket이 없다. 그럼 무슨 짓을 해야하는가 하면…

  • Binary <-> text 변환을 수시로 한다
  • 한 번에 전송되는 단위는 Null-terminated string 1개
  • 다만 이렇게 간단한 데이터 구조라 버퍼링 같은 것은 밑단에서 해결
  • 사용되는 문자열은 기본적으로 UTF-8

Binary -> Text 변환에 UTF-8을 더하면(…), 안정적으로 보낼 수 있는 binary–to–text 변환이 아주 적은 수로 줄어든다. UTF-8의 경우 각 바이트의 처음 몇 비트만 보면 이게 연속인지, 끝인지 파악할 수 있는데 (물론 첫 바이트로 다 알 수 있기도하고), 단순히 8bit을 다 쓰는 인코딩을 했다간 이게 뭐가 날아갈지.

게다가 \0 이 전송되면 그걸로 메시지 하나가 종료… 일단 뼈대로는 구글 차트에서 사용되는 8bit 중 6bit을 쓰게해주는 녀석을 생각 중.

함수를 다루는 것

그렇지만 이게 함수객체의 형변환 검사가 되는 것도 아니고 좀 많이 불편하다. 그래도 멤버 함수를 배열로 넣을 수 있다는 것은 적당한지도.

배열 생성자가 모호하다

배열 생성 구문이,

var x:Array = new Array( )

같은 형태인데, 다음 두 가지가 다 가능하다.

var x1:Array = new Array( 10 )
var x2:Array = new Array( 1, 2, 3, 4, 5 )

어떤 차이가 날까?

첫번째 항목은 길이 10짜리 배열을, 두번째 항목은 1, 2, 3, 4, 5를 원소로 갖는 배열이 만들어진다. 원소 1개짜리 배열은 선언하고 / 대입하는 형태로 써야함.

for statement scope가 괴악

한 가지 형태로밖에 재현을 못하고 있긴한데 for loop 이전에 변수 선언 / 들어가서 변수 선언에 따라 스택에 쌓인 다른 변수 값이 변하는 괴악한 현상을 당했다. 이건 좀 알아봐야할 것 같은데…

File scope의 괴악함

ActionScript 2.0에서 Flash 자체 파일 — .fla — 말고 외부에 .as 로 ActionScript 파일을 분리할 수 있는데, 다음과 제약이 좀 문제가 많다.

  • 파일 전체에서는 class 혹은 interface 안에 들어간 선언들만 의미가 있다
  • 전역 함수나 변수는 선언할 수 없다

라는 것. Python의 __main__()을 생각하고 테스트를 작성하다가 짜증 한 번 내고, 각각의 클래스에 static member로 추가.

문서 검색의 문제

PDF 파일 혹은 Flash CS3 자체에 내장된 도움말 파일을 볼 수 있긴한데, 둘 다 검색 성능면에서 욕이 절루 나온다. MSDN offline 파일의 증분검색이나, man 페이지처럼 후다닥 볼 수 있는 걸 기대하면 안된다

편집기 문제

사실 외부로 class들을 분리한게 소스 컨트롤에 넣는 것과, 편한 편집기 — 내 경우엔 vim — 를 쓰자는 거였는데, 정작 전역 변수나 함수를 선언할 수 있는 .fla는 외부 편집기에서 편집하는게 사실상 불가능하다 — binary와 UTF-16으로 보이는 문자들이 섞인 괴악한 물건이다보니… ((WordPad로 열어보고 소스를 좀 보다가 Flash CS3 trial을 설치함))

뭐 이런 문제도 문제고 — ActionScript 3은 좀 더 낫다고 하는데 — 속도 문제나 편집기 문제같은 걸 생각할 때 이번 같은 특수한 응용이 아니고서야 APM묶음에 의존하지 (그러니까 ActionScript와 대응해서는 Perl,PHP,Python…)) 이걸 쓰고 싶겠냐. RIA라고 굳이 flash에 의존하지 않는 이유를 너무나 명확히 본 기분이다 -_-

ps. rein이 Flash를 써본지 아직 12시간이 안되었다. 보충설명, 잘못된 점 지적 매우매우 환영. 조언을 해준다면 매우 감사히 받아들이겠다.

Jinuk Kim
Jinuk Kim

SW Engineer / gamer / bookworm / atheist / feminist

Articles: 935

4 Comments

  1. ActionScript는 모르지만, 언어 자체가 ECMAScript니 제가 아는 부분만 말씀드리자면, 배열은 리터럴이 존재합니다. 대괄호로 감사면 됩니다.

    var a:Array = [10];
    var a:Array = [1, 2, 3, 4, 5];

    또, for문은 C++와 달리 별도의 scope를 지니지 않습니다. 그 문제 때문에 최근 JavaScript 프레임워크들은 아래와 같이 배열에 forEach 메서드를 만들어서 사용합니다.

    Array.prototype.forEach = function(block: Function) {
    for(var i = 0; i < this.length; ++i)
    block(this[i], i);
    };

  2. 홍민희 / 리터럴을 사용하면 해결되는군요. 감사합니다.

    for 문의 스코프 문제는 저런 형태로 해결하면 되긴하는데, 기본적인 스코프 룰은 좀 괴롭네요 -,-

  3. 대부분 ActionScript 3.0로 넘어가시면 해결 될 것 같아요. 또 Flash보다는 Flex 3를 쓰는게 프로그래머 입맛에 맞죠. Flex SDK는 무료이기도 하고, Flash보다는 Flex쪽이 프로그래머 입맛에 맞죠. Eclipse 기반 빌더도 있고, 멀티 플랫폼에, 원하는 에디터로 쓸수도 있고..

    애초에 AS2까지는 프로그래머 툴이라기엔 부족한게 많았죠. 바이너리 소켓이나 정상적인 클래스 개념도 AS3 들어가서나 제대로 지원되니까요. 타입 문제도 디자인 툴의 보조 수단 정도였던 AS1과의 호환성을 고려하다보니 그렇게 된거고요.

    뭐 requirement에서 Flash 8에서도 돌아가야한다는 것 같은게 있으셨던 것 같기는 하지만. 그렇지 않고서야 굳이 CS2를 받으실 이유가. 근데 CS3에서도 AS2/Flash 8는 잘 돌아가요. 툴 자체도 많이 좋아졌고. (물론 그래봤자 그 거지같은 도움말은 여전합니다. 저는 그냥 livedocs.adobe.com에서 보는 편.)

  4. dasony / 3.0 못넘어가는 이유가 있는건진 모르겠는데.
    일단 내가 관여해야하는건 앞으로 길어야 2주. 그리고 CS3쓰고있긴해(CS2는 오타; 30일짜리 체험판이지만)
    실제로 쓰는건 내 제네레이터가 만든 코드가 valid한가 / 테스트를 통과하는가 검사하는 것 뿐이긴한데 뭔가 수동 테스트라는게 내 성격을 버리게 만드는 느낌;

    + 빌드 자동화 그게 뭔가요? 인 것은 확실히 문제. 도저희 CI / 자동 Test 랑 연동을 못시키겠음.

Leave a Reply