두점 사이의 거리를 구하기 위해서는 피타고라스의 정리를 사용한다.
사용자 삽입 이미지
[ 피타고라스 정리 ]

그림 처럼 빗면 c의 크기를 구하기 위해서 "밑변 a의 제곱과 높이 b의 제곱을 더하면 c제곱이다."의 식을 이용한다. as3에서는 거듭제곱의 값을 구하기 위해 Math.pow( 값  , 제곱근 )를 사용한다. 따라서 피타고라스의 식을 다음과 같이 사용할 수 있겠다.
Math.pow( c , 2 ) = Math.pow( a , 2 ) + Math.pow( b , 2 )
위의 코딩은 c2 = a2 + b2와 같다. 그리고 정확한 값을 구하기 위새서는 제곱근을 구해야 한다. 제곱근을 구하는 방법은 Math.sqrt()를 사용한다. * 참고 : 제곱근(위키백과)
따라서 제곱을  하여 구한 값에 Math.sqrt()를 하여 제곱근을 구한다.
c = Math.sqrt(  Math.pow( a , 2 ) + Math.pow( b , 2 ) )

하지만 as3에서는 Point()라는 오브젝트를 상속받은 2차원 좌표계에서의 표현하는 클래스가 있다.
이것을 활용하여 거리를 구할 수 있다.



 
위의 플래시는 피타고라스 정리와 Point를 사용하여 구한 값을 비교해 보았다.
//Point.distance
var pt1:Point = new Point(p1.x , p1.y );
var pt2:Point = new Point(p2.x , p2.y );
txt1.text = String( Point.distance( pt1 , pt2 ) );
 
//피타고라스 정리
var a:Number = p2.x - p1.x;
var b:Number = p1.y - p2.y;
var c:Number = Math.sqrt( Math.pow(a,2) + Math.pow(b,2) )
txt2.text = String(c);


Posted by 버터백통

AS3에서는 각도를 일반각(degree)으로 표현한다. 하지만 Math클래스의 sin,cos등에서 계산하는 값은 라디안(radian)값을 사용한다. 따라서 이 두가지 값을 서로 변환가능하게 하여야 하는데 다행이 변환식은 쉽다.

사용자 삽입 이미지
* 각도의 변환
호도각 -> 일반각 : 값 * 180 / Math.PI;
일반각 -> 호도각 : 값 * Math.PI / 180;



Posted by 버터백통

숫자에 국가의 통화표시를 하고 싶을 때는 뭐..그냥 개발하여도 되지만 NumberFormat에 currencyFormat()라는 것이 있으니 사용법을 살펴보자...

NumberFormat을 사용하여 10,000,000,000등의 값을 마스크를 적용하여 format이라는 메서드를 통해 반환받는것을 보았다. 반환시에 국가의 통화기호를 자동으로 붙여서 반환하도록 하기 위해서는 currencyFormat()를 사용하는데 format과 마찬가지로 국가를 선택하여야 한다. 국가가 없을 때는 심볼을 바꾸어 표시한다.

var numberFormat:NumberFormat = new NumberFormat( );
trace( numberFormat.currencyFormat(10000) )      // 출력 : €10,000.00
이처럼 currencyFormat을 사용하면 format()처럼 그루핑과 소수점을 분리하는데 앞이나 뒤에 국가의 화폐기호를 붙여준다. 위의 코드에서는 국가를 정하지 않았기 때문에 switch의 default인 " €(\u20AC) "를 출력하게 되었다. 따라서 국가 Locale을 정해서 넘겨야한다.

trace( numberFormat.currencyFormat(10000 , new Locale(Locale.KOREA) ) )
// 출력 : 10,000.00원

숫자뒤에 오는 파라미터에 국가를 설정하면 해당국가에 맞추어서 금액을 출력한다.
* 위의 결과는 한국에 맞게 NumberFormat와 Locale을 아래와 같이 수정하였습니다.
외국에서 만든 라이브러리 이므로 받아서 각자 수정해서 사용하도록 자리만 잡아두고 있어 정확한 화폐단위가 출력 되지 않습니다. 따라서 Locale클래스에 우리나라 국가를 추가하였다

...Loacle클래스
public static const KOREA:String = "kr";

그리고 NumberUtilities클래스의 case문에서 우리나라에 해당하는 자리를 수정하였다.
....NumberFormat
 case "kr":      
 // 원래 sv라는 족보도 없는 기호로 우리 국가명이 검색되었었다..이를 kr로 수정하였다.

          oSymbols.currency = "원";        
         // 이곳에 kr이라는 화폐기호가 있었다. 이것을 "원"으로 수정하였다

          oSymbols.group = bCurrency ? "," : " ";
          oSymbols.decimal = ".";
          oSymbols.before = false;
          break;
이처럼 수정하였다면 Locale.KOREA로 국가를 설정할 수 있다.

수정하기 싫으신 분들이나 1번정도만 다른  기호를 보여주어야 할 때 오브젝트를 통해 값을 그때 그때 마다 수정할 수 있다.

trace( numberFormat.currencyFormat(10000 ,
{ group:"," , decimal:"." , currency:"원" , before : false } ) )
// 출력 : 10,000.00원

두번째 파라미터에 오브젝트를 넘겨 각 심벌을 교체한다. currency는 화폐기호나 특정 심볼을 적으면 되고
before는 true이면 기호가 숫자앞에 위치하고 false면 숫자 뒤에 위치한다.

* format()과 심벌의 수정, 숫자의 mask를 알아보려면
NmberFormat 클래스를 이용한 공백이나 0의 삽입을 참고하면 된다



Posted by 버터백통

금융권이나 결제프로세스 등을 개발할 때 1000원이라는 단위를 표현하기 위해서는 1,000 이라고 뒤에서 부터 3개의 수를 끊고 " , " 컴머로 그룹을 만들어 준다. 또는 정확한 수를 표현하기 위하여 소수점을 섞어서 표현하기도 한다.

가령 1,234.56과 같은 수가 있다. 이처럼 통상적으로 소수점을 표현하거나 컴머로 그룹핑을 하는 것은 AS3에서 제공되지 않는다( 콜드퓨전에서는 제공한다. ) 따라서 이 역할만 전문적으로 전담하는 클래스(수의 단위를 표현하는 기능)가 있어야 한다.
여기서는 ascb의 라이브러리에서 util패키지에 NumberFormat 이라는 클래스를 활용하여 본다.

통상적으로 소수점 4자리까지 표현하고 만단위 까지 그룹핑하여 보여주고 싶다면 NumberFormat()의 생성자에서 마스크를 설정하여도 되고 mask라는 메서드로 접근하여 설정하여도 된다.
(mask는 setter/getter로 이루어져 있다)

* 수의 형태나 그루핑을 정하는 mask
마스크에서 파운드기호(#)는 어떠한 수나 공백으로 채워질 공간이고 ,는 그루핑하는 자리이다. 0은 숫자나 0으로 채워지도록 개발되어 있다.

* 마스크의 상수
0 : 숫자나 0으로 자리를 재워준다.
# : 숫자나 공백으로 자리를 채워준다.
. : 소수점의 공간이다.
, : 숫자를 그룹핑 한다.


##,###.000 이라는 마스크에 12345라는 수를 대입하면 결과는 12,345를 표현하게 된다.
또 1.2345를 대입하면 1.2345로 표현되고 1234.5를 대입하면 1,234.5로 표현된다.
12345      -> 12,345
1.2345     -> 1.2345
1234.5     -> 1,234.5


NumberFormat은 변수에 위임하여 생성한다.
var numberFormat:NumberFormat = new NumberFormat( "##,###.000" );
마스크는 생성자에서 설정하거나 또는 생성 후 mask 메서드를 통해 설정이나 수정할 수 있다.
numberFormat.mask = "#,###.00";
위와 같이 마스크를 ##.00으로 설정한 다음 아래와 같이 테스트한다.
trace(numberFormat.format( 1 ));                // 출력 : 1,00
trace(numberFormat.format( 12 ));              // 출력 : 12,00
trace(numberFormat.format( 123 ));            // 출력 : 123,00
trace(numberFormat.format( 1234 ));           // 출력 : 1.234,00
trace(numberFormat.format( 12345 ));         // 출력 : 1.2345,00


위의 출력 값을 보면 무언가 어색하다. 이는 프랑스나 스페인등에서 사용하는 통화 형식으로 우리와는 느낌이 다르다. 따라서 라이브러리에 Locale.slanguage라는 싱글턴 클래스로 접근하여 언어형식을 정한다. 상수는 Locale을 치고 코드힌트를 참고한다.

var numberFormat:NumberFormat = new NumberFormat( );
numberFormat.mask = "#,###.00";
Locale.slanguage = Locale.ENGLISH;
trace(numberFormat.format( 1 ));               // 출력 : 1.00
trace(numberFormat.format( 12 ));              // 출력 : 12.00
trace(numberFormat.format( 123 ));            // 출력 : 123.00
trace(numberFormat.format( 1234 ));           // 출력 : 1,234.00
trace(numberFormat.format( 12345 ));         // 출력 : 1,2345.00

trace(numberFormat.format( 12.3 ));            // 출력 : 12.30
trace(numberFormat.format( 123.4 ));           // 출력 : 123.40
trace(numberFormat.format( 1234.5 ));         // 출력 : 1,234.50


* 심벌 기호를 바꾸고 싶다
그루핑을 하는 " , " 심벌과 소수점을 표시하는 " . " 심벌은 다른 심벌로 교체가 가능하다.
var numberFormat:NumberFormat = new NumberFormat( );
trace(numberFormat.format( 1234567.89 , { group:" 컴머 " , decimal:" 점 " } ) ); 
// 출력 : 1 컴머 234 컴머 567 점 89

trace(numberFormat.format( 1234567.89 , { group:" * " , decimal:" ? " } ) );
 
// 출력 : 1 * 234 * 567 ? 89

delegate 객체에서 format을 정할 때 두번 째 파라미터의 값인 오브젝트를 통해
그룹을 정하는 group의 기호를 문자열로 선언하고, 소수점을 구분하는 기호인 decimal의 값도 문자열로
재선언하면 선언된 심벌로 교체하여 값을 보여준다.


AS3 cookbook이라는 사이트에서 이러한 라이브러리를 제공하고 있다.
라이브러리 다운로드

Posted by 버터백통
Math클래스에는 수를 반올림이나 올림 내림등을 제공하는 floor(내림) , ceil(올림) , round(반올림,반내림)를 제공한다. 앞서 Math클래스의 메서드를 살펴보았지만 소수점의 이동이나 5가 아닌 다른 값의 근접한 수로 반올림 또는 반내림 하고 싶을 때 약간의 연산이 필요하다.

* 소수점 자리의 값을 반올림 하고 싶다.
Math.round를 사용하면 소수점의 첫째 자리의 값이 5이상이면 반올림하고 5보다 적으면 반내림을 한다.
trace( Math.round( 25.5525 ) )     // 출력 : 26


그러나 소수점 두자리에서 끊어서 반올림하고 싶을 때는 소수점 이하 두자리 ".01"의 값으로 연산한다. 1은 곱하거나 나누어도 원래의 값을 반환한다는 것을 기억하자.
* 추억의 산수
- 300 / 1 = 300
- 300 * 1 = 300
- 300 / 0.1 = 3000 (소수가 없도록 제수(분자)와 피제수(분모)에 10의 거듭제곱을 곱한다)
- 300 * 0.1 = 30 (소수점 이하가 1자리 있으므로 300끝에 1자리 소수점이 붙는다. 30.0 )
위에서 보면 소수점 이하 n자리를 나누면 제수는 n개 만큼 뒤에 수가 붙고 소수점이하 n자리를 곱하면 제수의 단위는 n개 만큼 축소한다.

trace( Math.round( 25.5525 ) )     // 출력 : 26
위의 결과를 소수점 두자리에서 끊어서 연산하고 싶다면 아래와 같이 코딩한다.

trace( Math.round( 25.5525 / .01 ) * .01 )     // 출력 : 25.55
- ( 25.5525 / .01 ) 에서 10의 거듭제곱을 한 값인 2555.25를얻게 되고 .25는 5보다 적으므로 반내림한다.
따라서 Math.round( 25.5525 / .01 )는 2555를 반환하고 그 값에 .01을 곱하여 다시 2두리의 소수점의 값을 얻어낸다.



* 근접한 수가 5가 아닌 다른 수로 정하고 싶다
round()는 5를 기준으로 반내림이나 반올림을 한다.하지만 5가 아닌 다른 수로 반내림이나 올림을 하고 싶을 때는 위와 같은 방법으로 정수를 사용한다.

trace( Math.round( 25 / 6 ) * 6 )     // 출력 : 24
- 25의 1자리 수가 6을 넘지 못했으므로 값은 24를 출력한다. 25를 6으로 분해하면 4.16의 값이 나온다. 6에 관하여 쪼개진 값을 반올림하면 4이고 다시 6을 곱하여 분해전의 값으로 복원한다.

trace( Math.round( 25 / 10 ) * 10 )    // 출력 : 30
- 방식은 위와 같고 자리수가 두자리인 10이다. 따라서 반올림과 내림의 기준을 10씩 끊어서 확인할 수 있다.

trace( Math.round( 30/ 10 ) * 10 )    // 출력 : 30

trace( Math.round( 25 / 100 ) * 100 )    // 출력 : 0
- 같은 방식이고 얻어진 값이 소수점이하 0.25 이를 다시 반올림하면 0이고 100을 곱하여도 0이다. 즉 100씩 끊어서 반올림이나 반내림을 하는 것이다.



Posted by 버터백통
개발시 특히 AS3로 개발하는 것은 보통 UI나 front 단계가 많이 있다... 앞으로 Math를 변형하거나 개량한 NumberUtilies클래스에 들어가기게 앞서 Math클래스를 간단하 살펴보고 넘어가도록 한다.
Math클래스는 상수로서 어디서든 delegate없이 사용이 가능하며 수학적 함수나 값을 표현하는 메서드들로 구성되어있다.

* 라디안 값을 계산하려면 다음 공식을 사용합니다.
  radians = degrees * Math.PI/180


* 라디안에서 각도를 계산하려면 다음 공식을 사용합니다.
  degrees = radians * 180/Math.PI
 
다음 예제에서는 45도 각도의 사인을 계산하기 위해 수식을 매개 변수로 전달합니다.
Math.sin(45 * Math.PI/180) 이 공식은 Math.sin(.7854) 공식과 같습니다.

참고: Math 함수 acos, asin, atan, atan2, cos, exp, log, pow, sin 및 sqrt는 CPU 또는 운영 체제에 사용되는 알고리즘에 따라 결과 값이 조금씩 다를 수 있습니다. Flash Player에서는 CPU(CPU가 부동 소수점 계산을 지원하지 않는 경우 운영 체제)를 호출하여 이러한 함수를 계산하므로 사용 중인 CPU 또는 운영 체제에 따라 결과가 약간 달라집니다.

[ 메서드 ]
abs(val:Number):Number

[static]
매개 변수 val에 의해 지정된 숫자의 절대값을 계산하고 반환합니다.
trace( Math.abs(25.55) )    //  출력 : 25.55
trace( Math.abs(-25.55) )   // 출력 : 25.55


ceil(val:Number):Number
[static]
지정된 숫자나 표현식의 올림값을 반환합니다.
trace( Math.ceil( 10.01 ) )   // 출력 : 11

floor(val:Number):Number
[static]
매개 변수 val에 지정된 숫자 또는 표현식의 내림값을 반환합니다.
trace( Math.floor( 10.99 ) )   // 출력 : 10

exp(val:Number):Number
[static]
자연 로그의 밑수(e)를 매개 변수 x에 지정된 지수로 거듭제곱한 값을 반환합니다.

log(val:Number):Number
[static]
매개 변수 val의 자연 로그를 반환합니다.

max(val1:Number, val2:Number, ... rest):Number
[static]
val1과 val2 또는 더 많은 값을 평가하고 가장 큰 값을 반환합니다.
trace( Math.max( 0 , 10 , 55 , 16 , 50) )   // 출력 : 55

min(val1:Number, val2:Number, ... rest):Number
[static]
val1과 val2 또는 더 많은 값을 평가하고 가장 작은 값을 반환합니다.
trace( Math.min( 0 , 10 , 55 , 16 , 50) )   //출력 : 0

pow(val1:Number, val2:Number):Number
[static]
val1을 val2만큼 거듭제곱한 값을 계산하여 반환합니다.
trace( Math.pow( 2 , 1) )    // 출력 : 2
trace( Math.pow( 2 , 2) )    // 출력 : 4
trace( Math.pow( 2 , 3) )    // 출력 : 8
trace( Math.pow( 2 , 4) )    // 출력 : 16


random():Number
[static]
0 <= n < 1인 경우 의사 난수 n을 반환합니다. 이전에는 값의 범위를 정하여 0부터 값까지의 값을 정수로 반환하였으나 지금은 소수점 포함 16자리수의 난수로 반환한다. 따라서 필요한 값을 얻기위해서는 적절한 연상을 하여야 한다.
var num:Number = Math.random(  )  * 100
trace( num )    // 출력 : 89.60435190238059
trace( Math.round( num) )    // 출력 : 90


round(val:Number):Number
[static]
매개 변수 val의 값을 가장 가까운 정수로 반올림하여 반환합니다.
trace( Math.round( 10.90) )    // 출력 : 11
trace( Math.round( 10.5) )    // 출력 : 11
trace( Math.round( 10.49) )    // 출력 : 10
trace( Math.round( 10.10) )    // 출력 : 10


sqrt(val:Number):Number
[static]
지정된 숫자의 제곱근을 계산하여 반환합니다.
trace( Math.sqrt( 4 ) )     // 출력 : 2
trace(2 * 2 )                  // 출력 : 4
trace( Math.sqrt( 10 ) )                                                                  // 출력 : 3.1622776601683795
trace( Math.round( 3.1622776601683795 * 3.1622776601683795 ) )          // 출력 : 10


sin(angleRadians:Number):Number
[static]
지정된 각도의 사인을 라디안 단위로 계산하여 반환합니다.

cos(angleRadians:Number):Number
[static]
지정된 각도의 코사인을 라디안 단위로 계산하여 반환합니다.

tan(angleRadians:Number):Number
[static]
지정된 각도의 탄젠트를 계산하여 반환합니다.

asin(val:Number):Number
[static]
매개 변수 val에 지정된 숫자의 아크사인을 라디안 단위로 계산하여 반환합니다.
trace( Math.asin( -1 ) * 180/Math.PI );   // 출력 : -90
trace( Math.asin( 0 ) * 180/Math.PI );   // 출력 : 0
trace( Math.asin( 1 ) * 180/Math.PI );   // 출력 : 90


acos(val:Number):Number
[static]
매개 변수 val에 지정된 숫자의 아크코사인을 라디안 단위로 계산하여 반환합니다.
trace( Math.acos( -1 ) * 180/Math.PI );   // 출력 : 180
trace( Math.acos( 0 ) * 180/Math.PI );   // 출력 : 90
trace( Math.acos( 1 ) * 180/Math.PI );   // 출력 : 0


atan(val:Number):Number
[static]
매개 변수 val에 지정된 탄젠트 값에 해당하는 각도를 라디안 단위로 계산하여 반환합니다.


atan2(y:Number, x:Number):Number
[static]
y/x 점의 각도를 라디안 단위로 계산하여 반환합니다. 각도를 측정할 때는 원의 x 축에서부터 반시계 방향으로 측정합니다. 0,0은 원의 중심을 나타냅니다.
trace( Math.atan2( 100 , 100 )* 180/Math.PI );   // 출럭 : 45

[ 상수 ]
E : Number = 2.71828182845905
[static]
자연 로그의 밑수에 대한 수학 상수이며 e로 표현됩니다.

LN10 : Number = 2.302585092994046
[static]
10의 자연 로그에 대한 수학 상수입니다. 이 상수는 loge10으로 표현되며 근사값은 2.302585092994046입니다.

LN2 : Number = 0.6931471805599453
[static]
2의 자연 로그에 대한 수학 상수입니다. 이 상수는 loge2로 표현되며 근사값은 0.6931471805599453입니다.

LOG10E : Number = 0.4342944819032518
[static]
밑수가 10인 상수 e(Math.E)의 로그에 대한 수학 상수입니다. 이 상수는 log10e로 표현되며 그 근사값은 0.4342944819032518입니다.

LOG2E : Number = 1.442695040888963387
[static]
밑수가 2일 때 상수 e의 로그(log2e)에 대한 수학 상수이며 근사값은 1.442695040888963387입니다.

PI : Number = 3.141592653589793
[static]
원주율에 대한 수학 상수입니다. 이 상수는 pi로 표시되며 값은 3.141592653589793입니다.

SQRT1_2 : Number = 0.7071067811865476
[static]
1/2의 제곱근에 대한 수학 상수이며 근사값은 0.7071067811865476입니다.

SQRT2 : Number = 1.4142135623730951
[static]
2의 제곱근에 대한 수학 상수이며 근사값은 1.4142135623730951입니다.


Posted by 버터백통
서로 다른 타입의 진수를 변환하고 싶을 때는 toString()메소드와 parseInt()를 이용한다. parseInt()는 문자를 Int형태의 숫자로 변환하고 toString()은 수를 문자형태로 변환한다.

parseInt( 숫:String , radix )
두개의 파라미터가 있는데 첫째는 변환할 문자형 숫자이며 두번째는 radix라는 진수표현값을 넣는다. 10진수이면 10(기본 0으로 잡혀있는데 이는 10진수로 표현한다.)이고 16진수이면 16을 입력한다.
trace(  parseInt("11111111",2)) // 출력 : 255
trace(  parseInt("ff",16))  // 출력 : 255


toString( radix )
radix를 제공하는 메서드를 사용하면 같은 방법으로 진수를 인자로 정하면 된다.
toString(10)은 10진수로 표현 toString(2)는 이진수로 표현 toString(16)은 16진수로 표현한다.
trace( int(255).toString(2) ) //출력 : 11111111
trace( int(255).toString(16) ) // 출력 : ff

Posted by 버터백통
액션스크립트 3.0에서는 3가지의 수를 제공한다.
첫째로 모든 실수를 표현하는 Number가 있고 정수(음수포함)를 표현하는 int (integers)와 마지막으로 양의 정수만 표현하는 uint (unsigned integers)가 있다.
그리고 이들은 모두 10진수 형태로 표현하게 된다.

수를 표현하는 방법에는 2진수와 8진수 10진수 16진수 등이 있는데 2진수는 0,1로만 표현한다. 영화 매트릭스에 보면 이런거 많이 나온다. 8진수는 0~7의 수로 표현한다. 10진수는 우리가 일상에서 사용하는 수의 표현과 같고 16진수는 앞에 0x 가 붙어서 표현한다. 0~9가지 표현하고 A~F로 나머지 10이상의 값을 표현한다.

이진수로서 나름 가장 큰 값을 표현하면 0보다는 1이고, 1111은 16진수의 F(10진수로는 15)와 같다.
색상의 범위에서 흰색의 값이 0xFFFFFF이면 R=255 , G=255 , B=255이다. 16진수로(0xRRGGBB) 흰색은 0xFFFFFF이고 이진수로는 11111111이 16진수에서 FF(10진수로는 255)이다.
따라서 이진수 4개는 하나의 16진수가 된다.

* 컴퓨터에서는 항상 수를 셀때 0부터 세게된다. 따라서 8진수는 0부터 8번째인 7이 마지막 숫자이며 16진수는 0~9 가지 10개를 표현하고 나머지 6개는  A B C D E F로 표현한다.


Posted by 버터백통

앞에서 크로스 스크립팅에 대한 보안에 대하여 간략히 짚어 보았는데 속성과 메서드 정도만 다시 정리하여보자.
보안 이슈가 발생하는 상황은 그림과 같이 서로 다른 도메인에서 서로간 통신시 발생한다.

사용자 삽입 이미지

그림 처럼 다른 도메인의 무비가 한 무비를 불러들여 자신에게 포함한다. 포함한 무비 main.swf가 content.swf의 메서드나 속성을 제어하려고 하면 포함당한 무비입장에서는 '과연 자신의 정보를 보여주어야 하느냐?'에 대한 이슈가 발생한다. 만약 달라는대로 다 준다면...보안에 헛점이 많은 프로그램이였을 것이다. 어찌되었건 불려진 무비입장에서는 개발 당시 특정 도메인에 관해서는 자신의 정보를 주어도 좋다는 허락하에 속성이나 메서드등을 제공하게 된다.
개발시 content.swf에 Security.allowDomain("aaa.com");와 같이 aaa.com에 대하여 보안을 허용한다.

[ 속성 ]
exactSettings : Boolean

[static]
카메라 및 마이크 권한, 저장소 할당량 및 영구 공유 객체 저장에 대한 설정을 비롯한 특정 Flash Player 설정에 사용할 도메인을 선택하는 방법을 결정합니다.

sandboxType : String
[static] [read-only]
호출하는 SWF 파일이 작동 중인 보안 샌드박스의 유형을 나타냅니다.


[ 메서드 ]
allowDomain(... domains):void
[static]
지정된 도메인의 SWF 파일과 HTML 파일이 allowDomain() 호출을 포함하는 SWF 파일의 객체 및 변수에 액세스할 수 있도록 합니다. 단 도메인이 IP와 매핑되더라도 IP주소를 넣었을 때 허용되지 않는 경우가 있다. (여러개의 서버를 사용하여 한개의 도메인을 관리할 경우...등) 그때는 아래의 allowInsecureDomain를 사용한다. 가만히 보면 배열이 파라미터의 값이므로 여러개의 사이트를 등록할 수 있다.

allowInsecureDomain(... domains):void
[static]
지정된 도메인의 SWF 파일과 HTML 파일이, 호출하는 SWF 파일(HTTPS 프로토콜을 통해 호스팅되는)의 객체 및 변수에 액세스할 수 있도록 합니다. 이 보안 모드는 보안단계가 조금 취약할 수 있다.

loadPolicyFile(URL:String):void
[static]
 url 매개 변수에 지정된 위치에서 크로스 도메인 정책 파일을 로드합니다. XML파일명은 crossdomain.xml로 만들어 줍니다. 과거에는 사이트 루트 폴더에 같이있어야 했지만 지금은 경로를 통해 xml 파일을 읽어 올 수 있다.
Security.loadPolicyFile("http://www.example.com/sub/dir/crossdomain.xml");

* crossdomain 정책
<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" to-ports="507" />
    <allow-access-from domain="*.foo.com" to-ports="507,516" />
    <allow-access-from domain="*.bar.com" to-ports="516-523" />
    <allow-access-from domain="www.foo.com" to-ports="507,516-523" />
    <allow-access-from domain="www.bar.com" to-ports="*" />
</cross-domain-policy>



showSettings(panel:String = "default"):void
[static]
Flash Player에서 [보안 설정] 다이얼로그 패널을 열어준다.
첫번째 파라미터의 값은 SecurityPanel의 static속성으로 정의 되어있다.
가령 사용자가 로컬에 저장되는 정보를 설정하려 할 때 아래와 같이 코딩한고
Security.showSettings(SecurityPanel.LOCAL_STORAGE);

사용자 삽입 이미지
마이크의 음량을 조절하고 싶을 때는 아래와 같이 코딩한다.
Security.showSettings(SecurityPanel.MICROPHONE);
사용자 삽입 이미지

[ SecurityPanel의 상수 ]
CAMERA : String = "camera"
[static]
Security.showSettings()에 전달하면 Flash Player 설정에 [카메라] 패널이 표시됩니다.

DEFAULT : String = "default"
[static]
Security.showSettings()에 전달하면 사용자가 Flash Player 설정을 마지막으로 닫을 때 열려 있던 패널이 표시됩니다.

LOCAL_STORAGE : String = "localStorage"
[static]
Security.showSettings()에 전달하면 Flash Player 설정에 [로컬 저장 설정] 패널이 표시됩니다.

MICROPHONE : String = "microphone"
[static]
Security.showSettings()에 전달하면 Flash Player 설정에 [마이크] 패널이 표시됩니다.

PRIVACY : String = "privacy"
[static] Security.showSettings()에 전달하면 Flash Player 설정에 [개인 정보 설정] 패널이 표시됩니다.

SETTINGS_MANAGER : String = "settingsManager"
[static] Security.showSettings()에 전달하면 [설정 관리자]가 별도의 브라우저 윈도우에 표시됩니다.





Posted by 버터백통

플래시에는 Stage라고 하는 플레이어 가장 바깥에 감쌓여 있는 계층이 있다.
바로 이곳이 마우스 커서와 제일 먼저 닿는 부분이기도 하고 플레이어의 view패널 영역 전부를 차지하고 있는 유일무이한 영역이자 객체입니다.

그리고 SWF당 한개의 Stage가 주어지고 이를 통하여 작업한 객체를 addChild하거나 속성 등을 제어할 수 있습니다. (아래의 스테이지 보안 참고)

[ 속성 : 도움말 참조 ]
align : String

Flash Player 또는 브라우저에서 스테이지 정렬을 지정하는 StageAlign 클래스 값입니다.

세로 정렬 가로 쓰기
       StageAlign.TOP    위쪽    중앙
       StageAlign.BOTTOM    아래쪽    중앙
       StageAlign.LEFT    중앙    왼쪽
       StageAlign.RIGHT    중앙    오른쪽
       StageAlign.TOP_LEFT    위쪽    왼쪽
       StageAlign.TOP_RIGHT    위쪽    오른쪽
       StageAlign.BOTTOM_LEFT    아래쪽    왼쪽
       StageAlign.BOTTOM_RIGHT    아래쪽    오른쪽



 displayState : String
사용할 표시 상태를 지정하는 StageDisplayState 클래스의 값입니다.
StageDisplayState.FULL_SCREEN : 플레이어 전체 화면에 걸쳐 Stage를 확장하도록 설정
StageDisplayState.NORMAL  : 플레이어를 표준 Stage 표시 모드로 되돌리도록 설정

focus : InteractiveObject
키보드 포커스가 있는 대화형 객체입니다. 포커스가 설정되어 있지 않거나 포커스 객체가 호출하는 객체에서 액세스할 수 없는 보안 샌드박스에 속한 경우에는 null입니다.
 stage.focus = 대상입력텍스트필드

frameRate : Number
스테이지의 프레임 속도를 확인하고 설정합니다.
stage.frameRate = 60

height : Number
표시 객체의 높이를 픽셀 단위로 나타냅니다.
단 값의 입력은 불가능 하고 값의 참조만 가능하다.

width : Number
표시 객체의 폭을 픽셀 단위로 나타냅니다.
* 위의 크기에 관련된 값은 무비의 크기가 아닌 무비에서 객체들이 있을 때 그 객체들의 폭의 합과 높이의 합이 반환된다. 가령 폭 500인 무비에 아무 객체도 없다면 stage.width는 0을 반환하고 폭이 100인 객체가 화면에 한개 있다면 stage.width는 100을 반환한다.


mouseChildren : Boolean
해당 객체의 자식에서 마우스 기능을 사용할 수 있는지 여부를 결정합니다.
복잡한 구조안에서 버튼이 중복되거나 마우스 사용 중지하고자 할 때 유용하다.
객체.mouseChildren = false 하면 해당 객체에 포함된 모든 계층의 마우스가 비활성화된다.
 
numChildren : int
[read-only]
해당 객체에 addChild()/addChildAt()등으로 붙어있는 자식 수를 반환합니다.
   
quality : String
Flash Player에서 사용할 렌더링 품질을 지정하는 StageQuality 클래스 값입니다.

StageQuality.LOW : 낮은 렌더링 품질입니다.
그래픽이 앤티앨리어싱되지 않고 비트맵이 다듬어지지 않습니다.

StageQuality.MEDIUM : 중간 렌더링 품질입니다.
2 x 2 픽셀 격자를 사용하여 그래픽이 앤티앨리어싱되고 비트맵이 매끄럽게 다듬어지지 않습니다.
이 설정은 텍스트가 포함되지 않은 무비에 적합합니다.

StageQuality.HIGH : 높은 렌더링 품질입니다.
4 x 4 픽셀 격자를 사용하여 그래픽이 앤티앨리어싱되고 무비가 정적일 때 비트맵이 매끄럽게 다듬어집니다. Flash Player에서 사용하는 기본 렌더링 품질 설정입니다.

StageQuality.BEST : 가장 높은 렌더링 품질입니다.
4 x 4픽셀 격자를 사용하여 그래픽이 앤티앨리어싱되고 비트맵은 항상 매끄럽게 처리됩니다.

scaleMode : String
사용할 크기 조절 모드를 지정하는 StageScaleMode 클래스 값입니다.

Stage
ScaleMode
.EXACT_FIT
 : 응용 프로그램의 원래 종횡비를 유지하면서 왜곡 없이 전체 Flash 응용 프로그램을 지정된 영역에 표시합니다. 응용 프로그램의 두 면에 테두리가 표시될 수 있습니다.

StageScaleMode.SHOW_ALL : 원래 종횡비를 유지하지 않고 전체 Flash 응용 프로그램을 지정된 영역에 표시합니다. 내용이 찌그러질 수 있습니다.

StageScaleMode.NO_BORDER : 응용 프로그램의 원래 종횡비를 유지하면서 왜곡 없이(일부는 잘릴 수 있음) 전체 Flash 응용 프로그램이 지정된 영역을 채웁니다.

StageScaleMode.NO_SCALE : 플레이어 창의 크기가 변경되는 경우에도 전체 Flash 응용 프로그램이 변경되지 않고 유지되도록 고정합니다. 플레이어 윈도우가 내용보다 작으면 내용이 잘릴 수 있습니다.



showDefaultContextMenu : Boolean
Flash Player 컨텍스트 메뉴에서 기본 항목의 표시 또는 숨김을 지정합니다.

stageFocusRect : Boolean
포커스를 받은 객체의 경계선을 광선으로 표시할지 여부를 지정합니다.

stageHeight : int
Stage의 현재 높이를 픽셀 단위로 지정합니다.

stageWidth : int
Stage의 현재 폭을 픽셀 단위로 지정합니다.

tabChildren : Boolean
객체의 자식에서 탭 기능을 사용할 수 있는지 여부를 결정합니다.

textSnapshot : TextSnapshot
[read-only] 이 DisplayObjectContainer 인스턴스에 대한 TextSnapshot 객체를 반환합니다.

[ 스테이지 이벤트 테스트 ]
function run() {
 stage.scaleMode = StageScaleMode.NO_SCALE;
 stage.align = StageAlign.BOTTOM_RIGHT;
 stage.frameRate = 60
 stage.addEventListener(Event.ACTIVATE, activateHandler);
 stage.addEventListener(Event.RESIZE, resizeHandler);
 stage.addEventListener(MouseEvent.CLICK, clickHandler);
 stage.addEventListener(Event.ENTER_FRAME, mouseChk)
}

function activateHandler(event:Event):void {
 trace("활성화된 이벤트: " + event.type);
}

function resizeHandler(event:Event):void {
 trace("크기 재설정 이벤트: " + event.type);
 sizeinfo.text = "무비폭: " + stage.stageWidth + " 무비높이: " + stage.stageHeight;
}
function clickHandler(event:MouseEvent):void {
 selectInfo.text = event.target + "를 클릭하였다";
}
function mouseChk(event:Event):void {
 xinfo.text = String( stage.mouseX )
 yinfo.text = String( stage.mouseY )
}
run();

이 코드는 stage객체에 이벤트를 걸어서 스테이지 활성화 될때나 크기가 변화할 때
resize이벤트등 stage에 관한 테스트입니다.




위의 파일은 다운받아  플래시 플레이어에서 크기를 줄이거나 늘려 보세요~





[ 참고 : 크로스 스크립팅에 대한 스테이지 보안 ]
경우에 따라서 이 Stage에 접근하려는 불려들여진 다른 SWF또는 불러온 SWF에서 불러들인 SWF의 메서드를 호출(크로스 스크립팅)하려면 Security.allowDomain()에서 보안샌드박스를 맞추어 주어야 한다.
가령 이미 Stage에 불려진 A.swf에서 B.swf를 불러들여 B의 run()이라는 메서드를 호출할 때 B.swf에는 A에 관하여 Security.allowDomain(A.swf가 있는 도메인) 허용해야 합니다.


스테이지 보안 항목은 아래와 같다.

                       속성                                   

              메서드            

align

         showDefaultContextMenu

       addChild()

displayState

     stageFocusRect

       addChildAt()

frameRate

     stageHeight

       addEventListener()

height

     stageWidth

       dispatchEvent()

mouseChildren

         tabChildren

       hasEventListener()

numChildren

         textSnapshot

       setChildIndex()

quality

         width

       willTrigger()

scaleMode





Posted by 버터백통

AS3에서는 이전 버전에 이어 시스템의 정보를 읽어오는 Capabilities라는 클래스와 Stage나 Security등을 제공하고 있다. 이들 중에 시스템 환경 검사에 관련된 Capabilities클래스를 다루어보자.
이 클래스는 시스템 정보를 반환하는 여러가지 속성이 있다

[ 속성 : 도움말 참조 ]
avHardwareDisable : Boolean
[static] [read-only]
사용자의 카메라와 마이크에 대한 액세스가 금지되었는지(true) 또는 허용되었는지(false) 여부를 지정합니다.

hasAccessibility : Boolean
[static] [read-only]
플레이어가 실행되는 환경에서 액세스 가능성 도구와의 통신을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasAudio : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에 오디오 기능이 있는지 여부를 지정합니다.

hasAudioEncoder : Boolean
[static] [read-only]
플레이어에서 마이크 입력 등의 오디오 스트림을 인코딩할 수 있는지(true) 또는 인코딩할 수 없는지(false)를 지정합니다.

hasEmbeddedVideo : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에서 포함된 비디오를 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasIME : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에 IME가 설치되어 있는지(true) 또는 설치되어 있지 않은지(false)를 지정합니다.

hasMP3 : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에 MP3 디코더가 있는지(true) 또는 없는지(false)를 지정합니다.

hasPrinting : Boolean
[static] [read-only] 플레이어가 실행되는 시스템에서 인쇄를 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasScreenBroadcast : Boolean
[static] [read-only]
플레이어에서 Flash Media Server를 통해 실행되는 스크린 브로드캐스트 응용 프로그램 개발을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasScreenPlayback : Boolean
[static] [read-only]
플레이어에서 Flash Media Server를 통해 실행되는 스크린 브로드캐스트 응용 프로그램 재생을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasStreamingAudio : Boolean
[static] [read-only]
플레이어에서 스트리밍 오디오를 재생할 수 있는지(true) 또는 재생할 수 없는지(false)를 지정합니다.

hasStreamingVideo : Boolean
[static] [read-only]
플레이어에서 스트리밍 비디오를 재생할 수 있는지(true) 또는 재생할 수 없는지(false)를 지정합니다.

hasTLS : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에서 NetConnection을 통한 네이티브 SSL 소켓을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasVideoEncoder : Boolean
[static] [read-only]
플레이어에서 웹 카메라 입력 등의 비디오 스트림을 인코딩할 수 있는지(true) 또는 인코딩할 수 없는지(false)를 지정합니다.

isDebugger : Boolean
[static] [read-only]
플레이어가 특수 디버깅 버전인지(true) 또는 정식으로 출시된 버전인지(false)를 지정합니다.

language : String
[static] [read-only]
플레이어가 실행되는 시스템의 언어 코드를 지정합니다.

언어
체코어 cs
덴마크어 da
네덜란드어 nl
영어 en
핀란드어 fi
프랑스어 fr
독일어 de
헝가리어 hu
이탈리아어 it
일본어 ja
한국어 ko
노르웨이어 no
기타/알 수 없음 xu
폴란드어 pl
포루투갈어 pt
러시아어 ru
중국어 간체 zh-CN
스페인어 es
스웨덴어 sv
중국어 번체 zh-TW
터키어 tr



localFileReadDisable : Boolean
[static] [read-only]
사용자의 하드 디스크에 대한 읽기 액세스가 금지되었는지(true) 또는 허용되었는지(false)를 지정합니다.

manufacturer : String
[static] [read-only]
Flash Player의 제조자를 "Adobe OSName" 형식으로 지정합니다.

os : String
[static] [read-only]
현재 운영 체제를 지정합니다.

pixelAspectRatio : Number
[static] [read-only]
스크린의 픽셀 종횡비를 지정합니다.

playerType : String
[static] [read-only]
플레이어 유형을 지정합니다.

screenColor : String
[static] [read-only]
스크린 색상을 지정합니다.

screenDPI : Number
[static] [read-only]
스크린의 dpi(인치당 도트 수) 해상도를 픽셀 단위로 지정합니다.

screenResolutionX : Number
[static] [read-only]
 스크린의 최대 수평 해상도를 지정합니다.

screenResolutionY : Number
[static] [read-only]
스크린의 최대 수직 해상도를 지정합니다.

serverString : String
[static] [read-only]
각 Capabilities 속성의 값을 지정하는 URL 인코딩 문자열입니다.

version : String
[static] [read-only]
Flash Player 플랫폼 및 버전 정보를 지정합니다.


다음은 trace()를 몇 차례 호출하여 flash.system.Capabilities 객체에 있는 값을 출력합니다.
package {
    import flash.display.Sprite;
    import flash.system.Capabilities;

    public class CapabilitiesExample extends Sprite {
        public function CapabilitiesExample() {
            showCapabilities();
        }
       
        private function showCapabilities():void
        {
            trace("avHardwareDisable: "     + Capabilities.avHardwareDisable);
            trace("hasAccessibility: "      + Capabilities.hasAccessibility);
            trace("hasAudio: "        + Capabilities.hasAudio);
            trace("hasAudioEncoder: "     + Capabilities.hasAudioEncoder);
            trace("hasEmbeddedVideo: "     + Capabilities.hasEmbeddedVideo);
            trace("hasMP3: "         + Capabilities.hasMP3);
            trace("hasPrinting: "       + Capabilities.hasPrinting);
            trace("hasScreenBroadcast: "    + Capabilities.hasScreenBroadcast);
            trace("hasScreenPlayback: "     + Capabilities.hasScreenPlayback);
            trace("hasStreamingAudio: "     + Capabilities.hasStreamingAudio);
            trace("hasVideoEncoder: "     + Capabilities.hasVideoEncoder);
            trace("isDebugger: "       + Capabilities.isDebugger);
            trace("language: "       + Capabilities.language);
            trace("localFileReadDisable: "    + Capabilities.localFileReadDisable);
            trace("manufacturer: "      + Capabilities.manufacturer);
            trace("os: "          + Capabilities.os);
            trace("pixelAspectRatio: "      + Capabilities.pixelAspectRatio);
            trace("playerType: "        + Capabilities.playerType);
            trace("screenColor: "       + Capabilities.screenColor);
            trace("screenDPI: "        + Capabilities.screenDPI);
            trace("screenResolutionX: "     + Capabilities.screenResolutionX);
            trace("screenResolutionY: "     + Capabilities.screenResolutionY);
            trace("serverString: "       + Capabilities.serverString);
            trace("version: "         + Capabilities.version);
       
        }
    }
}





Posted by 버터백통
Tip And Tech2008. 6. 7. 12:07

AS3에는 Event클래스나 MouseEvent클래스 KeyBoardEvent , FocusEvent등 다양한 이벤트들은 제공하여 준다, 이 이벤트 클래스를 활용하여 보기 좋게 이벤트 이름을 설정하거나 필요한 값을 이벤트에 실어서 보낼수 있게 만들어 보자.

가령 섬네일을 눌렀을 때 섬네일은 버튼이며 마우스 이벤트를 사용하면 된다.
thumb.addEventListener( MouseEvent.MOUSE_DOWN , onSelect )

function onSelect(  event:MouseEvent ):void
{
        섬네일을 눌렀을 때 할일...
}


그러면 해당되는 이미지가 커다란 다른 View Pannel에서 크게 보여진다고 하자. 이 때 섬네일에서 필요한 최소의 정보는 커다란 사진의 경로를 View Pannel에게 알려주는 것이다.
function onSelect(  event:MouseEvent ):void
{
        dispatchEvent( 발생시킬 이벤트 )
}

그러나 어도비에서 만들어준 기본 이벤트에는 view Pannel에게 알려줄 사진경로의 정보를 포함시켜서 이벤트를 발생시킬 수 없다... 따라서 우리는 나름대로의 이벤트를 만들어서 그안에 정보를 담아 보내주도록 한다.
아래와 같이 Event를 상속받아서 기능을 추가한다. 추가되는 기능은 photoURL라는 파라미터를 만들어서 이벤트가 발생할 때 그 값을 받아 넘겨주도록 하는 것이다.
package
{
import flash.events.Event;
public class SelectEvent extends Event
 {
  public static const Select:String = "select";
  public var photoURL:String;
 
public function SelectEvent ( photoURL:String , type:String, bubbles:Boolean=false, cancelable:Boolean=false )
  {
   super( type, bubbles, cancelable );
   this.photoURL= photoURL;
  }
 
  override public function clone() : Event
  {
   return new UserEvent(this.photoURL, this.type, this.bubbles, this.cancelable);
  }
 }
}

위의 SelectEvent를 섬네일에서 dispatch 하면 아래와 같이 코딩한다.
private var bigSizeURL:String = "큰사진의 URL경로"
function onSelect(  event:MouseEvent ):void
{
        dispatchEvent( new SelectEvent(this.bigSizeURL,"select") )
       //SelectEvent에
photoURL의 값을 자신의 bigSizeURL로 설정
}

이처럼 섬네일에서만 알고있는 자신의 큰사진경로를 이벤트 발생시 이벤트의 파라미터로 등록하고 발송한다.
viewPannel에서는 사진을 불러들여야 하므로 다음과 같이 리스너가 등록되어있을 것이다.
thumbList.addEventListener.(SelectEvent.Select , onLoadPhoto)
function onLoadPhoto( event:SelectEvent ):void
{
      var photoUrl : String = event.photoURL;//SelectEvent에 포함되어있는 파라미터
      이미지를 photoUrl 에서 불러오는 코드....
}

위처럼 viewPannel에서는 섬네일 목록을 SelectEvent로 보고있다가 이벤트가 발생하면 섬네일에서 넘겨주는
url정보를 바탕으로 큰 사진의 이미지를 불러오도록 하는것이다.
중요한 것은 이벤트도 클래스이며 이를 상속받아 기능추가하거나 재정의가 가능하여 필요에 맞게 고쳐서 사용하면 되는 것이다.





Posted by 버터백통
AS3나 자바등과 같은 OOP언어의 특징은 상속과 구현이다. 상속은 앞서 테스트해본 사용자정의 클래스만들기 부분에서 Test클래스와 같이 부모를 Sprite라는 프레임 없는 무비클립을 상속받았고 Test2클래스는 Test클래스를 상속받았으므로 위의 두성분을 모두 포함하고 있다고 설명하였다. 이처럼 부모의 성질을 이어받는 것이 상속이다.

[ 상속 ]
우선 상속이라는 개념을 살펴보면 그림과 같은 가계도를 갖는다.
사용자 삽입 이미지
그림을 보면 최상위 클래스인 James라는 놈에게서 son1과 son2가 부모의 성질을 받아 만들어졌다.
빨간색 글씨부분은 부모클래스인 James의 성질을 이어받았기 때문에 따로 만들어 주지 않아도 실행이 가능해졌다. 그리고 son1의 경우에는 추가로 2개의 성질을 더 만들어 주어 양손잡이가 되었고 게임도 좋아하게 되었다.
son2의 경우에는 1개의 성질만 추가하였기 때문에 영화를 좋아하는 성질을 갖게되었다.

이처럼 기본기능이 있는 부모클래스를 상속받아 프로젝트에 맞는 부가적인 메서드를 추가로 개발하는것을 상속이라고 생각하면 되겠다.
* 부모에게서 받은 성질중에 고치고자 하고싶은 것은 override하면 된다.
가령 james의 곱슬머리()를 자식클래스에서 기능을 바꾸고자 한다면
override 곱슬머리(){
바꾸고자하는 머리스타일...
}
위처럼 기능을 재정의 하는것이다. (메서드의 재정의 override 참고)

[ 구현 ]
구현은 구조를 만들기 위해서 아주 중요한 부분이 된다.
개발을 하다보면 상속만 가지고는 어느 한계에 마주치게 되고...그 때 아쉽게 생각이 드는 것이 다중 상속이라는 것을 생각하게 된다...하지만 그것은 불가능한 것이기 때문에 Interface라는 것을 만들어 여러형태로 바라볼 수 있게 만드는 것이다. 가령 위그림에서 son1은 James의 아들이다. 하지만 James의 아내가 Jena라면 son1은 Jena의 아들이기도 하다. 하지만 이를 표현하기 위해서 그림과 같은 상속구조에서는
절대 Jena라는 클래스와 son1의 관계를 표현할수 없는 단방향 구조를 갖게된다. OOP의 장점이자 단점인 부분인 것 같다.

그러면 이러한 구성을 Interface로 풀어보자.
사용자 삽입 이미지
James에 관해서는 상속으로 고리가 연결되어있다. 하지만 상속은 단일 상속밖에 되지않으므로 Interface Jena를 만들어 이를 구현하고자 하는 클래스에서 구현(implements)하게 된다. 그러면 Son1과 Son2에는 James의 성질을 갖으면서 Jena의 성질도 포함하게 된다. 중요한 것은 나중에 이들을 부를(호출)때 James의 아들로 호출하여도 되고 Jena의 아들로 호출하여도 이 Son클래스들은 바라보게 된다는 것이다.

만약 이들을 코드로 본다면 다음과 같다.
Package는 생략...
public class Son1 extends James implements Jena
{
//Son1의 생성자(new로 호출했을 때 실행되는 부분)
public function Son1()
{

}
기타 필요한 메서드...
}


Jana의 코드
package
{
 public interface Jena
 {
jena의 설징을 결정할 메서드들 정의
 }
}
Jena는 인터페이스이다. 인터페이스는 항상 public이나 internal로 스코프를 갖게된다.
이들은 이들을 구현할 클래스를 성질을 구분짓기 위해 주로사용되고 인터페이스 내부에는 메서드만 정의해 놓는다. 상세코드는 구형하지않는다.
가령 Jena는 Beauty()이라는 속성만 가지고있다면 아래처럼 코딩한다.
package
{
 public interface Jena
 {
    function Beauty():void

 }
}

이처럼 실행문을 코딩하지 않는다. 이들의 실행문은 이를 받아 구현하는 Son1이나 Son2에서 필요에 따라 작성하면 된다. 단 인터페이스에서 함수가 있다면 해당  함수를 반드시 포함하고있어야한다.
public class Son1 extends James implements Jena
{
  public function Son1()
  {

  }
  function Beauty():void
  {
      필요하다면 기능 구현
  }
}

이렇게 된다면 Son1은 아름답다라는 성질도 갖게되는 것이다. 이 성질은 jena에게서 온것이다.
아쉬운점은 인터페이스에서 상세 구현이 불가능하므로 상속처럼 성질을 이어받으면 호출에서 실행시킬 때 따로 구현할 필요가 없지만 인터페이스는 그때, 그때 상세 코드를 구현하여야 한다..ㅜㅜ;;
하지만 이거라도 되는게 어딘가...

만약 다음과 같은 상황이 있다고 가정하여 보자.
사용자 삽입 이미지

그림을 보면 새를 상속받은 [독수리] , [닭] , [새인형]이라는 클래스가 3개 있다.
이들은 모두 새라고 생각할 수 있다. 이제 이들을 구분지어 보면 누가 "날 수있는 것 모이세요!"하고 외쳤다. 그럼 독수리만 모이게 될것이다. 그럼 "소릴 낼수 있는것 모이세요!"라고 한다면 독수리와 닭이 모일것이며 "새들은 모이세요!"한다면 독수리,닭,새인형 모두 모일 것이다.. 이것은 클래스의 성질을 가지고 구분지을 수 있다는 말이다.

가령 화면에 객체들이 흩어져있다. 이들을 드래그하여 여러개 선택한 다음에 지우기 버튼을 눌러서 지우려고 한다. 그럼 지워질 수 있는 객체는 del()이라는 메서드가 실행되겠지만 지울수 없는 객체는 del()이라는 메서드가 포함되어 있질 않아서 에러를 발생할 것이다. 그럼 del이 있는 객체만 골라서 실행해야하는데
if( 선택된 객체 is Removable ){
    선택된 객체.del()
}
과 같이 객체의 성질을 검사하여 조건문에 의해 선택적으로 실행할 수 있다.
* Removable은 del()을 선언한 인터페이스이다. Removable인터페이스를 implements한 객체는
 반드시 del()이라는 메서드를 구현해 놓아야 하므로 조건식에 만족한다면 del()을 실행시킬 수 있다.






Posted by 버터백통
Flash Player 102008. 5. 31. 16:48

드디어 CS4라는 거물이 등장하게 되었다...지금까지는 구조적인 부분에 많은 변화를 갖게된 CS3와 AS3로서 충분히 우리 개발자들을 괴롭히고 있지만, CS4녀석은...녀석은 드디어 3D엔진과 물린 엔진을 포함하고 나타나게 되었다...

예전에 3d맥스를 할 때 관절점이나 조절점등의 캐릭터 스튜디오등의 물리역학을 CS4나 플렉스등 어도비 계열 툴에서 다룰수 있게 된것이다.
더욱 놀라운 것은 mc.z;; mc.rotationY;;... 등 3차원 개념의 속성이 등장 하게 되었고...
그 외에도 웹상에서 파일을 직접 저장하거나 찾아서 올릴수 있게 되었다..
이부분은 설치파일을 다운받아 설치하고 다시 컨텐츠를 다운받아 설치해야하는 성가신 부분을 상당부분 해결해 주지 않나 싶다.

뭐 여햐튼 무지 기쁘지 않은 소식이겠지만거도 그동안 물리나 3D 알고리즘을 공부하거나 준비하신 분들은
시원 섭섭한..뭐 그런 기분 아닐까 싶다...
실제로 저 같아도 몇가지 부분은 이제 기본 메서드로 제공 받을 수 있기 때문에 이제 나쁜 머리 굴려가며
알고리즘 연구할 수고가 덜게 되었다..하지만 특정분야 진입장벽도 같이 허물어지는 뭐 그런 기분이다~
ㅎㅎㅎㅎㅎ;;;;

Posted by 버터백통

어떠한 에러가 발생하였을 때 적절한 실행문을 실행하고자 할때는 throw문을 이용하여 탐지하도록 한다.
문법에러인 경우에는 개발시 컴파일러가 잡아주지만 그외의 에러인 경우에는 이를 통해 제어할 수 있다.
가령 동적객체에서 발생하는 에러라던가 네트웍 등에서 발생하는 에러인경우에 유동적으로 대처를 할 수 있다

* throw문은  에러를 순간 발생 시켜 Error객체를 생성하게 된다.
throw new Error( argument )
Error 객체의 생성자에는 문자열로 값을 받도록 되어있어 어떠한 에러인지를 메세지처리 할 수있다.
throw new Error( "필요한 값을 받지 못했습니다." );
throw new Error( "네트워크에 연결되지 않았습니다." );
..............
등과 같이 필요한 메세지를 전달하여 얼럿창을 이용하거나 적절한 조치를 취할 수 있도록 한다.

이처럼 에러가 발생하였을 때 처리해주는 부분은 try~catch문에서 처리하게 된다.
- throw문은 try블럭안에 작성되어있어야 하고 만약 에러가 발생하게 되면 catch문의 코드 블럭이 실행된다.
try{
명령문1
명령문2
........
throw new Error("에러가 발생하였다")
명령문3
}catch(위임된 객체:Error){
에러발생시 처리할 명령문
trace( 위임된 객체.message )
}
에러가 발생하지 않는다면 명령문1~명령문3까지 모두 실행하겠지만 명령문2 이후에 에러가 발생하면
try문에서 빠져나가 catch문의 명령문을 실행하게 된다. 이때 throw에서 생성한 Error객체의 메세지를 확인하기 위해서 catch문에 delegate를 선언하여 이 객체로 접근이 가능하다.

예1) 에러 발생만 체크
try {
 trace("1");
 trace("2");
 
throw new Error("에러 발생");
 trace("3");
} catch (obj:Error) {
 
trace(obj.message);
}

* 실행결과 : 화면에 "1    2     에러 발생" 이라고 순서대로 출력

예2) 네트워크에서 msg라는 값을 받아 처리라고 가정
var msg:String //어디선가 넘겨주게 될 값이라고 가정
try {
 if(msg == undefined){
  throw new Error("필요한 값을 받지 못하였습니다.")
  }
 trace("계속 진행");
} catch (obj:Error) {
 trace(obj.message);
}
만약 위의 코드가 네크워크에서 값을 받아 변수 msg라는 곳에 넣었다고 할때 값이 없으면 에러가 발생하고 그렇지 않으면 "계속 진행"을 출력하게 된다. 지금과 같은 경우에는 msg에 값이 없으므로 throw에 의하여 catch문의 trace가 실행하게 되지만 변수 msg = "어떠한 값"으로 값이 있는 경우에는 throw문은 실행하지 않는다.

* try문에 모든 코드를 넣자니 코드가 보기에 좋지 못하다.
  따라서 try 블럭에 함수를 넣어 실행시키도록 한다.

var id:String;
var u_name:String;
var msg:String;

//네트워크와의 통신하는 함수
function sendAndLoad():void
{
 trace("네트워크와 값을 교류했습니다.")
 각 변수들에게 받은 값을 대입...
}

//교류된 값을 정상적으로 받았는지 체크
function chkParams():void
{
 if(id == undefined) throw new Error("아이디가 없습니다.");
 if(u_name == undefined) throw new Error("이름이 없습니다.");
 if(msg == undefined) throw new Error("메세지가 없습니다.");
}

//정상적으로 값이 설정되면 실행
function makeDisplay():void
{
 trace("화면에 필요정보를 만든다.")
}

try{
 sendAndLoad();
 chkParams();  -> 실제 throw가 있는 함수
 makeDisplay();
}catch( obj:Error ){
 trace( obj.message )
}
이처럼 각 함수를 만들어 try 블럭에 넣어서 실행하면 코드가 조금은 정리되어 보인다.


* finally 블럭 : catch문 다음에 사용되며 에러가 발생하더라도 실행되는 블럭
try{
  throw new Error("에러가 발생하였다")
}catch(obj:Error){
  trace( obj.message )
}finally{
  trace("무조건 실행된다.")
}



Posted by 버터백통
앞에서 속성 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 버터백통