앞에서 속성 x라는 setter나 getter에 관하여 다루어 보았다. 이들은 Sprite나 MovieClip에서 공통적으로 상속받은 어떠한 클래스의 메서드일 텐데...이들의 실행문을 개발자 마음대로 바꾸어 실행하도록 하고싶을 때는 메서드를 재정의 하여야 한다.

public override function 함수이름():반환타입
{
     명령문들...
}
또는 아래와 같이 재 선언 할수도 있다.
override public function 함수이름():반환타입
{
     명령문들...
}
위처럼 부모의 메서드를 재정의하여 사용하고 싶을 때 사용한다.
가령 A라는 클래스에 mind()라는 클래스는 trace("난 이미자 좋아")를 구현한다. 이 A라는 클래스를 상속받은 B클래스는 세대도 바뀌고 환경도 바뀌어 mind()가 "태희 좋아"로 바꾸려고 한다.

//클래스 A
public class A
{
   public function mind():String
  {
   
  return "이미자 좋아"
  }
}

//클래스 B
public class B extends A
{
   override public function mind():String
  {
    
return "태희 좋아"
  }
}


A클래스에서는 mind를 실행시키면 이미자를 좋아하지만 B클래스 이후 부터는 mind를 실행시키면 태희를 좋아하게 되는 것입니다. (B를 상속받은 모든 클래스는 A와 B의 모든 메서드를 가지고 있겠지만 mind인 경우 "태희 좋아"라는 B클래스에서 재 선언한 메서드가 실행하게 된다.)
Posted by 버터백통

[ return ]
어떠한 메서드는 값을 대입하면 원하는 값을 추출하여 이를 반환하도록 만들어야 하는경우가 있다.
가령 a = Math.random( 값 )을 코딩하면 값에 따라 어떠한 임의의 수를 변수 a에 대입하게 된다.
또는 사용자가 어떤 값을 넣으면 10을 더해서 반환하는 메서드를 만들었다고 가정하자.
a = logic( 10 )
trace( a ) //출력 : 20
과 같이 입력된 수에 10을 더하여 이를 반환하도록 하는 메서드를 만들기 위해서는 메서드 내부에서
들어온 파라미터의 값에 10을 더하여 return하게 된다
public function logic( value:Number ):Number
{
     var result:Number = value + 10;
     return result;
}
10을 더하여 반환하는 메서드는 위와 같다. 우리가 주목해야 할 것은 메서드 마지막 명령문인 return과 함수 선언문 마지막에 붙어있는 반환데이터 타입인 Number이다.

반환문 return이 붙어있는 메서드는 데이터 타입을 반드시 return의 데이터타입과 일치하게 코딩하여야 한다.
가령 return "String"; 과 같이 문자열을 반환하는 메서드는 반환 데이터 타입을 String으로 맞추어야 한다.
public function test():String
{
    
return "문자열";
}

* 반환값이 없는 메서드:void에서의 return 
return은 반환데이터 타입이 없는 void에서도 사용된다. 이 경우에는 메서드가 그 즉시 실행을 종료하기 위해서 사용한다.
* 단 void 메서드인 경우 return에 값을 넣으면 안된다!!
public function test( name:Stirng ):void
{
     if( name != "olga" ){
          return;
     }  
     trace( "오~ 방가루~" );
}
이 코드를 보면 입력받은 파라미터의 인자가 "olga"가 아닌 경우에 조건문 if에 의해 return을 실행하게 된다.
실행이되면 이 메서드는 실행을 중단하고 코드블럭에서 빠져나가게 된다...따라서 화면에 "오~방가루~"를 볼 수없게 된다. 하지만 인자가 "olga"인 경우에는 조건문은 실행하지 않으므로 "오~방가루~"라는 메세지를 출력하게 된다.
이처럼 return은 메서드에서 값을 반환하거나 void메서드에서 실행을 종료시킬때 사용한다.

return을 배워 보았다. 이러한 방식을 사용한 메서드중에 getter라고하는데 이는 특정값을 반환하는데 사용하며 값을 설정하는 메서드를 setter라고한다.

[ getter 와 setter ]
AS1~2에서 플래시로 무비를 만들 때 어떠한 무비클립의 위치를 알기 위해서 흔히 trace( mc._x )와 같이 코딩하여 위치를 수식으로 확인하였다. 또는 _x = 100과 같이 값을 대입하여 해당 무비클립의 위치를 바꾸기도 하였는데 바로 이러한 속성을 처리하는 메서드가 setter와 getter인 것이다.
(참고로 AS3에서는 모든 속성에서 언더바가 사라졌다. )

가령 mc라는 무비클립의 x위치를 trace한다면
var a:int = mc.x;
trace( a );
이거나 아래처럼 바로 trace에 명령문을 넣어서
trace( mc.x )와 같이 처리할 것이고, 이를 처리하는 속성 x는 mc의 x위치를 찾아 반환하는 메서드이다.
또한 mc의 x위치를 100으로 이동하고자 mc.x = 100이라 코딩하였다면 mc는 100인 위치로 이동하게 된다.
속성 x는 바로 값을 넣기도 하며 값을 반환하기도 한다.
반환하는 속성은 getter에 해당하는 부분이고 x = 100과 같이 값을 입력하는 부분은 setter에 속하게 된다.
이들은 외부에서 접근하여 값을 추출하거나 대입하여야 하므로 스코프는 public으로 선언되어있어야 하고
다른 메서드들과 다르게 같은 이름으로 선언할 수 있다!! 하지만! setter/getter로 구분하는 set/get을 선언하여야 한다.

가령 x속성 중에 현재의 x위치를 반환하는 getter는 다음과 같다.(getter를 setter위에 선언하는 것이 좋다)
public function get x():Number
{
      ......
      return 자신의 x위치를 반환하는 값이나 변수;
}
getter가 실행되는 부분은 대입연산자가 있거나 trace등에서 자동적으로 getter가 실행한다.
var a:Number = mc.x / trace( mc.x )일 때는 getter이다

또한 x = 100 과 같이 메서드 x가 값을 받는 setter인 경우는 다음과 같을 것이다.
public function set x( value:Number ):void{
      .......
     입력받은 값으로 x위치를 이동시키는 명령문들;   
}

mc.x = 100과 같이 대입연산자를 사용하여 값을 입력할 수 있는 부분이 setter이다. 만약 set으로 메서드처리 하지않았다면....mc.x(100)과 같이 설정하여야 했을 것이다....

이와 같이 setter와 getter를 사용하여 입력/반환등을 처리하는 속성을 만들면 a = 10과 같이 값을 입력할 수 있고 v = a와 같이 값을 받아 처리 할 수 있어 비교적 코딩이 깔끔해진다. (a(10) 보다 a = 10이 보기 좋지 않을 까요??)














Posted by 버터백통
일반적으로 함수는 재사용이 가능하도록 명령어화 시키는 것인데 이 함수가 어떤 클래스에 포함(멤버함수)되었을 경우 해당 클래스의 메서드라고 합니다. 우리가 흔히 무비클립.stop()이라는 메서드를 호출하여 무비를 정지 시키는 것을 플래시에서 많이 다루어 보았습니다. 이는 무비클립이라는 클래스에 stop()이라는 public함수로서 무비클립의 메서드라고 배웠습니다.

함수는 비슷한 동작을 여러번 사용하여야 할 경우에 주로 만들어 지며 경우에 따라 함수(static function) 자체가 클래스자체로 존재하는 경우도 있습니다.

1) 함수의 접근 제한자
private : 클래스 내부에서만 접근이 가능하다.

protected : 자신의 클래스내부나 상속받은 하위 클래스에서 접근이 가능하다.

internal : 자신의 클래스나 같은 패키지 안에서 접근이 가능하다.

public : 프로젝트 내에서 어떠한 경로에서든 접근이 가능하다.

위와 같은 접근 제한자를 두어 클래스의 멤버함수, 즉 클래스의 메서드로 만들면 접근제한 규칙에 따라 클래스 내부나 외부에서 호출하여 실행 시킬 수 있다.

가령 같은 클래스에서 선을 그리는 함수를 만든다고 하면 아래와 같다.
private function make():void
{
  for(var i:int=0; i<10; i++){
     drawLine();  // 함수의 호출부분
   }
}
//실제로 선을 그리는 함수 : 클래스 내부에서만 사용하기 때문에 private으로 설정하였다.
private function drawLine():void
{
    this.graphics.lineStyle(1,Math.random()*0xFFFFFF,1);
    this.graphics.moveTo(Math.random()*550,Math.random()*400);
    this.graphics.lineTo(Math.random()*550,Math.random()*400);
}
위 코드를 보면 make라는 함수에서 실제로 선을 그리는 함수drawLine 를 10번 호출하게 된다. drawLine 함수는 랜덤하게 화면에 선을 그리게 된다.


[ 실행시킨 화면 ]





2) static선언
* 메서드나 변수등은 필요에 따라 메모리의 상수영역(constant & code segment)에 등록하여 Delegate없이 바로 가져와 사용하기도 한다.
public static var a:String = "a"; //변수 a를 정적요소로 선언
public static const b:String = "b"; //상수 b를 정적요소로 선언
public static function c():void // 메서드(함수) c를 정적요소로 선언
{
     명령문;
}
위와 같이 함수나 상수, 변수에 static을 추가하면 이들 요소는 실행시 메모리 상수영역에 등록하게 되어 공간을 차지하게 된다. 이들의 참조(reference)는 Delegate없이 호출하고자 할때는 선언된 클래스를 직접 호출하여 사용한다.

가령 Alert이라는 클래스에 showMessage라는 메서드가 있을 때 선언은 다음과 같다.
public static function showMessage( v:string ):void
{
     trace( v )
}

위 메서드는 패키지 어디에서든 호출하여 사용하고 싶다. 따라서 접근제한자를 public으로 선언하였고 호출시 인자(argument)주어 파라미터의 값인 v의 값으로 메세지를 바꾸고 싶다.

private function showAlert():void
{
    Alert.showMessage("호출!!")
}

Alert의 메서드인 showMessage()을 호출하는 코드인데 호출시 argument를 "호출!!"이라고 넘겼다
따라서 출력창에 "호출!!"이라는 메세지가 나타나게 된다.
* static 선언 객체의 호출시 상대경로(this등)는 사용할수 없다

3) 함수의 파라미터
* 매개변수( Parameter ) : 메서드에서 선언된 (받아들이는)변수
* 인자( argument ) : 메서드를 호출할 때 넘겨주는 값
 - gotoAndStop(10) //10번 프레임으로 가서 멈추어라
   : 가령 메서드 gotoAndStop( 파라미터:Number )등으로 만들고 파라미터는 숫자를 받겠다고 선언하였고, 이 메서드를 호출시 필요한 값인 10이 인자이다. (물론 실제의 gotoAndStop()은 예보다 잘 만들어진 구조이다. )

[ 메서드의 인자배열 활용 ]
* 메서드에서 사용할 인자(arguments)의 개수가 일정하지 않는 경우 메서드의 parameter를 설정하기가 힘들다. 이런 경우에 AS3에서 제공하는 인자 배열 : arguments를 사용하면 메서드 활용에 효율적이다.
private function init( ):void
   {
     println("Hello World");
     test_Arguments( 1 , 2 , 3 , "1" , "2" , "3"   )
   }
   
   //파라미터가 1개인 함수
public function println(str:String):void {
       trace(arguments.callee == this.println); // true : 현재 실행 중인 함수에 대한 참조입니다.
       trace(arguments.length);                 // 1
       trace(arguments[0]);                     // Hello World
       trace(str);                                // Hello World
}
       
       
   //파라미터의 개수를 설정하지 않은 함수  
   private function test_Arguments( ...arguments ):void
   {
          trace( "인자의 개수 : " , arguments.length ); // 출력 : 인자의 개수 :  6
   }


파라미터를 특별히 정하지 않고 제공되는 인자배열을 사용하려면 " ...arguments "라는 것을 메서드 파라미터 부분에 추가하여 사용하면 된다.
Posted by 버터백통

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

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 버터백통

조건문은 명령문의 실행을 논리적 결정하에 선택적으로 실행하도록 한다.

1) if문 : 한 두가지 이상의 조건을 체크할때 실행한다. 하지만 두가지 이상일 때는
switch문을 실행하는 것이 좋다.

- 구조식
if( 검사식 ){
    명령문 //검사식을 만족하면 실행
}

검사식의 조건에 참이냐 거짓이냐의 여부가 명령문의 실행 여부를 관리하게 된다.

추가로 else라는 구문을 더해서 위의 검사식에 만족(true)를 못하면 다음 코드블럭의 명령문을 실행하게 한다.
if( 검사식 ){
    명령문
}else{
  
명령문 //위의 검사식을 만족 못할 시 실행
}


또는 else에 if구문을 추가해서 다시한번 검사를 하기도 한다.
if( 검사식1 ){
    명령문
}else if( 검사식2 ){
  
명령문 //위의 검사식1을 만족 못하고 검사식2를 만족할 때만 실행
}
위의 식에서 검사식1과 검사식2를 모두 만족(true)못하면 두명령문 모두 실행하지 않는다.

* 효율적인 조건문 체크
else if를 사용하여 첫번째 검사식이 만족하면 다음 검사식은 실행하지 않는다.
따라서 상호 베타적인 조건식에서는 여러개의 if문을 사용하기 보다는 else if 를 사용하는 것이
효율적이다.


마지막으로 if구문과 else if 그리고 esle문을 사용한다면 else로 마무리 하여야 문법상 오류가 없다.
if( 검사식1 ){
    명령문
}else if( 검사식2 ){
  
명령문
}else{
  명령문
}




2) switch문 : 여러개의 조건을 체크하기 위해서 사용한다.
 if문이나 else if를 추가해서 사용하는 것보다는 비교적 읽기 쉽고 간단해진다.

- 구조식
switch( 비교대상){
 
  case 검사식:
             명령문
    case 검사식:
             명령문
    case 검사식:
             명령문
   
default:
             명령문
}
비교대상에 사용된 변수나 값이 case문의 검사식에 만족하면 해당 명령문을 실행시킨다.


* switch문은 만족된 case가 실행되면 switch문 본체에서 현재 만족된 case문 하단의 모든 case문이 실행하게 된다(default 포함)
switch( 비교대상){
 
  case 검사식:
             trace(1)
    case 검사식:  -> 만족
             trace(2)
    case 검사식:
             trace(3)
   
default:
             trace(4)

}
두번째 case에서 만족하게 되면 하위 모든 case가 실행하게 된다.
따라서 이를 방지하기 위해서는 break를 사용하여 실행을 중지하여야 한다. 주로 break는 마지막 실행문에서는 사용하지 않는다. 검사식이 마지막에서 실행할 때에는 이미 하위의 case가 없으므로 생략해 주는 것이 좋다.


가령 변수 a="flash"라고 할때 아래 명령문중에서 trace("플래시")가 실행하게 된다.
var a:String = "flash"
switch(a) {
    case "100" :
           trace("문자 100");
           break;
   
case "flash" :
           trace("플래시");
           break;
    case "플래시" :
           trace("flash");
           break;
    default :
           trace("다시 시도하여 주세요!");
}
위에서 변수 a의 값을 비교대상으로 지정하고 그 값을 각 case문에서 비교하게된다.
변수a의 값은 "flash"이므로 case "flash"에서 만족하게 되어 빨간색 부분이 실행하게 된다.


3) 삼항연산자 : 한 문장에서 조건 체크와 명령문을 만들어 사용한다.
변수명 = 조건식 ? 실행문1 : 실행문2;
조건식에 만족하면 " : " 왼쪽의 실행문1이 실행하고 만족하지 않으면 실행문2가 실행한다.

var a:Number = 10;
a == 10 ? trace("변수 a는 10이다") : trace("변수 a는 10이 아니다")
위와 같이 코딩하였을 때 a의 값은 10이므로 앞의 조건식을 만족하여 좌항(빨간색)의 명령문이 실행한다.

Posted by 버터백통

플랙스도 다른 언어와 마찬가지로 값을 비교하기 위해서는 등호/부등호를 사용하여 같은지 여부를 Boolean값으로 반환을 한다. 
이러한 등호/부등호 연산자는 값을 비교하기전에 두 값을 같은 데이터타입으로 변환시키고 서로의 값을 비교한다.
가령 10 == "10"은 서로 다른 데이터 타입이지만 반환은 true를 반환한다. 이는 엄격하지 않은 환경에서 실행하였을 때 데이터 타입을 같은 타입으로 변환 비교 분석하므로 데이터 타입조차 우선 비교하기 위해서는 strict모드를 사용한다.

우선 비교적 엄격하지 않은 환경에서 값을 비교시
a:Number = 10
b:String = "10"
trace( a == b ) //출력:true
위의 코드는 true를 반환한다. 보다 정확한 검사를 하고 싶으면 엄격(strict)한 비교연사자를 사용한다.
a:Number = 10
b:String = "10"
trace( a === b ) //출력:false
엄격한 비교연산자 "==="이나 "!=="을 사용하여 데이터 타입조차 체크한다면
위의 결과값은 false를 반환하게 된다.

하지만 기본적으로 플랙스빌더의 컴파일러는 default가 strict를 사용하고 있으므로
a:Number = 10
b:String = "10"
trace( a == b ) //출력:false
는 false를 반환하게 된다. 이는 strict한 조건을 체크하기 때문에 값의 비교에 앞서
데이터 타입을 먼저 체크하고 이를 반환하게 되는것이다.

또한 데이터 타입 검사는 is연산자를 통하여 수행하기도 한다.
a:int = 10
if( a is int ){
    trace("Int !!")
}
결과는 콘솔에 "Int !!"를 출력한다.

액션스크립트는 데이터 타입에 따라 서로다른 검사방법으로 조건을 체크한다.
* 기본 데이터 타입 : String , number , int , Boolean...
* 복합 데이터 타입 : object , Sprite , Array , ByteArray , BitmapData..
기본 데이터 타입의 검사방식은 그들의 값을 비교하게 된다.
var a:Numbar = 10;
var b:Number = 10;
trace( a == b ) // 출력 : true

그러나 복합 데이터 타입의 그들의 참조(reference)로 비교하게 된다.
var a:Array = ["a","b","c"];
var b:Array = ["a","b","c"];
trace( a == b ) // 출력 : false

var a:Array = ["a","b","c"];
var b:Array = a
trace( a == b ) // 출력 : true
결국 복합데이터 타입은 같은 참조를 가지고 있을 때에만 동일하게 취급된다.

Posted by 버터백통
이번 내용은 아주 간단한 내용일 것이다.
일반적으로 프로그램에서 다루는 연산자는 사칙연산을 기본적으로 제공하고 있다.
나중에 Math를 배우며 좀더 깊이있는 계산법을 다루어 보고 이번에는 간략한 연산식만 만져보자.

덧셈 ; +
뺄셈 : -
나눗셈 : /
곱셈 : *
으로 사용되면 명령문은 a + b와 같이 사용한다
가령 a=1 , b=1이면 a+b는 2라는 값을 반환한다.
이를 변수나 다른 값에 정의하고 싶을 때는 이퀄 " = "을 사용한다.
c = a + b ; //c의 값은 2

또한 복합대입 연산자를 활용하여 값을 연산하는 경우도 있다.
a = a + 10
a += 10
------------------------------------------------------
a = a - 10
a -= 10
------------------------------------------------------
a = a * 10
a *= 10
------------------------------------------------------
a = a / 10
a /= 10
------------------------------------------------------
a = a + 1
a ++
------------------------------------------------------
a = a - 1
a --
------------------------------------------------------
복합 대입 연산자중에서 아래 ++와 --는 위치에 따라 선실행하느냐 후실행하느냐 여부가
정해진다.
a = 5
trace( a ++ ) //5  (a = a + 1)을 대입전에 trace한다
trace( a )     //6


a = 5
trace( ++ a )  //6 (a = a + 1)을 대입후에 trace한다
trace( a )      //6


Posted by 버터백통

액션스크립트 1~2까지는 아주 쉽게 이벤트를 다룰 수 있었다...
하지만 3.0에 와서는 좀 더 세밀한 제어가 가능해졌으며 그에 따르는 코드의 줄도 늘어나게 되었다.

일반적으로 이벤트청취자를 등록하는 방법은 아래와 같다.
대상.addEventListener(이벤트 타입:String , 실행함수)

위와 같이 코드를 입력했다면 대상에서 발생하는 이벤트를 괄호()뒤에 등록되어있는 함수가 실행하도록 한다.
이벤트가 발생하면 실행할 함수(리스너)는 이벤트 타입을 받아서 처리해야한다.
function(변수:이벤트타입):반환값 여부
{
       실행문
}


가령 mc라는 무비클립에 마우스다운 이벤트가 실행하면 onDown이라는 함수를 실행하라 라고한다면,
아래의 코드와 같이 처리한다.
mc.addEventListener(MouseEvent.MOUSE_DOWN , onDown)

private function onDown( event:MouseEvent ):void
{
         trace("마우스를 눌렀다!!")
}

위의 코드를 보면 이벤트 타입이 MouseEvent.MOUSE_DOWN라고 적혀있다. 이는 사용할 이벤트의 타입이
마우스(객체)이벤트이므로 MouseEvent라는 클래스에서 사용할 이벤트 타입을 정하게 되어있다.
MOUSE_DOWN이라는 이벤트 이름은 상수로서 마우스이벤트 클래스에서 설정되어있다.
클래스와 타입을 한번에 사용하려면
"mouseDown"이라고 사용하면 편리하다.
예 )  mc.addEventListener("mouswDown" , onDown);

onDown함수를 보면 매개변수 자리에 event라는 변수를 설정하였는데 타입을 MouseEvent 로 선언하였다
이는 리스너를 호출하는 이벤트 타입을 설정하여야 하며 해당 이벤트가 발생시에 리스너가 실행하도록 되어있다.

이번에는 이벤트 리스너 해제하여 보자
이벤트 등록은 위에서 처럼 addEventListener를 사용하여 청취자(리스너)를 등록하여 명령문을 실행하였다면
이벤트 제거는 이벤트가 발생하는 부분에서 add가 아닌 remove를 하게 되면 리스너와의 연결을 끊어둔다.
 mc.removeEventListener(MouseEvent.MOUSE_DOWN , onDown);


tip) 이벤트를 핸들링하는 함수가 같은 클래스에 작성되었다면 스코프를 맞추기위해 delegate를 생략한다.
delegate는 간접적인 메서드 호출자로 new없이 바로 사용이 가능하다. 만약 클래스가 다르다면 new로 생성하여
스코프를 맞추어주어야 한다.

아래 코드는 외부에서 이벤트나 사각형 그리기 클래스를 두어 delegate한 코드이다.

package
{
 import flash.display.Sprite;
 import flash.events.MouseEvent;

 public class Delegate extends Sprite
 {
  public function Delegate()
  {
   super();
   
   var draw:Rect = new Rect();
   draw.drawRect();
   addChild( draw )
   
   var delegate:DownEvent = new DownEvent();
   this.addEventListener(MouseEvent.MOUSE_DOWN , delegate.onDown)
  }
 
 }
}

//외부에서 실행하는 이벤트처리 클래스
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.Graphics;
 
class DownEvent
{
 public function DownEvent()
 {
  super();
 }
 public function onDown( e:MouseEvent ):void
 {
  trace("Down")
 }
}

//상자그리는 클래스
class Rect extends Sprite
{
 public function Rect()
 {
  super();
 }
 public function drawRect():Graphics
 {
  var g:Graphics = this.graphics
  g.beginFill(0xFF00FF);
  g.drawRect(0,0,100,100);
  g.endFill();
  return g
 }
}

tip)  Event, TimerEvent... 등과 다르게 마우스 이벤트와 키이벤트는 디스플레이 리스트에 등록된 다른 무언가를
활용하여 이벤트를 받아 와야한다. 위에 delegate 코드에서도 클릭할 수 있는 무엇이 필요해서
Rect라는 클래스를 만들고 이를 addChild하여 디스플레이 리스트에 등록하였다.
* 디스플레이 리스트 : swf에서 화면에 그리고자 하는 객체목록과 계층구조이다.
1 : stage : 계층구조의 뿌리(root)와 같은 개념으로 화면에 표현되는 모든 객체의 계층구조를
포함하는 하나의 스테이지 객체.
2 : displayObjectContainer : 컨테이너 개념으로 자신에게 다른 객체를 담을 수 있는 그릇과 같다.
3 : displayObject : 눈에 보일 수 있는 객체



Posted by 버터백통
Tip And Tech2008. 5. 16. 17:43
자바에서 JVM처럼 플렉스/플래시cs3는 AVM2라는 기반위에서 작동한다.
as1,as2는 AVM1에서 구동되고 as3는 AVM2에서 구동되어지며 대부분의 컴퍼넌트와
라이브러리를 내장하고 있기 때문에 실제 개발에 필요한 소스나 용량부분을 어느정도 플러그인단에서
해결할 수 있다고 생각한다.


우선 AVM구동시 우리의 컴퓨트는 4가지의 메모리를 할당하게 된다.
1) 스택영역(runtime stack) : 프로젝트를 실행시 사용하는 영역으로, 메모리를 이용하여 CPU에 의해 직접 관리되는 스택이다. 이는 함수를 호출하고 리턴하는데 있어서 필수적인 메커니즘이다. 런타임 스택은 항상 ESP(Extended Stack Pointer)레지스터를 이용하여 top을 가리키게 된다. 우리는 보통 스택의 개념을 설명할때 '쌓음'의 원리를 이용하여 아래서부터 위로 쌓여가는 것으로 설명하곤 한다. 하지만 IA-32아키텍쳐에서 스택은 아래로 자란다. 즉, 스택을 거꾸로 뒤집어 놓은 것이다.


<그림 1 : push동작>


2) 힙영역(garbage collection heap) : 동적 메모리 할당하는 영역으로 프로그래머가 개발시 변수등을 통하여 메모리 공간을 할당,소멸하는 영역이다. 이부분은 gc의 대상이 되어지고 system.gc실행시에 연결이 끊어진 변수나 객체는 메모리에서 제거된다.

3) 상수영역(constant & code segment) : 정적영역으로 static, const등을 할당하는 공간으로 값의 수정이나 제거가 불가능 하다.

4) 레지스터 영역 : 프로세서 실행 관련 메모리할당부분으로 CPU 안에 있는 고속 저장 장소이며 일반 메모리보다 훨씬 빠른 속도로 접근되도록 설계되었다. 레지스터의 종류로는 8개의 범용 레지스터와 6개의 세그먼트 레지스터, 프로레서 상태 플래그 레지스터(EFLAGS)와 명령어 포인터(EIP)가 있다.

사용자 삽입 이미지


 범용 레지스터(General-Purpose Register) : 범용 레지스터는 계산과 데이터 전송에 주로 사용된다. 다음 그림에서 보듯이 각 레지스터는 하나의 32비트 값이나 두 개의 16비트 값으로 다룰 수 있다. 16비트 값은 다시 2개의 8비트 값으로 다룰 수 있다.

사용자 삽입 이미지

32비트 값이 16비트와 8비트 값으로 각각 구분될 수 있는 레지스터는 다음과 같다.

사용자 삽입 이미지

나머지 범용 레지스터는 하위 16비트에 대해서만 특정한 이름을 갖는다.

사용자 삽입 이미지


*용도(Uses)
-EAX(Accumulator Register) :
  전송 및 연산에 사용. 곱셈과 나눗셈 명령어에 자동적으로 사용됨.

-EBX(Base Register) : 
  전송 및 연산에 사용. 번지의 간접 지정에 사용할 수도 있음.

-ECX(Count Register) : 
  전송 및 연산에 사용. 루프 카운터로 사용

-EDX(Data Register) : 
  전송 및 연산에 사용. 일부 연산 명령에 있어서 EAX와 함께 사용.

-ESI(Source Index) : 
  고속 메모리 전송 명령어에서 사용. 번지의 간접 지정에 사용. 스트링 명령에 있어서, 메모리로부터 레지스터로 데이터를 전송하기 위한 소스 번지의 지정에 사용.

-EDI(Destination Index) : 
  고속 메모리 전송 명령어에서 사용. 번지의 간접 지정에 사용. 스트링 명령에 있어서, 레지스터로부터 메모리에 데이트를 전송하기 위한 수신되는 목적번지를 지정할 때 사용.

-EBP(Base Pointer) :
  일반적인 계산과 데이터 전송에 사용되지 말아야 함. 스택상의 데이터 번지를 간접 지정할 때 사용. 함수 매개 변수와 지역 변수를 참조하기 위해 사용.

-ESP(Stack Pointer) : 
  보통의 계산과 데이터 전송에는 거의 사용되지 않음. 스텍의 최신 데이터가 저장되는 번지를 나타냄.


세그먼트 레지스터(Segment Register) : 실제 모드에서 세그먼트 레지스터는 세그먼트(Segment)라고 하는 미리 할당된 메모리 영역의 시작주소를 가리킨다. 보호 모드에서 세그먼트 레지스터는 세그먼트 서술자 테이블에 대한 포인터를 갖는다. 몇몇 세그먼트는 프로그램 명령어(코드)를 저장하고 다른 세그먼트들은 변수(데이터)를 저장하고 스텍 세그먼트(Stack Segment)라고 하는 또 다른 세그먼트는 함수의 지역 변수와 함수 매개변수를 저장한다.
CS(Code Segment) : 프로그램의 실행 명령어들이 내장되는 메모리 영역의 시작위치를 보관
SS(Stack Segment) : 스택으로 사용되는 메모리 영역의 시작위치를 보관
DS(Data Segment)  : 데이터가 저장되는 메모리 영역의 시작위치를 보관
ES(Extra Segment)  : 변수들을 위한 추가 메모리 영역의 시작위츠를 보관
FS :
GS :

명령어 포인터(EIP : Extended Instruction Pointer) : 실행항 다음 명령어의 주소를 포함
[출처] 1. 레지스터(Register)|작성자 파란바다



tip) 함수의 동작 원리
스택(stack)이라는 자료구조를 이용해 함수 호출이 가능하다는 것을 이야기 하고 싶을 뿐이다. 함수를 호출하게 되면 제어가 그 곳으로 넘어가야 하니까, 이전의 인스트럭션 포인터(EIP)레지스터를 어딘가에 저장시켜놨다가 나중에 다시 불러와야 할 것이다. 그런데 함수 여러개가 중첩되어 호출되었다면, 인스트럭션 포인터를 저장하는 자료구조는 가장 나중에 들어간 자료가 가장 먼저 나와야 올바르게 수행될 것이다. 즉, LIFO(Last-In, First-Out)여야 한다. 그렇다면 스택을 사용하여야 한다는 것은 두말할 필요도 없을 것이다.
개념이 비슷할 뿐 어셈블리어에서는 프로시져(Procedure)라고 한다.

tip) 레지스터 영역과 램영역
램과 레지스터 영역의 연산 속도의 차이는 수십~수백배의 차이가 발생한다.

* 화면에 보이기까지 과정
1 유니코드(utf-8)로 제작된 소스 : 우리가 신나게 개발하는 소스코드, *.as
2 컴파일(바이트코드로 변환) : 컴파일을 하면 바이트코드 형태인 swf파일로 변환한다.
3 .swf(반기계어)
4 인터프리터(JVM또는 AVM) : swf의 바이트 코드를 해석하기 위한 장치또는 플러그인/플레이어
5 실행결과



Posted by 버터백통
Tip And Tech2008. 5. 16. 16:53
* 인풋텍스트필드.restrict = "0.123" // "a-z" : 지정된 특정 문자만 입력가능

* stage.focus = 대상입력텍스트필드 //결과 커서입력(캐럿)이 해당 필드에서 깜빡인다

* focus : 객체를 포커싱하는 방법
  as2: Selection.setFocus(객체) --> as3 : stage.focus=객체(최소한 인터레티브오브젝트를 상속받은 객체여야 한다)

* 입력텍스트 이벤트 프로세스
텍스트필드를 선택한 상태에서 키보드를 누르면...
1 KeyboardEvent.KeyDown
2 TextEvent.TEXT_INPUT-> 텍스트 필드에 입력된 텍스트 표시
3 KeyboardEvent.KEY_UP

TextEvent.TEXT_INPUT은
1 기본적으로 해당 텍스트 필드에서 넘어온 값을 표시하는 함수를 갖는다.
2 커서를 텍스트 맨뒤로 이동시킨다.

* event.preventDefault : 이벤트실행(behavior)을 막는다...

* appendText -> txt.text += "내용"
메서드는 추가 할당(+=)을 text 속성(예: someTextField.text += moreText)에
하는 것보다 효율적입니다.

* 글자입력 코드를 아스키로 분석하여 변환
String.formCharCode(e.text.charCodeAt(0) + 3)
입력된 클자보다 3이후의 값을 가진 문자를 반환


* tabIndex : 순차적으로 번호를 부여하여 순차적으로 포커스를 바꾸어 준다.

* FocusEvent.FOCUS_IN / FocusEvent.FOCUS_OUT : 포커스에 반응하는 이벤트

* as3에서는 비밀번호 ( * )를 하기위한 메서드 : 텍스트필드.displayAsPassword = true;

* 텍스트필드 마키
-키메서드
 텍스트필드.scrollH += 5 : 내용이 가로로 이동한다.
 텍스트필드.maxScrollH : 입력된 내용에 따른 스크롤 최대값을 산출

* 텍스트 포맷 적용
 텍스트필드.setTextFormat(tf) : 지금현재 텍스트 필드의 특성을 텍스트 포맷(tf)으로 설정(한번만)
 텍스트필드.defaultTextFormat = tf : 앞으로 텍스트필드에 텍스트형태를 tf으로 계속 설정

Posted by 버터백통
Tip And Tech2008. 5. 16. 15:39

MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object

-Object : 모든 클래스는 오브젝트를 상속받는다....(상속 : 부모의 기능을 모두 가지는 것)

-EventDispatcher : 듣고 말하기가 가능
  - addEventListener()
  - removeeventListener()
  - dispatchEvent()

-DisplayObject : 눈에 보이는 객체(사용자반응 없다 )
  :일반 속성(x , y, rotation ...)
  parent{Shape , Graphics , bitmap}

-interactiveObject : 텍스트필드 , 심플버튼 ,
  마우스 이벤트 , 키보드 이벤트 , 포커스이벤트

- DisplayObjectContainer: 디스플레이 오브젝트를 담을수 있는 클래스
  :Child , index(자식들의 z-order : 자동관리)
  :addChild , addChildAt , removeChild() , removeChildAt ,
  :getChildAt , getChildAt , numChildren , contains(포함여부)

  => sprite , Stage , Loager로 상속

- Sprite : 프레임이 없는 무비클립

- MovieClip : 일반적인 무비클립[Embed시에 최소2프레임이상 되어야 MovieClip클래스로 캐스팅가능]

Posted by 버터백통
접근제한자 : public(모든 공개적 접근) , private(클래스 내부 접근) , protected(상속받은 클래스에서 접근) , internal(같은 패키지에서만 접근)

변수 : 코드안에서의 데이터 저장 공간

함수 : 명령문 집합의 코드 블록

스코프 : 무비안의 코드에서 언제.어디에서 접근 가능한지를 표현

이벤트 핸들러 : 이벤트에 반응하여 실행되는 함수나 메소드.

객체와 클래스 : sprite나 텍스트, 컬러나 날짜등 액션스크립트를 프로그램적으로 제어가능하게 하는 것 들

메소드 : 객체에서 실행할수 있는 관련된 함수

속성 : 읽기와 쓰기가 가능한 객체의 특성(attribute) , 가끔 읽기만 가능한 속성도 있다.

문장 : 명령어를 구성하기위한 문장, 경로+명령문

주석 : 코드의 설명
 
인터프리터 : 액션스크립트를 컴퓨터에서 인식가능한 언어로 만드는 장치
Posted by 버터백통