배열 예제: PlayListFlash Player 9 이상, Adobe AIR 1.0 이상 PlayList 예제는 노래 목록을 관리하는 음악 재생 목록 응용 프로그램에서 배열을 사용한 작업에 관련된 기술에 대해 설명합니다. 이러한 기술은 다음과 같습니다.
이 샘플에 대한 응용 프로그램 파일을 가져오려면 www.adobe.com/go/learn_programmingAS3samples_flash_kr를 참조하십시오. PlayList 응용 프로그램 파일은 Samples/PlayList 폴더에 있습니다. 이 응용 프로그램은 다음과 같은 파일로 구성됩니다.
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, ARTIST 및 YEAR가 포함되어 있으며, 이러한 상수는 각각 정렬 시 사용할 수 있는 연관된 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을 값의 배열로 분할합니다. |
|