AS3.0 Cookbook/배열2008. 7. 13. 18:09

String , int , Number...등의 원시(primitive)데이터는 변수를 복사하면 값이 복제가 된다.
var var01:String = "호랑이";
var var02:String = var01;
trace(var01)     // 출력 : 호랑이
trace(var02)     // 출력 : 호랑이

var02 = "원숭이";
trace(var01)    // 출력 : 호랑이
trace(var02)    // 출력 : 원숭이


이처럼 원본의 값을 이어받은 var02는 실제로 값이 복제되어 값에 변화가 있어도 원본과는 별도로 저장이 된다. 하지만 조합(composite)데이터 타입인 배열(정수색인 배열, 연관배열)은 데이터가 존재하는 메모리상의 주소만을 갖는다. 때문에 위에 코드처럼 선언하면 값이 참조가 된다. 이 참조된 값은 서로 연결되어 있으므로 한개의 값이 바뀌면 다른 참조 변수의 값도 바뀌게 된다. 하지만 AS3가 개선되고 부터는 복제를 할때 자동으로 concat()을 사용한 것 처럼 최상위 배열의 값이 복제가 된다.
var var01:Array = ["a" , "b" , "c"]
var var02:Array = var01;
(이 부분이 var var02:Array = var01.concat()과 같이 자동으로 최상위 배열은 복제를 하게 되었다.)
trace(var01)      // 출력 : a,b,c
trace(var02)      // 출력 : a,b,c
var01 = ["d" , "e" , "f"]
trace(var01)      // 출력 : d,e,f
trace(var02)      // 출력 : a,b,c


* concat() 은 매트릭스나 배열이나 문자열...등을 연결(연관)시키때 사용한다.

하지만 최상위 배열에 포함한 배열은 아직까지는 참조 값으로 저장한다.
var var01:Array = [];
var01.push(["a" , "b" , "c"])
var01.push(["1" , "2" , "3"])  
var var02:Array = var01 or var01.concat();
trace("var01 : " , var01);       //출력 : var01 :  a,b,c,1,2,3
trace("var02 : " , var02);      // 출력 : var02 :  a,b,c,1,2,3
var01[0][0] = ["d" , "e" , "f"];  
trace("var01 : " , var01);     // 출력 : var01 :  d,e,f,b,c,1,2,3
trace("var02 : " , var02);    
// 출력 : var01 :  d,e,f,b,c,1,2,3

이처럼 2차배열 보다 더 복잡한 배열의 구조안에서는 최상위 배열은 복제가 이루어 져도 그 하위 배열은 값을 참조하므로 한개의 값이 바뀌면 다른 배열들에도 영향을 미치게 된다.

Posted by 버터백통