IT_Programming/JavaScript

자바스크립트 완벽가이드 - 7.5 배열

JJun ™ 2010. 7. 4. 21:25


배열은 순서 있는 값들의 집합이다. 배열 안의 각 값을 원소라 부르며 각 원소는 배열 안에서 그 위치를

가리키는 번호를 할당 받는데 이 번호를 인덱스(index)라고 한다. 자바스크립트는 타입이 고정되지 않은 언어(untyped language)기 때문에 같은 배열의 각 원소는 서로 다른 타입을 가질 수 있다. 또한 배열은 다른 배열을 원소로 가질 수도 있기 때문에, 배열의 배열과 같은 자료구조를 생성할 수 있다.


이 책에서는 종종 객체와 배열을 서로 다른 데이터 타입인 것처럼 다룬다. 대부분의 자바스크립트 프로그램에서는 객체와 배열을 분리된 데이터 타입으로 간주할 수 있기 때문에, 이와 같이 객체와 배열을 구별하여 취급하는 것은 유용하기도 하고, 한편으로는 합리적인 단순화라 할 수 있다.

 

그러나 객체와 배열의 동작 원리를 완벽하게 이해하기 위해서는 진실을 알아야만 한다. 배열은 추가 기능을 아주 조금 지닌 객체에 지나지 않는다. 이러한 사실은 typeof 연산자를 사용하여 확인할 수 있는데, 배열 값이 이 연산자를 사용하면 "object" 라는 문자열을 반환한다.


배열 리터럴을 사용하면 가장 쉽게 배열을 생성할 수 있다.

배열 리터럴은 대괄호([]) 안에 배열의 원소들을 콤마로 구분한 목록이다. 예를 들면 다음과 같다.

var empty = [];                        // 빈 배열
var primes = [2, 3, 5, 7, 11];      // 5객 숫자 값들로 이루어진 배열
var mics = [1.1, true, "a", ];       // 서로 다른 타입을 가진 3개의 원소로 구성된 배열

배열 리터럴에는 상수뿐만 아니라 임의의 표현식도 사용할 수 있다.
var base = 1024;
var table = [base, base+1, base+2, base+3];

배열 리터럴은 객체 리터럴이나 또 다른 배열 리터럴을 포함할 수 있다.
var b = [[1, {x:1, y:2}, [2, {x:3, y:4}]];


배열 리터럴의 첫 번째 값은 새롭게 생성된 배열의 0번 인덱스에 저장되며, 두 번째 값부터는 배열의 1번

인덱스부터 차례대로 저장된다. 배열 리터럴의 콤마 사이에 아무것도 적지 않으면 정의되지 않은 원소가

생성된다.

var count = [1, , 3];  // 이 배열의 원소는 세 개다. 가운데 원소는 정의되지 않았다.
var undefs = [, ,];    // 이 배열의 원소는 두 개다. 두 원소가 모두 정의되지 않았다.


배열을 생성하는 또 다른 방법은 Array() 생성자를 사용하는 것이다.

이 생상자는 세 가지 다른 방법으로 호출할 수 있다.

  • 전달인자 없이 호출하는 방법
    var a = new Array();
    이 경우에는 배열 리터럴[] 같이 아무 원소도 없는 빈 배열을 생성한다.
  • 명시적으로 배열의 처음 n개의 아무 원소도 없는 빈 배열을 생성한다.
    var a = new Array(5, 4, 3, 2, 1, "testing, testing");
    이 경우에 생성자는 전달인자의 목록을 받는다. 각 전달인자는 임의의 타입일 수 있으며 배열의 각 원소를 규정한다. 각 원소는 배열의 0번 인덱스부터 차례대로 할당되며, 배열의 length 프로퍼티의 값은 생성자가 받은 전달인자들의 수로 설정된다. 이렇게 Array() 생성자를 사용하는 것보다는 배열 리터럴을 사용하는 것이 언제나 더 단순하고 수월하다.
  • 배열의 길이를 지정하는 숫자 값을 전달인자로 하여 호출하는 방법
    var a = new Array(10);
    이 경우에는 생성자의 전달인자로 지정된 수치만큼 원소를 갖는 배열을 생성한다. 이때, 각 원소의 값은 undefined이면 length 프로퍼티의 값은 생성자의 전달인자에 명시된 수치이다. 이 방법은 배열에 저장될 원소들의 개수를 미리 알 수 있을 때에 한아여, 배열 크기를 미리 할당할 때 사용된다. 이때 배열 리터럴은 사용하기 적합하지 않다.