배열 예제: PlayList

Flash Player 9 이상, Adobe AIR 1.0 이상

PlayList 예제는 노래 목록을 관리하는 음악 재생 목록 응용 프로그램에서 배열을 사용한 작업에 관련된 기술에 대해 설명합니다. 이러한 기술은 다음과 같습니다.

  • 인덱스 배열 만들기

  • 인덱스 배열에 항목 추가

  • 다른 정렬 옵션을 사용하여 다른 속성별로 객체 배열 정렬

  • 문자 구분 문자열로 배열 변환

이 샘플에 대한 응용 프로그램 파일을 가져오려면 www.adobe.com/go/learn_programmingAS3samples_flash_kr를 참조하십시오. PlayList 응용 프로그램 파일은 Samples/PlayList 폴더에 있습니다. 이 응용 프로그램은 다음과 같은 파일로 구성됩니다.

File

설명

PlayList.mxml

또는

PlayList.fla

Flash(FLA) 또는 Flex(MXML) 형식의 기본 응용 프로그램 파일입니다.

com/example/programmingas3/playlist/PlayList.as

노래 목록을 나타내는 클래스입니다. Array를 사용하여 목록을 저장하고 목록 항목의 정렬을 관리합니다.

com/example/programmingas3/playlist/Song.as

노래 한 곡에 대한 정보를 나타내는 값 객체. PlayList 클래스에서 관리되는 항목은 Song 인스턴스입니다.

com/example/programmingas3/playlist/SortProperty.as

Song 객체 목록을 정렬할 수 있는 Song 클래스 속성을 나타내는 사용 가능한 값의 의사 열거 항목입니다.

PlayList 클래스 개요

PlayList 클래스는 Song 객체 세트를 관리하며, 재생 목록에 노래를 추가(addSong() 메서드)하고 목록에서 노래를 정렬(sortList() 메서드)할 수 있는 기능을 제공하는 공용 메서드를 가지고 있습니다. 또한 이 클래스에는 읽기 전용 접근자 속성인 songList가 포함되며, 이 속성을 통해 재생 목록에 있는 노래 세트에 실제로 액세스할 수 있습니다. 내부적으로 PlayList 클래스는 전용 Array 변수를 사용하여 노래를 추적합니다.

public class PlayList 
{ 
    private var _songs:Array; 
    private var _currentSort:SortProperty = null; 
    private var _needToSort:Boolean = false; 
    ... 
}

노래 목록을 추적하기 위해 PlayList 클래스에서 사용되는 _songs Array 변수 외에도 두 개의 다른 전용 변수를 통해 목록을 정렬해야 하는지 여부(_needToSort) 및 지정된 시간에 정렬해야 하는 노래 목록의 속성(_currentSort)을 추적할 수 있습니다.

다른 객체와 마찬가지로 Array 인스턴스를 선언하는 것은 Array를 만드는 작업에서 반 정도를 완료한 것이며, Array 인스턴스의 속성이나 메서드에 액세스하려면 먼저 PlayList 클래스의 생성자에서 이를 인스턴스화해야 합니다.

    public function PlayList() 
    { 
        this._songs = new Array(); 
        // Set the initial sorting. 
        this.sortList(SortProperty.TITLE); 
    }

생성자의 첫 번째 행에서 _songs 변수를 인스턴스화하면 사용 준비가 완료됩니다. 또한 초기 정렬 기준 속성을 설정할 수 있는 sortList() 메서드가 호출됩니다.

목록에 노래 추가

사용자가 응용 프로그램에 새로운 노래를 넣으면 데이터 입력 양식의 코드가 PlayList 클래스의 addSong() 메서드를 호출합니다.

    /** 
     * Adds a song to the playlist. 
     */ 
    public function addSong(song:Song):void 
    { 
        this._songs.push(song); 
        this._needToSort = true; 
    }

addSong() 내에서 _songs 배열의 push() 메서드가 호출되어 addSong()에 전달된 Song 객체가 해당 배열의 새 요소로 추가됩니다. push() 메서드를 사용하면 이전에 적용된 정렬에 관계없이 새 요소가 배열의 끝에 추가됩니다. 즉, push() 메서드가 호출된 후에는 노래 목록이 제대로 정렬되어 있지 않게 되므로 _needToSort 변수가 true로 설정됩니다. 이론적으로는 목록이 지정된 시간에 정렬되었는지 여부를 추적할 필요 없이 sortList() 메서드를 바로 호출할 수 있습니다. 하지만 실제로는 노래 목록을 검색하기 바로 전까지는 노래 목록을 정렬할 필요가 없습니다. 이렇게 정렬 작업을 지연하면, 노래를 검색하기 전에 여러 노래가 목록에 추가되는 경우 등 응용 프로그램에서 불필요한 정렬을 수행하지 않아도 됩니다.

노래 목록 정렬

재생 목록에서 관리되는 Song 인스턴스는 복잡한 객체이므로, 응용 프로그램 사용자가 재생 목록을 노래 제목이나 발표 연도와 같은 다른 속성에 따라 정렬하고 싶어할 수 있습니다. PlayList 응용 프로그램에서 노래 목록을 정렬하는 작업은 세 가지 부분으로 나눌 수 있습니다. 첫 번째는 목록을 정렬해야 하는 속성을 식별하는 것이며 두 번째는 해당 속성별로 정렬할 때 사용해야 하는 정렬 옵션을 지정하는 것이며 세 번째는 실제로 정렬 작업을 수행하는 것입니다.

정렬 속성

Song 객체는 노래 제목, 아티스트, 발표 연도, 파일 이름 및 사용자가 선택한 노래 장르 등을 비롯한 여러 속성을 추적합니다. 이 중, 처음 세 가지만 정렬에 사용할 수 있습니다. 개발자의 편의에 따라 이 예제에는 정렬 시 사용 가능한 속성을 나타내는 값이 나열된 SortProperty 클래스가 포함됩니다.

    public static const TITLE:SortProperty = new SortProperty("title"); 
    public static const ARTIST:SortProperty = new SortProperty("artist"); 
    public static const YEAR:SortProperty = new SortProperty("year");

SortProperty 클래스에는 세 가지 상수 즉, TITLE, ARTISTYEAR가 포함되어 있으며, 이러한 상수는 각각 정렬 시 사용할 수 있는 연관된 Song 클래스 속성의 실제 이름이 포함된 문자열을 저장합니다. 나머지 코드에서 정렬 속성이 지정될 때마다 이 열거 항목을 사용하여 정렬이 수행됩니다. 예를 들어 PlayList 생성자에서 목록은 초기에는 다음과 같이 sortList() 메서드를 호출하여 정렬됩니다.

        // Set the initial sorting. 
        this.sortList(SortProperty.TITLE);

정렬 속성이 SortProperty.TITLE로 지정되므로 노래가 제목에 따라 정렬됩니다.

속성순 정렬 및 정렬 옵션 지정

노래 목록을 실제로 정렬하는 작업은 다음과 같이 sortList() 메서드의 PlayList 클래스에 의해 수행됩니다.

    /** 
     * Sorts the list of songs according to the specified property. 
     */ 
    public function sortList(sortProperty:SortProperty):void 
    { 
        ... 
        var sortOptions:uint; 
        switch (sortProperty) 
        { 
            case SortProperty.TITLE: 
                sortOptions = Array.CASEINSENSITIVE; 
                break; 
            case SortProperty.ARTIST: 
                sortOptions = Array.CASEINSENSITIVE; 
                break; 
            case SortProperty.YEAR: 
                sortOptions = Array.NUMERIC; 
                break; 
        } 
         
        // Perform the actual sorting of the data. 
        this._songs.sortOn(sortProperty.propertyName, sortOptions); 
             
        // Save the current sort property. 
        this._currentSort = sortProperty; 
 
        // Record that the list is sorted. 
        this._needToSort = false; 
    }

제목이나 아티스트순으로 정렬할 경우 알파벳순으로 정렬하는 것이 좋은 방법이지만 연도순으로 정렬할 경우에는 숫자 정렬이 가장 적합합니다. switch 문은 적합한 정렬 옵션을 정의하는 데 사용되며 sortProperty 매개 변수에 지정된 값에 따라 sortOptions 변수에 저장됩니다. 여기서 다시 하드 코딩된 값이 아닌 지정된 열거 항목이 속성을 구별하는 데 사용됩니다.

결정된 정렬 속성 및 정렬 옵션을 사용하여 sortOn() 메서드를 호출하고 매개 변수로 두 개의 값을 전달하면 _songs 배열이 실제로 정렬됩니다. 그러면 현재 정렬된 노래 목록에 따라 현재 정렬 속성이 기록됩니다.

문자 구분 문자열로 배열 요소 결합

PlayList 클래스의 노래 목록을 관리하기 위해 배열이 사용되는 것 이외에도 이 예제에서는 지정된 노래가 속한 장르 목록을 관리하기 위해 Song 클래스에서도 배열이 사용됩니다. Song 클래스 정의에서 다음 코드를 살펴보십시오.

private var _genres:String; 
 
public function Song(title:String, artist:String, year:uint, filename:String, genres:Array) 
{ 
    ... 
    // Genres are passed in as an array 
    // but stored as a semicolon-separated string. 
    this._genres = genres.join(";"); 
}

새로운 Song 인스턴스를 만들 때 노래가 속한 장르를 지정하는 데 사용되는 genres 매개 변수는 Array 인스턴스로 정의됩니다. 이렇게 하면 여러 장르를 생성자로 전달할 수 있는 하나의 변수로 묶을 때 편리합니다. 하지만 내부적으로 Song 클래스는 전용 _genres 변수에서 장르를 세미콜론으로 구분된 String 인스턴스로 관리합니다. Array 매개 변수는 리터럴 문자열 값 ";"을 지정된 구분 기호로 하여 join() 메서드를 호출함으로써 세미콜론으로 구분된 문자열로 변환됩니다.

마찬가지로, genres 접근자를 통해 장르를 Array로 설정하거나 검색할 수 있습니다.

    public function get genres():Array 
    { 
        // Genres are stored as a semicolon-separated String, 
        // so they need to be transformed into an Array to pass them back out. 
        return this._genres.split(";"); 
    } 
    public function set genres(value:Array):void 
    { 
        // Genres are passed in as an array, 
        // but stored as a semicolon-separated string. 
        this._genres = value.join(";"); 
    }

genresset 접근자는 생성자와 정확히 동일하게 동작합니다. 즉, Array를 허용하며 join() 메서드를 호출하여 이것을 세미콜론으로 구분된 문자열로 변환합니다. 반면 get 접근자는 이와 반대의 작업을 수행합니다. 즉 _genres 변수의 split() 메서드를 호출하여 지정된 구분 기호(앞서 언급한 리터럴 문자열 값인 ";")를 사용하여 String을 값의 배열로 분할합니다.