어떠한 작업을 시간에 따라 반복하고자 할 때 사용한다.

1) EnterFrame
엔터프레임 이벤트는 as1에서 아주 많이 사용하는 기능 중에 하나이다. 이 엔터프레임은 무비의 fps에 영향을 받아 무비의 실행횟수에 따라 이벤트가 발생하고 그에 따르는 명령문을 호출하여 실행하도록 한다.

예를 들어 현재 무비에 EnterFrame이벤트를 등록하고 이를 보고있는 청취자를 실행하는 코드를 구현하면 다음과 같다. (청취자 등록과 이벤트등록 및 삭제는 앞서 다루어본 이벤트 핸들링을 참고하면 된다.)

this.addEventListener(Event.ENTER_FRAME , onEnter)
private function onEnter( e:Event ):void
{
     trace("run")
}
위 코드의 실행결과는 output패널에 "run"이라는 문자열이 계속해서 출력하게 된다.
실행주기는 무비의 fps에 영향을 받아 가령 30fps라면 함수 onEnter는 1초에 30번을 호출받게 된다.

일정 횟수 후에 함수의 연결을 끊어서 실행을 중지하고 싶으며 아래와 같이 조건을 두어 코딩하면 된다.
var a:int = 1;
this.addEventListener(Event.ENTER_FRAME , onEnter);

function onEnter( e:Event ):void {
 if (a <= 100) {
  trace(a,"번 실행");
  a++;
 } else {
  this.removeEventListener(Event.ENTER_FRAME , onEnter);
 }
}

위의 코드를 보면 무비의 enterFrame이벤트를 바라보는 onEnter라는 함수는 이벤트가 발생하면 호출되어
실행하며 함수의 실행문 안에 조건문을 두어 실행과 이벤트연결을 제거하도록 되어있다.
a의 값이 100 이하일 때는 a를 1씩 증가시키며 자신의 코드블럭을 실행하고 100을 넘는 순간 이벤트와의 연결고리를 끊어서 무비에서 아무리 enterFrame이 발생하여도 이제는 onEnter라는 함수는 실행하지 않도록 하였다.

tip) 무비의 렌더링과 실행에 관여하는 fps(재생속도)조절방법
기본적으로 무비에서 제공하는 properties를 사용하여 수치를 바꿀 수 도 있지만
this.stage.frameRate = 30;
와 같이 무비의 절대적인 최상위인 stage클래스에 접근하여 frameRate 를 바꾸어 줄 수도있다

2) Timer
타이머클래스는 타이머이벤트와 같이 사용하며 AS3에서 처음으로 등장하게 되었다.
이 타이머는 무비의 재생속도와 관련없이 독자적인 재생시간을 가질 수 있다. 가령 무비의 fps가 30인데
특정 Timer는 2(2000밀리세컨드)초에 한번 실행하거나 1(1000밀리세컨드)초에 2번 실행하도록 실행타임을 설정할 수 있다.

Timer클래스에는 delay(지연시간)과 repeatCount(실행횟수)라는 속성이 포함되어있다.
Timer클래스를 사용하기 위해서는 Timer에 TimerEvent를 걸어두고 Timer클래스의 start()를 실행하여야 한다.
필요에 따라서 타이머를 중단하고 싶을 때는 stop()이라는 메서드와 타이머를 초기화 하는 reset()이라는 메서드도 기억해 두자.

var a:int = 1;
var timer:Timer = new Timer(1000,5)
timer.addEventListener(TimerEvent.TIMER , onTimer);
timer.start(); // 이때부터 타이머가 실행되며 이벤트에 의해 청취자 함수가 따라 실행한다.

function onTimer( e:TimerEvent ):void {
 trace(a,"번 실행"); //출력 : 1 번 실행 , 2 번 실행~ 5 번 실행
 a++;
}

위의 코드는 1초에 한번씩 onTime라는 함수가 호출되어 실행하고 repeatConut가 5이므로 5번 실행후 타이머는 종료된다.

위와 같은 경우에는 실행횟수를 설정한 것이고 enterFrame처럼 지속적인 실행을 하고 싶다면 repeatConut를
0으로 설정하면 된다.
var a:int = 1;
var timer:Timer = new Timer(1000,0)
timer.addEventListener(TimerEvent.TIMER , onTimer);
timer.start(); // 이때부터 타이머가 실행되며 이벤트에 의해 청취자 함수가 따라 실행한다.

function onTimer( e:TimerEvent ):void {
 trace(a,"번 실행");
 a++;
}


마찬가지로 위와 같은 경우에 실행함수에 조건문을 추가하여 실행을 중다하고 할때는
timer.removeEventListener(TimerEvent.TIMER , onTimer);
이벤트를 제거하거나
timer.stop()
타이머를 정지시켜서 실행을 중단한다.

* 타이머를 정시키는 경우에는 아직 이벤트가 연결되어있으므로 언제든지 다시 start()를 통하여 실행을
  재개할 수 있다.

* 타이머의 발생시간/지연시간 delay를 10밀리세컨드 이하로 설정하게 되면 때로는 정확한 타임에 실행되지 않을수 있다. 이는 cpu나 실행환경에 영향을 받으므로 너무 빠르게 실행한다면 정확한 값을 얻을수 있는 경우가 발생할 수 도 있다.

Posted by 버터백통
반복문은 어떠한 명령문을 여러번 반복적으로 실행하고 싶을때 사용한다.
가령 섬네일 목록을 만들고 싶을 때 가로로 5개 세로로 10개의 같은 기능의 섬네일을 복제하여 배치하고자 할때 이 50개를 일일이 만들어 붙이는 개발자는 없을 것이다. 이러한 반복적인 수행이 필요할 때 반복문을 사용한다.

1) for문
일반적으로 가장 많이 사용하는 반복문이며, while문보다 사용법이 간단하다.
- 구조식
for( 초기화문장; 검사식; 갱신문장 ){
   명령문(순환문 본체)
}

for 은 기본적으로 위와 같은 구조를 갖고 있으며 검사식과 갱신문장을 통해 실행회수를 정할 수 있다.
- 초기화 문장 : 주로 숫자형 변수를 사용하여 값을 초기화 시킨다.
- 검사식 : 조건체크를 하여 만족하면 명령문을 실핼 시킨다.
- 갱신문장 : 명령문이 실행된 후에 초기화 문장에 사용된 값을 연산한다.
for( var i:int=0; i<10; i++ ){
    trace(i) //출력 : 0,1,2,3,4,5,6,7,8,9 까지 i의 증가값을 출력한다.
}

* 인터프리터의 과정
i의 값을 0으로 설정하고 검사식에서 10보다 작은지를 검사한다 만족하면 명령문 trace(i)를 실행하고
갱신문장인 i++을 실행하여 i의 값을 1증가 시킨다.
1이 증가된 i의 값을 다시 검사하고 만족하면 명령문을 실행한다. 그리고 다시 갱신문장에 의해 i를 1증가시킨다.
이러한 일련의 반복검사를 통해 검사식을 만족 못할 때 까지 실행한다.


위의 경우에는 반복문은 10회 실행한다. i=0일때 한번 실행하여 명령문을 실행하고 순환과정을 통해 i<10을 만족하는 값인 9를 마지막으로 10번의 실행은 종료된다.

* 실제로는 i는 10까지 증가한다. 이는 마지막 실행시 i는 9일때 갱신문장에 의해 i=10이 되고 이를 검사식에서
만족 못하여 실행이 종료되는것이다.
i:int;
for (i=0; i<10; i++) {
 trace(i); //출력 : 0~9
}
trace(i); //출력 : 10

위와 같은 코드를 보면 i값은 10이라는 수가 대입 되어 있다.

2) while문
주로 미리범위가 정해지지 않은 반복을 수행할 때 사용하며, for문처럼 조건검사에 의해 만족(true)하면 실행하고 거짓이면 순환/반복에서 빠져나오게 된다.

- 구조식
변수의 초기화
while(검사식){
   명령문
   갱신문장
}
while문을 구성하는 요소도 초기화와 검사식 갱신문장을 포함하고 있어야 한다. 각 기능은 for문에서
설명한 내용을 참고하면 된다.

var a:int=0
while( a < 10 ){
   trace(a) //출력 : 0~9
   a++
 }
for문과 다르게 각 요소의 문장들이 분리되어 실행하도록 되어있다.

* do while : 실행 코드블럭을 do{}라고 묶어서 실행한다.
var a:int=0;
do{
    trace(a);//출력 : 0~9
    a++;
 }
while ( a < 10 )
 
이와 같은 반복문은 실행속도가 엄청빠르기 때문에 바로 결과를 얻을 수 있는 곳에 사용한다. 가령 위에서 언급했던 섬네일을 가로/세로 배치하여 view를 생성하거나 게시판의 목록과 같은 것을 만들 때 사용한다.
일정시간 후 순차적으로 실행하기 위해서는 EnterFrame이벤트나 Timer라는 클래스를 사용하여야 한다.

Posted by 버터백통
일반적으로 많이 쓰이는 조건문중에 if문은 복합연산자를 사용하여 여러 조건을 판단 할 수가 있다.
사용 방법은 if구문의 조건식에서 && , || , ! 과 같은 논리연산자를 사용하여 문장을 만든다.

&& (and,이고,그리고) : 조건식A와 조건식B를 모두 만족해야 코드블럭의 명령문을 실행한다.
if( 조건식A && 조건식B   ){
    명령문
}

|| (or,또는,이거나) :
조건식중에 어느 1개만 만족해도 명령문이 실행한다.
if( 조건식A ||조건식B   ){
    명령문
}

! (NOT, 아니다) : 조건식이 만족하지 않을 때 실행한다.
if( !( 조건식 )   ){
    명령문
}
*조건식을 묶는 경우보다 값의 비교를 != 으로 사용하는 경우가 더 많다.

var name:String = "olga";
if( !(name == "olga") ){
  명령문
}

위의 코드는 이름이 olga가 아닌 경우에 명령문을 수행하도록 하는 것이다.
같은 방법으로 다음과 같이 사용한다.
var name:String = "olga";
if( name != "olga" ){
  명령문
}

Posted by 버터백통