Flash Player 10에서의 Vectors 사용 translation

원문보기

Mike Chambers

www.mikechambers.com

 

Flash Player 10 에서 추가된 기능중에 중요한것중 한가지는 Vector Class 라고 할수 있다. Vector 클래스는 형지정이 가능한 Array 클래스라고 볼수 있는데, Array 에 비해 형 지정으로 다른 타입의 요소를 가질수 없게 하고, Array 형에 비해 향상된 속도도 가져왔다.

 

Vector 클래스를 사용하는것은 꽤 간단하다.Array 를 사용하는것과 별반 다르지 않다. 사실 Vector 클래스는 Array 클래스가 가지고 있는 모든 메서드를 가지고 있다.  가장 핵심 차이점은 인스턴스 화 하는 방법이다.

예를 들어 여기 Array 를 인스턴스화 하는 방법이다.

   1:  var :Array = new Array();
   2:  //or
   3:  var b:Array = [];

 


int 타입의 Vector 클래스를 인스턴스화 하는 방법이다.


   1:  //var VARIABLENAME:Vector.<VECTORTYPE> = new Vector.<VECTORTYPE>();
   2:  var vector:Vector.<int> = new Vector.<int>();

 


Array 일 경우에 처럼 Vector 생성자에 숫자를 넘겨줌으로서 특정 크기를 지정할수 있다.


   1:  var size:int = 7;
   2:  var vector:Vector.<int> = new Vector.<int>(size);

그런데 Vector 클래스는 생성자 인수를 추가로 더 가지고 있다. Vector 사이즈가 고정(true) 인지 변화 가능한지(false) 를 지정하는 Boolean 값이 그것이다. 기본 디폴트 값은(false) 이다. 이 값은 fixed 라는 속성값으로 변경 가능하다.


   1:  var size:int = 7;
   2:  var fixed:Boolean = true
   3:  var vector:Vector.<int> = new Vector.<int>(size, fixed);
   4:  vector.fixed = !fixed;

명심해야 할것은 fixed 속성이 true 로 설정시 Vector 클래스의 크기를 변경시키는 메서드들(push(), pop(), shift()) 은 호출할수 없다.


 


Array 에는 다양한 타입의 객체를 담을수 있다.


   1:  var s:String = "I am a string";
   2:  var d:Date = new Date();
   3:  var n:Number = 1138
   4:  var a:Array = new Array();
   5:  a[0] = s;
   6:  a[1] = d;
   7:  a[2] = n;
   8:   
   9:  trace(a[1] is Date); //true

하지만 Vector 클래스에서는 컴파일타임에서 TypeError가 발생하게 된다,.


   1:  var d:Date = new Date();
   2:  var n:Number = 1138
   3:  var v:Vector.<String> = new Vector.<String>;
   4:  v[0] = s;
   5:  v[1] = d;
   6:  v[2] = n;
   7:   
   8:  trace(v[1] is Date); //false
   9:   
  10:  //Compile time errors:
  11:  //Implicit coercion of a value of type Date to an unrelated type String.    
  12:  //Implicit coercion of a value of type Number to an unrelated type String.

그것말고는 Vector 는 Array 와 상당히 비슷하게 동작한다.


API 도 같고, index 넘버로 내부의 아이템들에 바로 접근할수 있는것도 같다.


   1:  var vector:Vector.<int> = new Vector.<int>();
   2:   
   3:  var rand:Number;
   4:  for(var i:int = 0; i < 1000000; i++)
   5:  {
   6:      rand = (Math.floor(Math.random() * 1000000) as int);
   7:      vector.push(rand);
   8:  }
   9:   
  10:  trace(vector[7]);

마지막으로 명심해야 할것은 Vector 는 기본적으로 응집된 Array 이다. 이뜻은 Vector 의 모든 아이템들은  값(혹은 null) 을 가지고 있어야 한다.


 


예를 들어 Array 에서는 이렇게 쓸수 있지만.


   1:  var a:Array = new Array();
   2:  a[0] = "foo";
   3:  a[6] = "bar";

Vector 에서 이렇게 한다면,


   1:  var v:Vector.<String> = new Vector.<String>();
   2:  v[0] = "foo";
   3:  v[6] = "bar";

범위 에러가 런타임에서 발생할 것이다.


 


해결책은 Vector 를 인스턴스화 할때 크기를 지정해주는것이다.


   1:  var v:Vector.<String> = new Vector.<String>(7);
   2:  v[0] = "foo";
   3:  v[6] = "bar";

하단의 예제는 루프를 만번 돌릴때 Vector 와 Array 의 퍼포먼스 차이를 측정하는 예제이다. 단지 특정한 상황의 테스트일뿐이고, 사용자에 따라 퍼포먼스의 차이는 다소 차이가 있을수 있음을 기억해주길 바란다.


   1:  package
   2:  {
   3:      import flash.display.Sprite;
   4:   
   5:      public class VectorTest extends Sprite
   6:      {
   7:          private static const NUM_LOOPS:int = 5;
   8:          public function VectorTest()
   9:          {    
  10:   
  11:              var vector:Vector.<int> = new Vector.<int>();
  12:              var array:Array = new Array();
  13:   
  14:              //populate data
  15:              var rand:Number;
  16:              for(var i:int = 0; i < 1000000; i++)
  17:              {
  18:                  rand = (Math.floor(Math.random() * 1000000) as int);
  19:                  vector.push(rand);
  20:                  array.push(rand);
  21:              }
  22:   
  23:              var sTime:Number = getMilliseconds();
  24:              loopArray(array);
  25:              trace("Loop Array Avg (5) : " + ((getMilliseconds() - sTime)/NUM_LOOPS));
  26:   
  27:              sTime = getMilliseconds();
  28:              loopVector(vector);
  29:              trace("Loop Vector Avg (5) : " + ((getMilliseconds() - sTime)/NUM_LOOPS));
  30:   
  31:          }
  32:   
  33:          private function getMilliseconds():Number
  34:          {
  35:              return (new Date()).getTime();
  36:          }
  37:   
  38:          private function loopArray(a:Array):void
  39:          {
  40:              var len:Number = a.length;
  41:   
  42:              var n:int;
  43:              for(var i:int = 0; i < NUM_LOOPS; i++)
  44:              {
  45:                  for(var k:int = 0; k < len; k++)
  46:                  {
  47:                      n = a[k];
  48:                  }
  49:              }
  50:          }
  51:   
  52:          private function loopVector(v:Vector.<int>):void
  53:          {
  54:              var len:Number = v.length;
  55:   
  56:              var n:int;
  57:              for(var i:int = 0; i < NUM_LOOPS; i++)
  58:              {
  59:                  for(var k:int = 0; k < len; k++)
  60:                  {
  61:                      n = v[k];
  62:                  }
  63:              }
  64:          }
  65:      }
  66:   

내 컴퓨터에서는 이렇게 나온다.


Loop Array Avg (5) : 115.8


Loop Vector Avg (5) : 108.8


 


중요한건 아주 간단하게(값을 참조만함) 테스트 했다는것이다.


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://kylekaturn.egloos.com/tb/729145 [도움말]

덧글

덧글 입력 영역