'flash10 Vector 벡터'에 해당되는 글 1건

  1. 2008.08.25 플래시 플레이어 10의 신기능인 Vector 클래스 사용하기 (2)
2008.08.25 21:09

플래시 플레이어 10의 신기능인 Vector 클래스 사용하기


플래시 플레이어 10의 새로운 기능중 하나인 Vector 클래스 사용법을 알아보자

기존의 Array와 아주 비슷하지만 내부 엘리먼트의 형식이 같다는 점에서 Array와 차이점을 보인다.
그 때문에 Vector를 사용하면 Array보다 더 빠른 퍼포먼스를 나타낸다.
코드상으로 Vector는 Array의 모든 함수를 가지고 있기 때문에 굉장히 사용하기 편할 것이다.
단, 처음 초기화 할 때는 약간 다르게 해야한다.
Array를 초기화 할 때는 다음과 같이 했다..

var a:Array = new Array();
//or
var b:Array = [];


하지만 Vector를 초기화 할 때는 다음과 같이 형식을 지정해줘야 한다.

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

Array와 마찬가지로 생성자에 특정 값을 넘겨 크기를 결정할 수도 있다.

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


그러나 Array와 다르게 생성자에 또 하나의 파라미터를 지원한다.
이 값은 Vector의 크기를 동적으로 할 지 정적으로 할지 결정 하는 것으로 Boolean 값이다.(디폴트 값은 false)
다음과 같이 fixed 프로퍼티를 통해서 생성후 에 변경할 수도 있다.

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

유의해야 할점은 fixed 프로퍼티가 true로 설정되면 length를 바꾸거나 pop(), push(), shift() 함수를
사용할 수 없다는 것이다.

Array는 다음과 같이 여러가지 타입을 섞어서 사용할 수 있지만

var s:String = "I am a string";
var d:Date = new Date();
var n:Number = 1138
var a:Array = new Array();
a[0] = s;
a[1] = d;
a[2] = n;

trace(a[1] is Date); //true

Vector의 경우 컴파일 에러가 날 것이다.

var s:String = "I am a string";
var d:Date = new Date();
var n:Number = 1138
var v:Vector.<String> = new Vector.<String>;
v[0] = s;
v[1] = d;
v[2] = n;

trace(v[1] is Date); //false

//Compile time errors:
//Implicit coercion of a value of type Date to an unrelated type String.
//Implicit coercion of a value of type Number to an unrelated type String.

마지막으로 꼭 알아두어야 할 점은 Vector의 모든 내부요소들은 빈공간이 없어야한다는 것이다.

예를들어, Array의 경우는 다음과 같은 코드를 작성할 수 있다.

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

그러나 Vector를 다음과 같이 사용하면 RangeError가 날 것이다.

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

처음에 Vector 크기를 생성자에 넘겨주면 동작한다.

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

아래의 예제는 Array와 Vector를 사용해서 100만번 루프를 돌았을 때 퍼포먼스 차이를 보여주고 있다.
단, 유의해야 할 점은 사용하는 형태에 따라서 서로의 퍼포먼스 차이는 달라질 수 있다는 것이다.

package
{
import flash.display.Sprite;

public class VectorTest extends Sprite
{
private static const NUM_LOOPS:int = 5;
public function VectorTest()
{

var vector:Vector.<int> = new Vector.<int>();
var array:Array = new Array();

//populate data
var rand:Number;
for(var i:int = 0; i < 1000000; i++)
{
rand = (Math.floor(Math.random() * 1000000) as int);
vector.push(rand);
array.push(rand);
}

var sTime:Number = getMilliseconds();
loopArray(array);
trace("Loop Array Avg (5) : " + ((getMilliseconds() - sTime)/NUM_LOOPS));

sTime = getMilliseconds();
loopVector(vector);
trace("Loop Vector Avg (5) : " + ((getMilliseconds() - sTime)/NUM_LOOPS));

}

private function getMilliseconds():Number
{
return (new Date()).getTime();
}

private function loopArray(a:Array):void
{
var len:Number = a.length;

var n:int;
for(var i:int = 0; i < NUM_LOOPS; i++)
{
for(var k:int = 0; k < len; k++)
{
n = a[k];
}
}
}

private function loopVector(v:Vector.<int>):void
{
var len:Number = v.length;

var n:int;
for(var i:int = 0; i < NUM_LOOPS; i++)
{
for(var k:int = 0; k < len; k++)
{
n = v[k];
}
}
}
}

}

필자의 컴퓨터에선 다음과 같은 결과가 나왔다.

Loop Array Avg (5) : 115.8
Loop Vector Avg (5) : 108.8


원문 : 마이크 챔버스 블로그





Trackback 0 Comment 2
  1. 지돌스타지돌스타 2008.08.26 16:17 address edit & del reply

    좋은 정보입니다. 그런데.... Div 레이어가 좌측으로 가리네요. ^^

    • 블루메탈 2008.08.28 16:29 신고 address edit & del

      그러게요 파폭에선 괜찮은데 익스에서 문제가 생기나봐요
      티스토리에 고쳐달라고 해야겠어요 ㅎㅎㅎ