인덱스 배열

Flash Player 9 이상, Adobe AIR 1.0 이상

인덱스 배열은 일련의 하나 이상 값을 부호 없는 정수 값을 사용하여 각 값에 액세스할 수 있도록 구성하여 저장합니다. 첫 번째 인덱스는 항상 숫자 0이며 배열에 요소를 추가할 때마다 인덱스가 1씩 증가합니다. ActionScript 3.0에서는 Array 클래스와 Vector 클래스가 인덱스 배열로 사용됩니다.

인덱스 배열은 인덱스 번호에 부호 없는 32비트 정수를 사용합니다. 인덱스 배열의 최대 크기는 2 32 - 1 또는 4,294,967,295입니다. 배열의 크기가 최대 크기를 초과할 경우 런타임 오류가 발생합니다.

인덱스 배열의 개별 요소에 액세스하려면 배열 액세스( [] ) 연산자를 사용하여 액세스하려는 요소의 인덱스 위치를 지정합니다. 예를 들어 다음 코드는 songTitles 라는 인덱스 배열 내의 첫 번째 요소(인덱스 0에 있는 요소)를 나타냅니다.

songTitles[0]

배열 변수 이름 다음에 대괄호로 묶은 인덱스를 지정하여 단일 식별자로 사용할 수 있습니다. 즉, 변수 이름을 사용할 수 있는 어떤 방법에나 이 식별자를 사용할 수 있습니다. 대입문의 왼쪽에 이름과 인덱스를 사용하여 인덱스 배열 요소에 값을 할당할 수 있습니다.

songTitles[1] = "Symphony No. 5 in D minor";

마찬가지로, 대입문의 오른쪽에 이름과 인덱스를 사용하여 인덱스 배열 요소의 값을 가져올 수 있습니다.

var nextSong:String = songTitles[2];

명시적 값을 지정하는 대신 변수를 대괄호로 묶어 사용할 수도 있습니다. 이때 변수에는 uint, positive int 또는 positive integer Number 인스턴스와 같이 음수가 아닌 정수 값이 들어 있어야 합니다. 이 방법은 일반적으로 인덱스 배열의 요소를 "반복"하여 일부 또는 모든 요소에 대해 작업을 수행하려는 경우에 사용됩니다. 다음 코드 샘플에서는 이 방법을 보여 줍니다. 이 코드에서는 루프를 사용하여 oddNumbers 라는 Array 객체의 각 값에 액세스합니다. 또한 trace() 문을 사용하여 각 값을 "oddNumber[ index ] = value " 형식으로 출력합니다.

var oddNumbers:Array = [1, 3, 5, 7, 9, 11]; 
var len:uint = oddNumbers.length; 
for (var i:uint = 0; i < len; i++) 
{ 
    trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString()); 
}

Array 클래스

인덱스 배열의 첫 번째 유형은 Array 클래스입니다. Array 인스턴스에는 모든 유형의 데이터 값을 저장할 수 있습니다. 동일한 Array 객체에 데이터 유형이 서로 다른 객체를 저장할 수도 있습니다. 예를 들어 단일 Array 인스턴스의 인덱스 0, 인덱스 1 및 인덱스 2에 String 값, Number 인스턴스 및 XML 객체를 각각 저장할 수 있습니다.

Vector 클래스

ActionScript 3.0에서 사용할 수 있는 또 다른 종류의 인덱스 배열로는 Vector 클래스가 있습니다. Vector 인스턴스는 유형 배열 입니다. 즉, Vector 인스턴스의 모든 요소는 데이터 유형이 항상 동일합니다.

참고: Vector 클래스는 Flash Player 10 및 Adobe AIR 1.5부터 사용할 수 있습니다.

Vector 변수를 선언하거나 Vector 객체를 인스턴스화할 때는 Vector에 포함할 수 있는 객체의 데이터 유형을 명시적으로 지정합니다. 지정된 데이터 유형을 Vector의 기본 유형 이라고 합니다. 런타임과 컴파일 타임(엄격 모드)에는 Vector 요소를 설정하거나 Vector에서 값을 가져오는 모든 코드가 검사됩니다. 추가하거나 가져오는 객체의 데이터 유형이 Vector의 기본 유형과 일치하지 않으면 오류가 발생합니다.

Vector 클래스에는 데이터 유형 제한뿐만 아니라 Array 클래스의 경우와 다른 몇 가지 제한이 더 있습니다.

  • Vector는 밀착형 배열입니다. Array 객체의 경우 인덱스 1부터 6까지의 위치에는 값이 없더라도 인덱스 0 및 7에는 값이 있을 수 있습니다. 그러나 Vector의 경우에는 각 인덱스에 값 또는 null 이 있어야 합니다.

  • Vector는 고정 길이일 수도 있습니다. 고정 길이란 Vector에 포함되는 요소 수를 변경할 수 없음을 의미합니다.

  • Vector의 요소에 액세스할 때는 경계가 검사됩니다. 마지막 요소( length -1 )보다 큰 인덱스에서는 값을 읽을 수 없습니다. 또한 현재 마지막 인덱스보다 2 이상 큰 인덱스에는 값을 설정할 수 없습니다. 즉, 기존 인덱스나 [length] 값과 같은 인덱스에만 값을 설정할 수 있습니다.

이러한 제한 사항으로 인해 Vector에는 모든 요소가 단일 클래스의 인스턴스인 Array 인스턴스보다 세 가지 우수한 점이 있습니다.

  • 성능: Vector 인스턴스를 사용하면 Array 인스턴스를 사용할 때보다 배열 요소의 액세스 및 반복 속도가 훨씬 빠릅니다.

  • 안전한 유형: 엄격 모드에서 컴파일러가 데이터 유형 오류를 식별할 수 있습니다. 예를 들어 Vector에 잘못된 데이터 유형의 값을 할당하거나 Vector에서 값을 읽을 때 잘못된 데이터 유형을 사용하는 경우가 이러한 오류에 포함됩니다. 런타임에 Vector 객체에 값을 추가하거나 Vector 객체에서 값을 읽을 때도 데이터 유형이 검사됩니다. 그러나 push() 메서드나 unshift() 메서드를 사용하여 Vector에 값을 추가할 때는 인수의 데이터 유형이 컴파일 타임에 검사되지 않습니다. 이러한 메서드를 사용할 때도 값은 런타임에 검사됩니다.

  • 안정성: 런타임 범위 검사(또는 고정 길이 검사)로 Array에 비해 안정성이 크게 향상됩니다.

추가적인 제한 사항과 장점을 제외하면 Vector 클래스는 Array 클래스와 매우 유사합니다. Vector 객체의 속성 및 메서드는 Array의 속성 및 메서드와 비슷하며 대부분은 동일합니다. 사용하는 Array의 모든 요소가 같은 데이터 유형인 대부분의 경우 Vector 인스턴스를 사용하는 것이 좋습니다.

배열 만들기

Array 인스턴스나 Vector 인스턴스를 만드는 방법에는 몇 가지가 있습니다. 그러나 각 배열 종류를 만드는 방법은 약간 다릅니다.

Array 인스턴스 만들기

Array 객체를 만들려면 Array() 생성자를 호출하거나 Array 리터럴 구문을 사용합니다.

Array() 생성자 함수는 세 가지 방법으로 사용할 수 있습니다. 첫 번째, 인수 없이 생성자를 호출할 경우 빈 배열을 얻습니다. Array 클래스의 length 속성을 사용하여 배열에 요소가 없는지 확인할 수 있습니다. 예를 들어 다음 코드는 인수 없이 Array() 생성자를 호출합니다.

var names:Array = new Array(); 
trace(names.length); // output: 0

두 번째, Array() 생성자에 대한 유일한 매개 변수로 숫자를 사용할 경우 이 숫자에 해당하는 길이의 배열이 만들어지고 각 요소의 값은 undefined 로 설정됩니다. 인수는 0과 4,294,967,295 사이의 부호 없는 정수여야 합니다. 예를 들어 다음 코드는 단일 숫자 인수로 Array() 생성자를 호출합니다.

var names:Array = new Array(3); 
trace(names.length); // output: 3 
trace(names[0]); // output: undefined 
trace(names[1]); // output: undefined 
trace(names[2]); // output: undefined

세 번째, 생성자를 호출하고 매개 변수로 요소 목록을 전달할 경우 각 매개 변수에 해당하는 요소로 배열이 만들어집니다. 다음 코드는 Array() 생성자에 세 가지 인수를 전달합니다.

var names:Array = new Array("John", "Jane", "David"); 
trace(names.length); // output: 3 
trace(names[0]); // output: John 
trace(names[1]); // output: Jane 
trace(names[2]); // output: David

Array 리터럴을 사용하여 배열을 만들 수도 있습니다. Array 리터럴은 다음 예제와 같이 배열 변수에 직접 할당할 수 있습니다.

var names:Array = ["John", "Jane", "David"];

Vector 인스턴스 만들기

Vector 인스턴스를 만들려면 Vector.<T>() 생성자를 호출합니다. Vector.<T>() 전역 함수를 호출하여 Vector를 만들 수도 있습니다. 이 함수는 지정된 객체를 Vector 인스턴스로 변환합니다. Flash Professional CS5 이상, Flash Builder 4 이상, Flex 4 이상의 경우 Vector 리터럴 구문을 사용하여 벡터 인스턴스를 만들 수도 있습니다.

Vector 변수를 선언할 때나 Vector 메서드 매개 변수 또는 메서드 반환 유형을 선언할 때는 항상 Vector 변수의 기본 유형을 지정해야 합니다. Vector.<T>() 생성자를 호출하여 Vector 인스턴스를 만들 때 기본 유형을 지정할 수도 있습니다. 바꾸어 말하면 ActionScript에서 Vector 라는 용어를 사용할 때는 항상 기본 유형을 지정해야 합니다.

type 매개 변수 구문을 사용하여 Vector의 기본 유형을 지정할 수 있습니다. type 매개 변수는 코드에서 Vector 라는 단어의 바로 뒤에 옵니다. 이 매개 변수는 다음 예제와 같이 점( . )과 각괄호( <> )로 묶인 기본 클래스 이름으로 구성됩니다.

var v:Vector.<String>; 
v = new Vector.<String>();

예제의 첫 번째 행에서는 변수 v Vector.<String> 인스턴스로 선언합니다. 즉, 이 변수는 String 인스턴스만 포함할 수 있는 인덱스 배열을 나타냅니다. 두 번째 행에서는 Vector() 생성자를 사용하여 동일한 Vector 유형의 인스턴스, 즉 모든 요소가 String 객체인 Vector를 만듭니다. 이 행에서는 해당 객체를 v 에 할당합니다.

Vector.<T>() 생성자 사용

Vector.<T>() 생성자를 인수 없이 사용하면 빈 Vector 인스턴스가 만들어집니다. Vector의 length 속성을 검사하면 Vector가 비어 있는지 테스트할 수 있습니다. 예를 들어 다음 코드에서는 Vector.<T>() 생성자를 인수 없이 사용합니다.

var names:Vector.<String> = new Vector.<String>(); 
trace(names.length); // output: 0

Vector에 필요한 초기 요소 수를 미리 알고 있으면 Vector의 요소 수를 미리 정의할 수 있습니다. 일정 개수의 요소가 있는 Vector를 만들려면 요소 수를 첫 번째 매개 변수( length 매개 변수)로 전달합니다. Vector 요소는 비어 있을 수 없으므로 기본 유형의 인스턴스로 채워집니다. 기본 유형이 null 값을 허용하는 참조 유형일 경우 모든 요소에는 null 이 포함됩니다. 그렇지 않은 경우에는 모든 요소에 해당 클래스의 기본값이 포함됩니다. 예를 들어 uint 변수는 null 일 수 없으므로 다음 코드 샘플에서 ages 라는 Vector는 각각 값 0이 들어 있는 7개의 요소를 사용하여 만들어집니다.

var ages:Vector.<uint> = new Vector.<uint>(7); 
trace(ages); // output: 0,0,0,0,0,0,0 

마지막으로, Vector.<T>() 생성자를 사용하면 두 번째 매개 변수( fixed 매개 변수)에 true 를 전달하여 고정 길이의 Vector를 만들 수도 있습니다. 이 경우 Vector는 지정된 개수의 요소를 사용하여 만들어지며 요소 수는 변경할 수 없습니다. 그러나 고정 길이 Vector의 요소 값은 변경할 수 있습니다.

Vector 리터럴 구문 생성자 사용

Flash Professional CS5 이상, Flash Builder 4 이상, Flex 4 이상의 경우 값 목록을 Vector.<T>() 생성자에 전달하여 Vector의 초기 값을 지정할 수 있습니다.

// var v:Vector.<T> = new <T>[E0, ..., En-1 ,]; 
// For example: 
var v:Vector.<int> = new <int>[0,1,2,];

이 구문에는 다음 정보가 적용됩니다.

  • 뒤에 오는 쉼표는 선택 사항입니다.

  • 배열에서 빈 항목은 지원되지 않습니다. 예를 들어 var v:Vector.<int> = new <int>[0,,2,] 와 같은 명령문은 컴파일 오류가 발생시킵니다.

  • Vector 인스턴스는 기본 길이를 지정할 수 없습니다. 대신, 초기화 목록의 요소 수와 동일하게 길이가 설정됩니다.

  • Vector 인스턴스는 고정 길이를 사용할지 여부를 지정할 수 없습니다. 대신, fixed 속성을 사용해야 합니다.

  • 값으로 전달된 항목이 지정된 유형과 일치하지 않으면 데이터 손실 또는 오류가 발생할 수 있습니다. 예를 들면 다음과 같습니다.
    var v:Vector.<int> = new <int>[4.2]; // compiler error when running in strict mode 
    trace(v[0]); //returns 4 when not running in strict mode

Vector.<T>() 전역 함수 사용

Vector.<T>() 및 Vector 리터럴 구문 생성자 외에, Vector.<T>() 전역 함수를 사용하여 Vector 객체를 만들 수도 있습니다. Vector.<T>() 전역 함수는 변환 함수입니다. Vector.<T>() 전역 함수를 호출할 때는 메서드에서 반환하는 Vector의 기본 유형을 지정해야 합니다. 단일 인덱스 배열(Array 또는 Vector 인스턴스)을 인수로 전달합니다. 그러면 메서드는 지정된 기본 유형을 사용하며 소스 배열 인수의 값이 들어 있는 Vector를 반환합니다. 다음 코드 샘플에서는 Vector.<T>() 전역 함수를 호출하기 위한 구문을 보여 줍니다.

var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);

Vector.<T>() 전역 함수는 두 수준에서 데이터 유형 변환을 수행합니다. 먼저, 함수에 Array 인스턴스가 전달될 때는 Vector 인스턴스가 반환됩니다. 두 번째로, 소스 배열이 Array 인스턴스이든 Vector 인스턴스이든 관계없이 이 함수는 소스 배열의 요소를 기본 유형의 값으로 변환하려고 합니다. 변환에는 표준 ActionScript 데이터 유형 변환 규칙이 사용됩니다. 예를 들어 다음 코드 샘플에서는 소스 Array의 문자열 값을 결과 Vector에서 정수로 변환합니다. 결과에서 첫 번째 값( "1.5" )의 소수 부분은 잘리고 숫자가 아닌 세 번째 값( "Waffles" )은 0으로 변환됩니다.

var numbers:Vector.<int> = Vector.<int>(["1.5", "17", "Waffles"]); 
trace(numbers); // output: 1,17,0

변환할 수 없는 소스 요소가 있으면 오류가 발생합니다.

코드에서 Vector.<T>() 전역 함수를 호출할 때 소스 배열의 요소가 지정된 기본 유형의 하위 클래스 인스턴스이면 해당 요소가 결과 Vector에 추가되고 오류는 발생하지 않습니다. Vector.<T>() 전역 함수를 사용하는 방법은 기본 유형이 T 인 Vector를 기본 유형이 T 의 수퍼 클래스인 Vector로 변환하는 유일한 방법입니다.

배열 요소 삽입

인덱스 배열에 요소를 추가하는 가장 기본적인 방법은 배열 액세스( [] ) 연산자를 사용하는 것입니다. 인덱스 배열 요소의 값을 설정하려면 대입문의 왼쪽에 Array 또는 Vector 객체 이름과 인덱스 번호를 사용합니다.

songTitles[5] = "Happy Birthday";

Array 또는 Vector의 해당 인덱스에 요소가 아직 없으면 해당 인덱스가 만들어지고 여기에 값이 저장됩니다. 해당 인덱스에 값이 있으면 새 값이 기존 값을 대체합니다.

Array 객체의 경우 어느 인덱스에나 요소를 만들 수 있습니다. 그러나 Vector 객체의 경우에는 기존 인덱스나 사용 가능한 다음 인덱스에만 값을 할당할 수 있습니다. 사용 가능한 다음 인덱스는 Vector 객체의 length 속성 값과 같습니다. Vector 객체에 새 요소를 추가하는 가장 안전한 방법은 다음 샘플과 같은 코드를 사용하는 것입니다.

myVector[myVector.length] = valueToAdd;

Array 및 Vector 클래스의 push() , unshift() splice() 메서드 세 가지를 사용하여 인덱스 배열에 요소를 삽입할 수 있습니다. push() 메서드는 배열 끝에 하나 이상의 요소를 추가합니다. 즉, push() 메서드를 사용하여 배열에 삽입된 마지막 요소는 최상위 인덱스 번호를 가지게 됩니다. unshift() 메서드는 배열 시작 부분에 하나 이상의 요소를 삽입하며 이 위치의 인덱스 번호는 항상 0입니다. splice() 메서드는 지정된 인덱스 위치의 모든 항목을 배열에 삽입합니다.

다음 예제는 이 세 가지 메서드를 모두 보여 줍니다. planets 배열은 태양에 가까운 순서로 행성의 이름을 저장하기 위해 만들어진 배열입니다. 먼저, push() 메서드가 첫 항목 Mars 를 추가하기 위해 호출됩니다. 그 다음, unshift() 메서드가 배열 맨 앞에 있어야 할 항목인 Mercury 를 삽입하기 위해 호출됩니다. 마지막으로, splice() 메서드가 Mercury 뒤 및 Mars 앞에 Venus Earth 항목을 삽입하기 위해 호출됩니다. splice() 에 전달된 첫 번째 인수인 정수 1은 인덱스 1에서 삽입을 시작하도록 지시합니다. splice() 로 전달된 두 번째 인수인 정수 0은 삭제해야 할 항목이 없음을 의미합니다. 마지막으로 splice() 에 전달된 세 번째 및 네 번째 인수인 Venus Earth 는 삽입할 항목입니다.

var planets:Array = new Array(); 
planets.push("Mars"); // array contents: Mars 
planets.unshift("Mercury"); // array contents: Mercury,Mars 
planets.splice(1, 0, "Venus", "Earth"); 
trace(planets); // array contents: Mercury,Venus,Earth,Mars

push() unshift() 메서드는 모두 수정된 배열의 길이를 나타내는 부호 없는 정수를 반환합니다. splice() 메서드는 요소를 삽입하기 위해 사용될 때 빈 배열을 반환합니다. 이상해 보이지만 splice() 메서드의 다양한 용도를 생각해 보면 이해할 수 있습니다. splice() 메서드를 사용하여 배열에 요소를 삽입할 수 있을 뿐만 아니라 배열에서 요소를 제거할 수도 있습니다. 요소를 제거하기 위해 사용할 경우 splice() 메서드는 제거된 요소를 포함하는 배열을 반환합니다.

참고: Vector 객체의 fixed 속성이 true 일 경우에는 Vector의 전체 요소 수를 변경할 수 없습니다. 여기에서 설명한 방법을 사용하여 고정 길이의 Vector에 새 요소를 추가하려고 하면 오류가 발생합니다.

값 가져오기 및 배열 요소 제거

인덱스 배열에서 요소 값을 가져오는 가장 간단한 방법은 배열 액세스( [] ) 연산자를 사용하는 것입니다. 인덱스 배열 요소의 값을 가져오려면 대입문의 오른쪽에 Array 또는 Vector 객체 이름과 인덱스 번호를 사용합니다.

var myFavoriteSong:String = songTitles[3];

요소가 없는 Array 또는 Vector에서는 값을 가져올 수 없습니다. 이 경우 Array 객체에서는 undefined 값이 반환되고 Vector 객체에서는 RangeError 예외가 발생합니다.

Array 및 Vector 클래스의 pop() , shift() splice() 메서드 세 가지를 사용하여 요소를 제거할 수 있습니다. pop() 메서드는 배열 끝에서 요소를 제거합니다. 즉, 인덱스 번호가 가장 높은 요소를 제거합니다. shift() 메서드는 배열 시작 부분에서 요소를 제거합니다. 즉, 항상 인덱스 번호 0의 위치에 있는 요소를 제거합니다. 요소를 삽입하는 데에도 사용할 수 있는 splice() 메서드는 이 메서드에 전달된 첫 번째 인수에 의해 지정된 인덱스 번호부터 시작하여 임의의 개수의 요소를 제거합니다.

다음 예제에서는 이 세 가지 메서드를 모두 사용하여 Array 인스턴스에서 요소를 제거합니다. oceans 라는 Array는 거대한 수역의 이름을 저장하기 위해 만들어진 배열입니다. Array의 일부 이름은 바다가 아닌 호수라서 제거해야 합니다.

먼저, splice() 메서드를 사용하여 Aral Superior 항목을 제거하고 Atlantic Indian 항목을 삽입합니다. splice() 에 전달된 첫 번째 인수인 정수 2는 인덱스 2 위치에 있는 목록의 세 번째 항목으로 작업을 시작해야 함을 나타냅니다. 두 번째 인수 2는 두 개의 항목이 제거되어야 함을 나타냅니다. 남은 인수인 Atlantic Indian 은 인덱스 2 위치에 삽입할 값입니다.

그 다음, pop() 메서드를 사용하여 배열에서 마지막 요소인 Huron 을 제거합니다. 세 번째로 shift() 메서드를 사용하여 배열의 첫 번째 항목인 Victoria 를 제거합니다.

var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"]; 
oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior 
oceans.pop(); // removes Huron 
oceans.shift(); // removes Victoria 
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian

pop() shift() 메서드는 모두 제거된 항목을 반환합니다. Array 인스턴스의 경우 배열에 모든 데이터 유형의 값을 저장할 수 있으므로 반환 값의 데이터 유형은 Object입니다. Vector 인스턴스의 경우 반환 값의 데이터 유형은 Vector의 기본 유형입니다. splice() 메서드는 제거된 값을 포함하는 Array 또는 Vector를 반환합니다. oceans Array 예제를 변경하여, 다음 예제와 같이 splice() 에 대한 호출에서 반환된 Array가 새 Array 변수에 할당되도록 할 수 있습니다.

var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic"); 
trace(lakes); // output: Aral,Superior

Array 객체 요소에 대해 delete 연산자를 사용하는 코드가 있을 수 있습니다. delete 연산자는 Array 요소 값을 undefined 로 설정하지만 Array에서 요소를 제거하지는 않습니다. 예를 들어 다음 코드에서는 oceans Array의 세 번째 요소에 대해 delete 연산자를 사용하지만 Array의 길이는 여전히 5입니다.

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"]; 
delete oceans[2]; 
trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic 
trace(oceans[2]); // output: undefined 
trace(oceans.length); // output: 5

배열의 length 속성을 사용하여 Array 또는 Vector를 자를 수 있습니다. 인덱스 배열의 length 속성을 배열의 현재 길이보다 작게 설정할 경우, 배열이 잘리고 새 length 값에서 1을 뺀 값보다 큰 인덱스 번호 위치에 저장된 모든 요소가 제거됩니다. 예를 들어 다음 코드와 같이 oceans 배열을 배열 시작 부분에 모든 유효 항목이 오도록 정렬한 경우 length 속성을 사용하여 배열 끝에 있는 항목을 제거할 수 있습니다.

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"]; 
oceans.length = 2; 
trace(oceans); // output: Arctic,Pacific
참고: Vector 객체의 fixed 속성이 true 일 경우에는 Vector의 전체 요소 수를 변경할 수 없습니다. 여기에서 설명한 방법을 사용하여 고정 길이의 Vector에서 요소를 제거하거나 해당 Vector를 자르려고 하면 오류가 발생합니다.

배열 정렬

reverse() , sort() sortOn() 메서드 세 가지를 사용하면 인덱스 배열을 정렬 또는 역정렬하여 순서를 변경할 수 있습니다. 이 세 가지 메서드는 모두 기존 배열을 수정합니다. 다음 표에는 이러한 메서드와 Array 및 Vector 객체에 대한 메서드 비헤이비어가 요약되어 있습니다.

메서드

Array 비헤이비어

Vector 비헤이비어

reverse()

마지막 요소가 첫 번째 요소가 되고 끝에서 두 번째 요소가 두 번째 요소가 되는 식으로 요소 순서를 변경합니다.

Array 비헤이비어와 동일합니다.

sort()

알파벳순이나 숫자순과 같이 미리 정의된 다양한 방법으로 Array의 요소를 정렬할 수 있습니다. 사용자 정의 정렬 알고리즘을 지정할 수도 있습니다.

사용자가 지정하는 사용자 정의 정렬 알고리즘에 따라 요소를 정렬합니다.

sortOn()

하나 이상의 공통 속성이 있는 객체를 정렬할 수 있습니다. 이때 정렬 키로 사용할 속성을 지정합니다.

Vector 클래스에서는 사용할 수 없습니다.

reverse() 메서드

reverse() 메서드는 매개 변수를 취하지 않으며 값을 반환하지도 않습니다. 다만 이 메서드를 사용하여 배열의 순서를 현재 상태에서 역순으로 전환할 수 있습니다. 다음 예제는 oceans 배열에 나열된 바다의 순서를 역순으로 전환합니다.

var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"]; 
oceans.reverse(); 
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic

sort() 메서드를 사용한 기본 정렬(Array 클래스만 해당)

Array 인스턴스의 경우 sort() 메서드는 기본 정렬 순서 를 사용하여 배열의 요소를 다시 정렬합니다. 기본 정렬 순서의 특징은 다음과 같습니다.

  • 대/소문자를 구분하며 대문자는 소문자보다 우선합니다. 예를 들어 글자 D가 글자 b보다 우선합니다.

  • 오름차순으로 낮은 문자 코드(예: A)가 높은 문자 코드(예: B)보다 우선합니다.

  • 동일한 값은 특정 순서 없이 인접하여 배치합니다.

  • 문자열 기반이므로, 요소를 비교하기 전에 문자열로 변환합니다. 예를 들어 문자열 "1" 이 문자열 "3" 보다 낮은 문자 코드를 가지므로 10이 3보다 먼저 오게 됩니다.

Array를 대/소문자 구분 없이 정렬하거나 내림차순으로 정렬하거나 숫자가 포함된 배열을 알파벳순이 아닌 숫자순으로 정렬해야 할 경우가 있습니다. Array 클래스의 sort() 메서드에는 기본 정렬 순서의 각 특성을 변경할 수 있는 options 매개 변수가 있습니다. 이 옵션은 다음 목록과 같이 Array 클래스의 정적 상수 세트로 정의됩니다.

  • Array.CASEINSENSITIVE : 이 옵션은 정렬 시 대/소문자가 무시되도록 합니다. 예를 들어 소문자 글자 b가 대문자 글자 D보다 우선합니다.

  • Array.DESCENDING: 이 옵션은 기본 오름차순 정렬을 역으로 설정합니다. 예를 들어 글자 B가 글자 A보다 우선합니다.

  • Array.UNIQUESORT: 이 옵션은 동일한 값이 두 개 있을 경우 정렬을 중단하도록 합니다.

  • Array.NUMERIC: 숫자순으로 정렬하는 옵션이므로 3이 10보다 먼저 오게 됩니다.

다음 예제는 이 옵션 중 일부를 보여 줍니다. poets 라는 Array가 만들어져 다양한 여러 옵션을 사용하여 정렬됩니다.

var poets:Array = ["Blake", "cummings", "Angelou", "Dante"]; 
poets.sort(); // default sort 
trace(poets); // output: Angelou,Blake,Dante,cummings 
 
poets.sort(Array.CASEINSENSITIVE); 
trace(poets); // output: Angelou,Blake,cummings,Dante 
 
poets.sort(Array.DESCENDING); 
trace(poets); // output: cummings,Dante,Blake,Angelou 
 
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options 
trace(poets); // output: Dante,cummings,Blake,Angelou

sort() 메서드를 사용한 사용자 정의 정렬(Array 및 Vector 클래스)

Array 객체에 사용할 수 있는 기본 정렬 외에 사용자 정의 정렬 규칙을 정의할 수도 있습니다. 이 방법은 Vector 클래스에 사용할 수 있는 유일한 형태의 sort() 메서드입니다. 사용자 정의 정렬을 정의하려면 사용자 정의 정렬 함수를 작성하여 sort() 메서드에 인수로 전달합니다.

예를 들어 각 목록 요소에 개인의 전체 이름이 포함된 이름 목록이 있는 경우, 이 목록을 성(姓)을 사용하여 정렬하려고 하면 사용자 정의 정렬 함수를 사용하여 각 요소를 파싱하고 정렬 함수에서 성을 사용해야 합니다. 다음 코드는 Array.sort() 메서드에 대해 사용자 정의 함수를 매개 변수로 사용하여 이 작업을 수행하는 방법을 보여 줍니다.

var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones"); 
function orderLastName(a, b):int 
{ 
    var lastName:RegExp = /\b\S+$/; 
    var name1 = a.match(lastName); 
    var name2 = b.match(lastName); 
    if (name1 < name2) 
    { 
        return -1; 
    } 
    else if (name1 > name2) 
    { 
        return 1; 
    } 
    else 
    { 
        return 0; 
    } 
} 
trace(names); // output: John Q. Smith,Jane Doe,Mike Jones 
names.sort(orderLastName); 
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith

사용자 정의 정렬 함수 orderLastName() 은 일반 표현식을 사용하여 각 요소에서 비교 작업에 사용할 성을 추출합니다. 함수 식별자 orderLastName names 배열에서 sort() 메서드를 호출할 때 유일한 매개 변수로 사용됩니다. 정렬 함수는 한 번에 두 개의 배열 요소로 작업하므로 두 개의 매개 변수 a b 를 취합니다. 정렬 함수의 반환 값은 요소가 정렬되는 방법을 나타냅니다.

  • 반환 값 -1은 첫 번째 매개 변수인 a 가 두 번째 매개 변수인 b 보다 우선함을 나타냅니다.

  • 반환 값 1은 두 번째 매개 변수인 b 가 첫 번째 매개 변수인 a 보다 우선함을 나타냅니다.

  • 반환 값 0은 요소의 정렬 우선 순위가 동일함을 나타냅니다.

sortOn() 메서드(Array 클래스만 해당)

sortOn() 메서드는 요소에 객체가 포함된 Array 객체를 위해 설계되었습니다. 이러한 객체에는 정렬 키로 사용할 수 있는 공통 속성이 최소한 하나는 있어야 합니다. 다른 유형의 배열에 sortOn() 메서드를 사용할 경우 예기치 못한 결과를 초래할 수 있습니다.

참고: Vector 클래스에는 sortOn() 메서드가 포함되어 있지 않습니다. 이 메서드는 Array 객체에만 사용할 수 있습니다.

다음 예제에서는 각 요소가 문자열이 아닌 객체가 되도록 poets Array를 수정합니다. 각 객체에는 시인의 성과 출생 연도가 포함되어 있습니다.

var poets:Array = new Array(); 
poets.push({name:"Angelou", born:"1928"}); 
poets.push({name:"Blake", born:"1757"}); 
poets.push({name:"cummings", born:"1894"}); 
poets.push({name:"Dante", born:"1265"}); 
poets.push({name:"Wang", born:"701"});

sortOn() 메서드를 사용하면 born 속성을 기준으로 배열을 정렬할 수 있습니다. sortOn() 메서드는 두 개의 매개 변수 fieldName options 를 정의합니다. fieldName 인수는 문자열로 지정해야 합니다. 다음 예제에서는 두 개의 인수 " born" Array.NUMERIC 으로 sortOn() 이 호출됩니다. Array.NUMERIC 인수는 알파벳순이 아닌 숫자순으로 정렬하려고 할 때 사용합니다. 이는 모든 숫자의 자릿수가 같은 경우에도 유용한 방법입니다. 나중에 이 배열에 자릿수가 많거나 적은 숫자를 추가하게 되더라도 예상한 대로 정렬이 수행될 수 있기 때문입니다.

poets.sortOn("born", Array.NUMERIC); 
for (var i:int = 0; i < poets.length; ++i) 
{ 
    trace(poets[i].name, poets[i].born); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

원래 배열을 수정하지 않는 정렬(Array 클래스만 해당)

일반적으로 sort() sortOn() 메서드는 Array를 수정합니다. 기존 배열을 수정하지 않고 Array를 정렬하려면 Array.RETURNINDEXEDARRAY 상수를 options 매개 변수의 일부로 전달합니다. 이렇게 하면 메서드는 정렬이 적용된 새 Array를 반환하고 원래의 Array은 수정하지 않은 채로 둡니다. 메서드에서 반환된 Array는 새 정렬 순서가 적용된 간단한 인덱스 번호의 Array이며 원래 Array의 요소는 전혀 포함하지 않습니다. 예를 들어 poets Array를 수정하지 않고 출생 연도순으로 정렬하려면 Array.RETURNINDEXEDARRAY 상수를 options 매개 변수에 전달되는 인수의 일부로 포함합니다.

다음 예제에서는 반환된 인덱스 정보를 indices 라는 Array에 저장하고, 이 indices 배열을 수정되지 않은 poets 배열과 함께 사용하여 출생 연도순으로 시인의 목록을 출력합니다.

var indices:Array; 
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY); 
for (var i:int = 0; i < indices.length; ++i) 
{ 
    var index:int = indices[i]; 
    trace(poets[index].name, poets[index].born); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

배열 쿼리

Array 및 Vector 클래스의 concat() , join() , slice() toString() 메서드 네 가지는 배열에서 정보를 쿼리하지만 배열을 수정하지는 않습니다. join() toString() 메서드가 모두 문자열을 반환하는 반면. concat() slice() 메서드는 모두 새 배열을 반환합니다. concat() 메서드는 인수로 요소 목록이나 새 배열을 취하며 이를 기존 배열과 결합하여 새 배열을 만듭니다. slice() 메서드에는 startIndex endIndex 라는 두 개의 매개 변수가 있으며 기존 배열에서 "분할"된 요소의 복사본이 포함된 새로운 배열을 반환합니다. 분할은 startIndex 위치의 요소에서 시작되어 endIndex 직전 위치에 있는 요소에서 종료됩니다. 즉, endIndex 위치의 요소는 반환 값에 포함되지 않습니다.

다음 예제에서는 다른 배열의 요소를 사용하여 새 배열을 만들기 위해 concat() slice() 를 사용합니다.

var array1:Array = ["alpha", "beta"]; 
var array2:Array = array1.concat("gamma", "delta"); 
trace(array2); // output: alpha,beta,gamma,delta 
 
var array3:Array = array1.concat(array2); 
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta 
 
var array4:Array = array3.slice(2,5); 
trace(array4); // output: alpha,beta,gamma

join() toString() 메서드를 사용하여 배열에 쿼리를 실행하고 그 내용을 문자열로 반환할 수 있습니다. join() 메서드에 매개 변수를 사용하지 않는 경우 두 메서드는 동일하게 동작합니다. 즉, 배열에 있는 모든 요소의 목록이 쉼표로 구분되어 포함된 문자열을 반환합니다. toString() 메서드와는 달리 join() 메서드는 delimiter 라는 매개 변수를 취하여, 반환된 문자열에서 각 요소 간을 분리하는 데 사용되는 구분 기호를 선택할 수 있습니다.

다음 예제에서는 rivers 라는 Array를 만들고 join() toString() 을 모두 호출하여 Array의 값을 문자열로 반환합니다. toString() 메서드는 쉼표로 구분된 값( riverCSV )을 반환하는 데 사용되는 반면, join() 메서드는 + 문자로 구분된 값을 반환하는 데 사용됩니다.

var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"]; 
var riverCSV:String = rivers.toString(); 
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi 
var riverPSV:String = rivers.join("+"); 
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi

단, 다음 예제와 같이 중첩된 Array 또는 Vector 인스턴스는 join() 메서드에서 항상 쉼표로 구분된 값으로 반환됩니다. 이때 기본 배열 요소에 지정한 분리 기호는 무시됩니다.

var nested:Array = ["b","c","d"]; 
var letters:Array = ["a",nested,"e"];  
var joined:String = letters.join("+"); 
trace(joined); // output: a+b,c,d+e