일반정의 배열 : 배열하다 --> 나열하다 ---> 줄세우기 ::: 개수가 많을 경우, 쉽게 컨트롤 하기 위해 사용한다.
배열의 각 성분 --> 원소 :: 원소의 구분은 컴마
오늘 알아야 할 핵심문법
trace(arr.length); 배열의 길이
trace(arr.join()); 각 원소를 연결하여 하나의 문자열로 만들기
trace(arr.join("-")); 각 원소를 "구분자"로 연결하여 하나의 문자열로 만들기
arr[4]="코끼리"; 배열 추가하기
arr.push("당나귀"); 배열 마지막에 배열 추가하기
var arr2:Array=str.split("-"); "구분자"로 문자열을 분리하여 배열로 만들기
package
{
import flash.display.Sprite;
[ SWF ( width="550", height="400", frameRate="36", backgroundColor="0xEEEEEE" ) ]
public class ArrayTest1 extends Sprite
{
public function ArrayTest1()
{
super();
// var arr: Array = new Array();
var arr: Array = [ 20, 5, 17, 3 ]; // 2번 선호...!!
trace( arr[ 2 ] ); // 2번째 { 시작은 0부터 }
trace( arr.length ); //length하면 원소의 개수가 나온다.
// join() 연결하다 :: 배열의 각 원소를 연결해서 문자열로 만드는 함수
trace( arr.join() );
trace( arr.join( "-" ) ); // "20-5-17-3"//괄호에 구분자를 넣어주면 구분자로 문자가 연결된다.
// 원소 추가
arr[ 4 ] = "코끼리";
trace( arr.join() );
arr.push( "당나귀" ); // 맨 마지막에 원소 추가
trace( arr.join() );
var str: String = "강아지-호랑이-망아지-짱구"; // 문자열의 split( "구분자" ) 함수는 문자열을 분리해서, 배열로 만드는 함수
var arr2: Array = str.split( "-" );
trace( arr2[ 1 ] );
//var param:String="a=20|#|b=30|#|c=40|#|&d=우리&나라"; //본 내용에 &가 포함되어 본문과 "구분자"가 구분이 안되면 |#|와 같이 흔히 쓰지 않는 문자합을 이용하여 구분한다.
var param: String = "a=20|#|b=30|#|c=40|#|d=우#리&나||라";
// (예제)변수를 모두 표시하시오 // (예제)값을 모두 표시하시오
var arr4: Array = param.split( "|#|" );
for( var i: int=0; i<arr4.length; i++ )
{
var temp: Array = arr4[ i ].split( "=" );
trace( "변수 = ", temp[ 0 ], " 값 = ", temp[ 1 ] );
}
}
} // class
} // package
17
4
20,5,17,3
20-5-17-3
20,5,17,3,코끼리
20,5,17,3,코끼리,당나귀
호랑이
2233
2007/12/22
10:22:39
12
10
2007-12-22 10:22:39
변수 = a 값 = 20
변수 = b 값 = 30
변수 = c 값 = 40
변수 = d 값 = 우#리&나||라
[SWF] Users:hyemisong:Documents:Flex Builder 3:Middle2009_01_Main:bin-debug:ArrayTest1.swf - 1,919 bytes after decompression
===========================
var tf: MyTextField = new MyTextField();
tf.finalString = "superman !!!";
tf.startMove();
문자열 VS 배열 ::: CookBook
1. 문자열 : indexOf(),
2. 배열 : reverse(), indexOf(), splice()
3. 타이포 효과 만들기 ::: 10번 작성해서 외우기
4. XML
5. URLLoader 클래스
- urlLoader.data로 데이터 접근
- Event.COMPLETE 이벤트로 데이터 로딩 체크
- URLRequest()를 통해서 파일 접근
- try catch를 통한 동기식 예외처리
- IOErrorEvent를 통한 비동기식 예외처리
핵심원리
1. start type(임의의 시작문자)과 final type(최종적으로 보여주고자 하는 문자열)을 지정한다. ( 우리는 "-"와 "superman"로 합니다.)
2. superman의 각 문자를 배열을 이용하여 저장한다.
3."--------" =>"superman" (목적-->종착 ) 두 문자를 유니코드로 변경한다. 3. 각 문자에 순차적으로 deley를 주어 단계적으로 변환하도록 한다.
(0번째 배열의 이동시작 x초 후 1번째 배열 이동시작 ) 즉 ("-"=>"s", "-"=>"u","-"=>"p" 의 이동이 x초 간격으로 일어난다.)
4. 유니코드를 다시 문자열로 변화해서 화면에 표시
** 하단의 debugging 결과를 보면 순차적으로 코드이동이 있음을 확인 할 수 있다.
[ SWF ( width="550", height="400", frameRate="36", backgroundColor="0xEEEEEE" ) ]
public class TypoTest2 extends Sprite
{
private var tf: TextField = new TextField();
private var finalString: String = "superman !!";
private var arrFinalCode: Array = [];
private var arrCurrentCode: Array = [];
private var arrDelay: Array = [];
// 목적지 까지 도착했는지를 저장하는 변수
private var arrIsComplete: Array = [];
public function TypoTest2()
{
super(); // 목적 문자열의 각 코드번호를 this.arrFinalCode에 저장하고 // "-"의 코드번호를 this.arrCurrentCode에 저장하기 // arrCurrentCode[ i ] ----> arrFinalCode[ i ]로 가면 된다..!!
for( var i: int=0; i<finalString.length; i++ )
{
this.arrFinalCode[ i ] = this.finalString.charCodeAt( i );
this.arrCurrentCode[ i ] = "-".charCodeAt( 0 );
this.arrDelay[ i ] = -2*i;
this.arrIsComplete[ i ] = false;
} // 텍스트 필드 화면에 붙이고
this.addChild( tf );
// 이벤트 설정
this.addEventListener( Event.ENTER_FRAME, onEnter );
}
private function onEnter( e: Event ): void
{ // arrCurrentCode[ i ] ----> arrFinalCode[ i ]로 이동하기 / Delay를 주어 순차적으로 시작하도록 한다.
for( var i: int=0; i<this.finalString.length; i++ )
{
if( ++ this.arrDelay[ i ] > 0 ){
if( this.arrCurrentCode[ i ] > this.arrFinalCode[ i ] ){
this.arrCurrentCode[ i ] --;
}else if( this.arrCurrentCode[ i ] < this.arrFinalCode[ i ] ){
this.arrCurrentCode[ i ] ++;
}else{
this.arrIsComplete[ i ] = true;
}
}
}// for
// 모두 목적지에 도착하면, 이벤트 삭제하는 코드
var totalComplete: Boolean = true;
for( i=0; i<this.finalString.length; i++ )
{
if( this.arrIsComplete[ i ] == false )
{
totalComplete = false;
}
}
if( totalComplete == true )
{
this.removeEventListener( Event.ENTER_FRAME, onEnter );
}
// arrCurrentCode에 해당하는 코드로부터.. 문자열 연결해서 만들기
var str: String = "";
for( i =0; i<this.finalString.length; i++ )
{
str += String.fromCharCode( this.arrCurrentCode[ i ] );
trace(str);
} // 만든 문자열을 텍스트 필드에 대입하기
this.tf.text = str;
핵심원리
1. start type(임의의 시작문자)과 final type(최종적으로 보여주고자 하는 문자열)을 지정한다. ( 우리는 "-"와 "z"로 합니다.)
2."-" ---->"z" (목적-->종착 ) 이동을 하려면 꼭 숫자값이 필요하므로 각 문자를 유니코드로 변경한다. ("-" ---->"z"를 35 ----> 99 로..)
(50-->1000와 같은 순자값은 순차적으로 이동하면 되지만 문자열은 숫자체계로 바꿔줘야 한다.)
3. 35부터 1씩 증가시키면서,99까지 이동하도록 코딩.
4. 유니코드를 다시 문자열로 변화해서 화면에 표시 (35에 이어 36을 읽으면 다시 36을 해당 문자열로 변환하여 화면에 표시한다.)
[ SWF ( width="550", height="400", frameRate="36", backgroundColor="0xEEEEEE" ) ]
public class TypoTest1 extends Sprite
{
private var tf: TextField = new TextField();
private var finalChar: String = "p";
private var startChar: String = "-";
// "-" --> "p"로 가는 // currentCode는 "-"의 유니코드부터 출발해서 ---> 목적지 finalCode으로 간다. // currentCode는 "-"의 유니코드부터 출발하므로 startCode는 필요 없다 (출발 시 currentCode = startCode이므로 )
private var finalCode: int;
private var currentCode: int;
public function TypoTest1()
{
super();
this.addChild( this.tf ); // 이동을 위해 숫자가 필요하므로, 문자로 부터 코드번호 추출
finalCode = finalChar.charCodeAt( 0 );
currentCode = startChar.charCodeAt( 0 ); // 매 프레임마다
this.addEventListener( Event.ENTER_FRAME, onEnter );
}
URLLoader : 주문자 데이터가 도착하고 나면, 주문자의 손에 데이터가 들어간다. ...urlLoader.data
1. Data가 도착하면 먼저 complete로 받고 2. urlLoader. data로 도착한 Data가 들어간다. 3.URL 경로명에는 URLRequest가 들어간다. 4.URLRequest는 택배아저씨정도로 이해하면 된다. 5.3.0에서는 URL을 연결할 경우 항상 URLRequest로 링크를 걸어준다.
(참고) 이미지를 로드할 때는 Loader, 데이터를 로드 할 때는 URLLoader를 쓴다 비교하여 공부해본다.
== > 로드 작업 중 지금까지 로드한 바이트 수를 나타냅니다. 2) bytesTotal : uint = 0
==
> 다운로드한 데이터의 총 바이트 수를 나타냅니다. 이 속성은 로드 작업이 진행 중인 경우에는 0을 포함하고 작업이
완료되면 채워집니다. 또한 Content-Length 머리글이 누락되면 총 바이트 수가 확정되지 않습니다. 3) data : *
== > 로드 작업으로 수신된 데이터입니다. 이 속성은 로드 작업이 완료된 때만 채워집니다. 데이터의 형식은 dataFormat 속성의 설정에 따라 달라집니다.
**
dataFormat 속성이 URLLoaderDataFormat.TEXT인 경우 수신된 데이터는 로드된 파일의 텍스트가 포함된 문자열입니다.
dataFormat 속성이 URLLoaderDataFormat.BINARY인 경우 수신된 데이터는 원시 이진 데이터가 포함된 ByteArray 객체입니다.
dataFormat 속성이 URLLoaderDataFormat.VARIABLES인 경우 수신된 데이터는 URL 인코딩된 변수가 포함된 URLVariables 객체입니다.
** 4) dataFormat : String = "text"
== >
다운로드하는 데이터를 텍스트(URLLoaderDataFormat.TEXT), 원시 이진
데이터(URLLoaderDataFormat.BINARY) 또는 URL 인코딩된
변수(URLLoaderDataFormat.VARIABLES) 중 어떤 형식으로 수신할 것인지 제어합니다.
-------------------------------------------------------------------------------------------------------------------------- [public 메서드] 1) URLLoader(request:URLRequest = null)
== > URLLoader 객체를 만듭니다. 2) close():void
== > 진행 중인 로드 작업을 닫습니다. 진행 중인 모든 로드 작업이 즉시 종료됩니다.
3) load(request:URLRequest):void == > 지정된 URL에서 데이터를 보내거나 로드합니다. 데이터는 dataFormat 속성에 지정한 값에 따라 텍스트, 원시 이진 데이터 또는 URL 인코딩된 변수로 수신할 수 있습니다. dataFormat 속성의 기본값은 텍스트입니다. 지정된 URL로 데이터를 보내려는 경우 URLRequest 객체의 data 속성을 지정할 수 있습니다.
**
이벤트
- complete:Event — 데이터가 성공적으로 로드되면 전달됩니다.
- httpStatus:HTTPStatusEvent — HTTP에 의해 액세스되고 현재의 Flash Player 환경이 상태 코드 수신을 지원하는 경우 complete 또는 error 이벤트 외에도 이러한 이벤트를 수신할 수 있습니다.
- ioError:IOErrorEvent — 로드 작업을 완료할 수 없습니다.
- progress:ProgressEvent — 다운로드 작업이 진행되어 데이터가 수신될 때 전달됩니다.
- securityError:SecurityErrorEvent — 로드 작업에서 호출자의 보안 샌드박스 외부에 있는 서버의 데이터를 검색하려고 시도했습니다. 이 오류는 해당 서버의 정책 파일을 사용하여 해결할 수 있습니다.
- open:Event — 로드 작업이 시작될 때 전달됩니다.
**
오류
- ArgumentError — URLRequest.requestHeader 객체는 금지된 특정 HTTP 요청 헤더를 포함할 수 없습니다. 자세한 내용은 URLRequestHeader 클래스 설명을 참조하십시오.
- MemoryError —
이 오류는 다음과 같은 이유로 발생할 수 있습니다. 1) Flash Player에서 URLRequest.data 매개 변수를
UTF8에서 MBCS로 변환할 수 없습니다. load()에 전달된 URLRequest 객체가 GET 작업을 수행하도록 설정되고
System.useCodePage가 true로 설정된 경우 이 오류가 발생합니다. 2) Flash Player에서 POST
데이터를 위한 메모리를 할당할 수 없습니다. load에 전달된 URLRequest 객체가 POST 작업을 수행하도록 설정된 경우
이 오류가 발생합니다.
- SecurityError — 신뢰할 수 없는 로컬 SWF
파일은 인터넷 통신이 불가능합니다. 이 SWF 파일을 네트워킹 가능한 로컬 파일(local-with-networking) 또는
신뢰할 수 있는 파일로 다시 규정하면 이 오류를 해결할 수 있습니다.
- TypeError — 요청 매개 변수의 값이나 전달된 URLRequest 객체의 URLRequest.url 속성이 null입니다.
**
-------------------------------------------------------------------------------------------------------------------------- [이벤트] 1) complete
== > 수신된 모든 데이터가 디코딩된 후 URLLoader 객체의 data 속성에 배치되면 전달됩니다. 2) httpStatus
== > URLLoader.load() 호출로 HTTP를 통해 데이터 액세스를 시도하고 현재의 Flash Player 환경에서 이 요청에 대한 상태 코드를 감지 및 반환할 수 있을 때 전달됩니다. 3) ioError
== > URLLoader.load() 호출로 치명적인 오류가 발생하여 다운로드가 중단되면 전달됩니다. 4) open
== > URLLoader.load() 메서드 호출에 이어 다운로드 작업이 시작될 때 전달됩니다. 5) progress
== > 다운로드 작업이 진행되어 데이터가 수신될 때 전달됩니다. 6) securityError
== > URLLoader.load() 호출로 보안 샌드박스 외부의 서버로부터 데이터 로드를 시도할 때 전달됩니다.
public class URLLoaderTest1 extends Sprite
{ // URLLoader : 주문자 // 데이터가 도착하고나면, 주문자 손에 데이터가 들어간다.. urlLoader.data
private var urlLoader: URLLoader = new URLLoader();
public function URLLoaderTest1()
{
super();
// 강제로 오류창을 뜨게하는 방법 // throw new Error( "밥줘~!!" );
urlLoader.addEventListener( Event.COMPLETE, onComplete ); // 비동기식 예외처리 ( IOError )
urlLoader.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
urlLoader.load( new URLRequest( "./sample3.xml" ) ); //error실험 전에 기존의 xml파일 이름을 살짝 변경한다.
}
private function onIOError( e: IOErrorEvent ): void
{
trace( "파일을 찾을 수 없어용...!!" );
}
private function onComplete( e: Event ): void
{
//trace(urlLoader.data); 이와같이 데이터가 넘어오면 문자열이긴 하지만 원래는 XML파일 이므로
//가져온 데이터를 XML로 변환해야 한다.
//예외처리 (xml파일이 오류파일이 되었을때 오류 팝업창이 뜨는 경우 )
//아래와 같은 것을 "동기식 예외처리"라고 한다. (try~~~~~catch) // {동기식} 예외처리 <--> 비동기식 예외처리
try{
var xml: XML = new XML( urlLoader.data );
trace( xml.toXMLString() );
}catch( e: Error ){
trace( "XML 형식이 틀렸습니다." );
}
}
} // class
}//package
파일을 찾을 수 없어용...!!
throw new Error ( "냥냥"); <== 에러 던지기.. (강제로 오류창을 뜨도록 하는 방법)
1. 동기식 예외처리 ===> try{} catch(e:Error){} 로 잡는다... ( xml 파일의 내용이 틀렸을 경우 )
1.컴파일 타임 에러 ( 컴파일:as --->swf파일을 만드는 과정 )
swf 파일이 만들어지는 과정에서 오류가 나서 swf 파일 자체를 만들 수 없는 상태 (깔끔하게 오류를 인지할 수 있다.)
2.런타임 에러
swf 파일은 만들어진 상태이나 과정에서 알수 없는 오류가 생겨난 상태 (어디가 틀렸는지 모르므로 심각한상태 )
런타임 에러에는 try-catch 를 써서 예외처리를 해준다.
try-catch는 xml을 시도(try) 했을때 만약 오류가 생기면(catch) 플래쉬에서 제공하는 멋없는 창을 보여주는 것이 아니라 내가
정한 문구를 보여주도록 하는 방법이다.
xml파일에 문제가 생겼을 경우는 xml파일이 아님에도 (오류가 났으므로) xml파일로 변환하려고 하여 문제가 생기는 것이다.
XML은 쓰기쉽기 때문에 많이 사용. 웹 2.0 데이터 통신은 XML을 위주로 하므로 잘 알아두어야 합니다.
E4X : EmacScript for XML ---->.(dot)으로 서술하는 방식을 말한다.
(데이터기반 프로젝트인 경우 이 방식으로 제작하지 않으면 웹상에서 쓰기 불편하다.)
**'플렉스는 기본적으로 XML 파서와 XML 을 처리할 수 있는 E4X(ECMAScript for XML) 와 같은 편리한 API 를 제공하므로 XML 로 리턴되는 데이터는 쉽게 처리하여 화면으로 보여줄 수 있다.'
- 예제로 배우는 Adobe 플렉스 2
**'E4X 를 사용하면 XML 을 마치 일반적인 오브젝트를 다루듯 사용할 수 있다. 다음과 같이 오브젝트의 속성에 접근하는 방식과 유사한 방식으로 각 요소 노드에 접근할 수 있다.'
- Flex 3 Knoehow Bible XML의 특징
1. 노드(node), 엘리먼트(element ) : <노드명>값</노드명>
2. 최상위노드는 1개만 존재해야 한다.. 3. 같은 노드명이 중복되면, 배열처럼(XMLList) 처리한다. (실제 배열은 아니나 배열처럼 처리하는 것이다. 이를 XMList라 함)
4. <font size='20'>호랑이</font> 에서 size는... attribute라 한다. XML 표기법 var xml: XML = new XML:
var xml: XML = <main> 두 표현 모두 가능하다.
public class XMLTest1 extends Sprite
{
public function XMLTest1()
{
super();
// var xml: XML = new XML( 문자열 )://여기서 최상위 노드는 main이고 자식 노드는 sub
var xml: XML = <main>
<sub>호랑이1</sub>
<sub color='#FF3322'>호랑이2</sub>
<sub>호랑이3</sub>
<book cost='2000'>홍길동전</book>
</main>;
// E4X : EmacScript for XML
trace( xml.toXMLString() ); // //변수에는 최상위 노드 즉 main이 저장된다. 고로 여기서 xml은 main을 뜻한다.
trace( xml.book ); //xml은 main과 마찬가지이므로 ( xml.book )는 main에 있는 book으로 인식한다.
trace( xml.sub[ 0 ] ); //동일 노드명이 중복되면 배열과 같이 처리하므로 sub 뒤에 배열 자리를 명시해준다. // 속성( attribute )은 앞에 @를 붙여준다..
trace( xml.book.@cost );
trace( xml.sub[ 1 ].@color );
}
// XML에서 임의의 한 노드는 XMLList로 간주하자...! (반복을 하던 안하던 엑스엠엘 리스트로 간주 )
var xmlList: XMLList = xml.book; //xml.book은 xmlList로 간주한다.
trace( xmlList.length() ); //다른 length와는 다르게 괄호가 있다. ( 특별한 이유 및 기능적 차이없음)
trace( xmlList[ 2 ].title );
trace( xmlList[2].@cost);