Vector로의 전환

플10 API 중에 새롭게 추가된 Vector 컨테이너는 이제까지 안좋은 관행으로 개발하던 as3 플랫폼에 보다 정규적이고 안정적인 프로그래밍을 강요(?)해주는 매우 훌륭한 클래스입니다. 안좋은 컨테이너 사용법이란 무엇일까요?

요소의 형을 혼용한다.

var temp:Array=[1,true,'kkk'];

위와 같은 예에서 temp 안에 다양한 데이터가 들어있습니다. 만약 temp가 동적으로 생성되는데 무엇이 들어올지 모르는 경우라면 경우마다 분기하여 따로 저장하는게 바람직하고, 처음부터 어떤 그룹이 입력될지를 알고 있다면 그걸 저장할 정적 클래스를 선언하는게 바른 개발방법입니다. Vector는 Vector.<형> 의 형식으로 컨테이너안에 단일형만 지정하게 함으로 이러한 요령을 사용하지 못하게 강제하는 효과가 있습니다.

제약없이 크기를 사용한다.

evangelion_renewal_ep02_avi_001242701램 용량이 커지고 가비지컬렉터가 있다지만 여전히 실행 시 메모리를 관리해야 하는 건 변함 없습니다. 아무 생각 없이 선언하고 무한히 용량이 불어나는 배열은 결국 지속적인 실행이나 대형 프로젝트에서 문제를 일으킵니다. 어떤 자원이 얼만큼 메모리를 사용하는가를 계산하여 미리 배정하는게 가장 좋은 습관입니다. 가장 좋고 안좋고를 떠나서 C나 C++에서는 그렇게 할 수밖에 없고 여러분이 잘 아시는 상용소프트웨어는 거의 C, C++로 만들었다고 봐도 무방합니다. Vector는 fixed라는 속성을 지원하는데, 그렇게 하면 처음에 할당받은 용량이 고정되어 더 이상 불어나는걸 컴파일 수준에서 막을 수 있습니다.

이 외에도 여러분에게 사실 Vector는 더 이상 옵션이 아닙니다. 플10API는 새롭게 추가된 클래스라이브러리의 인자가 대부분 Vector로 선언되어있기 때문에 플레이어 내장객체를 쓰기 위해서라도 Vector와 친해져야합니다.

Vector라는 단어는 두 가지 의미를 지니는데 하나는 전역 함수인 Vector함수와 클래스로서의 Vector입니다.

1. Vector Class

var temp:Vector.<string>=new Vector.<string>(10,true);

위의 소스는 temp를 오직 문자열만 담을 수 있는 컨테이너로 선언합니다. 또한 10개만 요소로 가질 수 있으며, 크기가 고정되게 fixed도 true로 보냈습니다. 이 경우 temp는 pop, unshift 등의 길이를 변화시키는 method사용이 불가능합니다. 왜 이렇게까지 빡빡하게 선언하는가 하면 fixed의 경우 Length를 관리하는 부담을 제거해 줍니다. Array등에서 Length관리를 위해 투입되는 자원은 전체 Array가 차지하는 자원 중 30%에 해당될 정도로 괴로운 알고리즘입니다. Vector에서는 Fixed를 통해 이 부담을 완전히 제거해 더욱 빠르게 작동합니다. 또한 크기를 고정함으로 메모리를 필요 이상 크게 쓰는 걸 컴파일러 수준에서 막을 수 있어 안정적인 개발이 가능해집니다.

2. Vector Function

기존 배열의 표현식은 다음과 같이 한줄로 코딩을 가능하게 만듭니다.

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

하지만 Vector클래스는 아래와 같이 사용하니 불편합니다. 또한 코딩이 불편해 사용마저 기피하게 됩니다.

var a:Vector.<int>=new Vector.<int>(4,true);
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;

배열처럼 편리하게 사용할 수 없을까 해서 만들어둔게 바로 Vector함수입니다. 이름이 클래스와 같아서 해깔리기 쉽습니다. 전역함수의 사용방법은 아래와 같습니다.

var a:Vector.<int>=Vector.<int>([1,2,3,4]);

하지만 이 경우엔 fixed 값이 false이기 때문에 아래와 같이 처리해야 처음과 동일한 소스가 됩니다.

var a:Vector.<int>=Vector.<int>([1,2,3,4]);
a.fixed=true;

3. 다형성문제에 대해

만약 어떤 Vector를 DisplayObject형을 갖도록 선언하면 이 안에 Sprite를 넣을 수 있을까요? 이 문제를 특별히 어도비 문서에도 언급하고 있습니다(여기) 간단히 말해서 불가능합니다. 즉 아래는 에러입니다.

var v:Vector.<displayObject>=new Vector.<displayObject>();
v[0]=new Sprite(); //실패

DisplayObject를 선언했는데 자식인 Sprite를 넣었기 때문입니다. 다형성이 적용되지 않는거죠. 하지만 강제적인 형변환을 하면 넣을 수 있습니다.

var v:Vector.<displayObject>=new Vector.<displayObject>();
v[0]=(new Sprite())as DisplayObject;//성공

이러한 형변환은 Vector 함수의 경우엔 자동으로 해줍니다. 즉 아래는 성공합니다.

var v:Vector.<displayObject>=Vector.<displayObject>([new Sprite()]);

어도비는 Vector함수의 형변환 능력을 갖도록 처음부터 설계가 되어있다고 밝히고 있습니다.

P.S
여담인데 Vector함수가 있어 다양한 객체를 손쉽게 Vector클래스로 전환할 수 있는 것처럼 Array함수도 있습니다. Vector함수가 인자로 배열, Vector, Object 등을 받을 수 있는 것처럼, Array함수도 인자로 다양한 데이터나 다른 컨테이너를 받아 배열로 재정의 해주는 기능을 제공합니다.



관련된 글:

  1. CSexpression
  2. 객체타입을 알아내는 법
  3. Blitting 부록편
  4. 정수 랜덤을 구해보자.
  5. class정의 시 순환참조 오류 #2

3 Comments

  1. 니케 says:

    벡터.. 문법이 참 생소하군요;
    그래도 확실히 안정적인 코딩을 할 수 있을것 같군요.
    잘 읽었습니다~ ^^

  2. hika says:

    이게 그나마 처음 콜린무크 아저씨가 as4문법으로 제안한 형태보다는 훨씬 간단하게 생긴 상태입니다 ^^; 어도비로 넘어간 후 무크 아저씨는 이제 별 힘이 없는거 같기도 하고..

  3. 쫑쫑쫑 says:

    벡터를 어디다가 써먹어야 욕이나게 쓸 수 있을까요 ㅠ?

    ㅠ., 아 그리구 히카님 네톤 좀.. 알려주세요 ~

Leave a Reply