Mike Chambers
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 = 11384: 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 = 11383: 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
중요한건 아주 간단하게(값을 참조만함) 테스트 했다는것이다.




덧글