AS3.0 Cookbook/배열2008. 6. 29. 16:28
일반적으로 배열하면 정수색인 배열을 많이 사용한다. 연관배열은 따로 오브젝트라고 호명하기도 한다.
배열의 선언법은 다양한다.
var ary = new Array();
ary = [ "처음 값" , "두번째 값" , "세번째 값"]

과 같이 new를 통해 메모리에 할당하고 ary에 Delegate한다. 배열 ary의 값을 입력하기 위한 두번째 코드에는
대괄호안에 컴머(,)로 구분하여 일련의 슬롯에 값을 위치한다. ary = [ "처음 값" , "두번째 값" , "세번째 값"]는
0번째 슬롯 즉 0번 원소의 값은 "처음 값"이라는 문자열이 들어있고 , 왼쪽에서 부터 3번째는 0부터 세어 2번 원소라 하고 그 값은 "세번째 값"이라는 문자열이 선언되었다.

trace( ary[0] )     // 출력 : "처음 값"
trace( ary[1] )     // 출력 : "두번째 값"
trace( ary[2] )     // 출력 : "세번째 값"


이처럼 정수 색인 배열은 최초로 선언되는 값(왼쪽 끝)의 원소를 0이라고 정하고 컴머로 각 원소를 1씩 증가하여 참조할 주소지를 정하게 된다. 따라서 정수 색인 배열의 원소는 다음과 같이 정해진다.
ary = [ 0번 원소 , 1번 원소 , 2번 원소 , 3번 원소....]

아래는 내가 자주 사용하는 선언식이다.
new Array()라는 생성자 없이 바로 변수명과 값을 선언한다.
var ary = [ "처음 값" , "두번째 값" , "세번째 값"]
또는 빈 배열이 필요할 때는 아래와 같이 빈값을 준다.
var ary = [ ]

값의 입력과 참조는 위와 같은 방법으로 사용하면 된다.
trace( ary[0] )     // 출력 : "처음 값"
trace( ary[1] )     // 출력 : "두번째 값"
trace( ary[2] )     // 출력 : "세번째 값
"

마지막으로 다음과 같은 선언식이 있다.
var ary = new Array( "처음 값" , "두번째 값" , "세번째 값" )
이처럼 생성자에서 바로 값을 주어 배열을 선언하기도 한다.

배열의 값을 위처럼 선언시 설정하기도 하지만 보통은 런타임시 값을 대입하거나 수정,설정할 때는 해당 원소를 찾아가 값을 선언한다.
가령 ary에 3번 원소에 값을 "네번째 값"이라고 선언하고 싶으면 아래와 같이 선언한다.
ary[3] = "네번째 값";
배열 ary를 출력하면 "처음 값" , "두번째 값" , "세번째 값" , "네번째 값"과 같이,
0~3까지 4개의 원소가 출력된다.

그럼 위의 배열에 다음과 같이 6번째 원소에 값을 입력하자.
ary[6] = "일곱번째 값"
출력하면 다음과 같이 나타난다.
"처음 값" , "두번째 값" , "세번째 값" , "네번째 값" , undefined , undefined , "일곱번째 값"
위와 같이 중간에 undefined 가 포함된 이유는 원소가 순차적으로 값을 가지고 선언된것이 아니라
원소 6이 문자열을 갖고 생성되면서 원소 4와 5에는 아무것도 없는 무( 無 )로서 undefined 로 표현된다.
* 참조 : undefined는 아무것도 값이나 이름조차 없는 공간이다.
null인 경우는 선언된 Delegate는 있지만 그 값이 비어있는 무( 無 )일때 표현된다.


이처럼 ary배열은 0부터 6원소까지 7개의 값을 갖는 배열이다. 이러한 배열의 길이는 구하는 것이 length()라는 메서드이다. 이 length()는 배열의 원소 길이를 정수로 반환한다.
var ary = [ "처음 값" , "두번째 값" , "세번째 값" , "네번째 값" ]
trace( ary.length() )     // 출력 : 4

배열의 길이는 자연수의 증가이므로 원소번호와 혼돈하면 안된다.
가령 ary = ["A"]라하면 0번째 원소를 갖은 길이 1인 배열이다.


[ Array 클래스의 메서드 ]
concat(... args):Array

매개 변수에 지정된 요소를 배열의 요소와 연결하여 새 배열을 만듭니다. Array

every(callback:Function, thisObject:* = null):Boolean
지정된 함수에 대해 false를 반환하는 항목에 도달할 때까지 배열의 각 항목에 테스트 함수를 실행합니다.

filter(callback:Function, thisObject:* = null):Array
배열의 각 항목에 테스트 함수를 실행하고 지정된 함수에 대해 true를 반환하는 모든 항목이 포함된 새 배열을 만듭니다.

forEach(callback:Function, thisObject:* = null):void
배열의 각 항목에 함수를 실행합니다.
 
indexOf(searchElement:*, fromIndex:int = 0):int
완전 항등 연산자(===)를 사용하여 배열의 항목을 검색하고 항목의 인덱스 위치를 반환합니다.
 
join(sep:*):String
배열의 요소를 문자열로 변환하고, 지정된 분리 기호를 요소 사이에 삽입하고, 요소를 서로 연결한 후 결과 문자열을 반환합니다.

lastIndexOf(searchElement:*, fromIndex:int = 0x7fffffff):int
배열의 마지막 항목부터 역순으로 항목을 검색하고 완전 항등 연산자(===)를 사용하여 일치하는 항목의 인덱스 위치를 반환합니다.

map(callback:Function, thisObject:* = null):Array
배열의 각 항목에 함수를 실행하고 원래 배열의 각 항목에 대한 함수 결과에 해당하는 항목으로 구성된 새 배열을 만듭니다.

pop():Object
배열에서 마지막 요소를 제거하고 해당 요소의 값을 반환합니다.
 
push(... args):uint
배열 끝에 하나 이상의 요소를 추가하고 배열의 새 길이를 반환합니다.

reverse():Array
배열의 순서를 뒤집습니다.
 
shift():Object
배열에서 첫 번째 요소를 제거하고 해당 요소를 반환합니다.

slice(startIndex:int = 0, endIndex:int = 16777215):Array
원본 배열에 포함된 요소 중 일정한 범위의 요소로 구성되는 새 배열을 반환하되, 원본 배열을 수정하지 않습니다.

some(callback:Function, thisObject:* = null):Boolean
true를 반환하는 항목에 도달할 때까지 배열의 각 항목에 테스트 함수를 실행합니다.

sort(... args):Array
배열의 요소를 정렬합니다.

sortOn(fieldName:Object, options:Object = null):Array
배열에 포함된 요소는 해당 배열 내의 하나 이상의 필드에 따라 정렬합니다.

splice(startIndex:int, deleteCount:uint, ... values):Array
배열에 요소를 추가하고 배열에서 요소를 제거합니다.

toLocaleString():String
지정된 배열의 요소를 나타내는 문자열을 반환합니다.

toString():String
지정된 배열의 요소를 나타내는 문자열을 반환합니다.

unshift(... args):uint
배열의 맨 앞에 하나 이상의 요소를 추가하고 배열의 새 길이를 반환합니다.


Posted by 버터백통
Tip And Tech2008. 6. 25. 11:03

과거 AS1에서는 대부분의 클래스가 동적 클래스 이므로  런타임시 변수를 선언하고 값을 줄 수 있었다. 하지만 AS3로 오면서 Object와 Array클래스 MovieClip클래스를 제외한 대부분의 사용가능한 클래스가 동적객체가 아니고 일반 public으로 비동적 객체로 설정되어있다. 따라서 이러한 비동적 객체에 런타임 변수를 설정하고 할때는 Dictionary()클래스를 사용해야한다.

동적 객체는 런타임시 무비클립에 mc.testVar = "변수값" 이라고 변수와 값을 설정할 수 있지만 Sprite등의 비동적 객체에는 런타임 변수설정이 불가능하다.

* AS1처럼 동적 변수 설정(AS3에서도 동적객체이 이와 같이 선언 할 수 있다)
function init():void
{
var man1:Object = new Object()
var man2:Sprite = new Sprite(); 
var man3:MovieClip = new MovieClip();
var man4:Array = new Array()

man1.testVar = "var 1"
man2.testVar = "var 2" -> 비동적 클래스인 Sprite이므로 런타임 변수를 줄 수 없다(에러발생)
man3.testVar = "var 3"
man4.testVar = "var 4"
}

위의 코드처럼 동적 클래스는 Delegate된 인스턴스 네임에 직접 접근하여 따로 속성이 없어도 변수와 값을 설정할 수 있다.
그러나 플렉스에서 사용하는 대부분의 UI기능을 하는 클래스는 Sprite(프레임이 없는 클래스)를 사용한다. 이 Sprite클래스는 비동적 클래스이므로 내부에 public변수나 setter / getter등으로 자리를 컴파일 시 마련해 두어야 한다. 하지만 어떠한 상황에 따라 런타임 변수를 설정해야하는 경우 Dictionary를 이용해야한다.

* Dictionary()
변수명을 Dictionary의 클래스 Delegate로 사용하고 그 안에 참조할 인스턴스 객체를 대입시킵니다.
개념적으로는 사용할 변수를 미리 설정하고 참조대상을 정하면 그 참조대상에 변수와 값을 딕셔너리를 통해 참조할 수 있습니다.. 방식으로 보면 "객체.변수 = 값"과 같은 형태가 아니고 사용할 변수(딕셔너리클래스)를 미리 선언하고 어떤 객체가 쓸 것인가를 정하는 "변수[객체] = 값"으로 사용방법이 조금은 낯설어 보입니다.

var addr:Dictionary = new Dictionary( );
var nick:Dictionary = new Dictionary( );
var age:Dictionary = new Dictionary( );


addr[ man1 ] = "삼성동";
addr[ man2 ] = "청담동";
addr[ man3 ] = "역삼동";
addr[ man4 ] = "갈월동";
   
nick[ man1 ] = "man1"
nick[ man2 ] = "man2"
   
age[ man1 ] = "34";
age[ man2 ] = "36";
age[ man3 ] = "32";
age[ man4 ] = "28";


이처럼  참조할 변수를 Dictionary 클래스로 선언하여 변수의 그룹을 만들어 줍니다.. 가령 "학교, 주소 , 이름 .."등 사용할 변수를 미리 딕셔너리로 설정하고 그 변수를 참고해야할 클래스를 대입시킵니다.
위의 코드에서는 man1~man4는 주소와 나이를 모두 알수있는 dictionary()참조가 있지만 별명은 man1~man2만 보유하고 있습니다.

값의 참조는 addr[ man1 ]과 같이 합니다.
tracce( addr[ man1 ] )              // 출력 : "삼성동"

for(var i:int=1; i<=4; i++ ){
    trace(addr[ this["man"+i] ])    //출력 : "삼성동"  "청담동"  "역삼동"  "갈월동"

 }

* Dictionary() 클래스를 생성시 생성자 파라미터가 weakKeys라는 부울변수가 있다,
  이는 weak reference의 성분을 설정하여 가비지 컬렉터의 대상여부를 설정합니다.

Posted by 버터백통
Tip And Tech2008. 6. 24. 12:15

*** 가비지 컬렉터 관련 이전내용을 아래 내용으로 업데이트 하였습니다. ***

현재는 디버거와 AIR프로젝트에서만 gc가 실행되고있습니다. 따라서 저를 포함한 많은 분들이 소위 낚였습니다. 자~알 실행되는 줄알고...하지만 일반 플레이어에서는 아무리 gc()를 실행하여도 메모리는 꿈쩍도 하지 않습니다.

많은 고민과 연구를 거듭한 결과 출처불명의 로컬커넥션을 이용한 방법이 있다고 들었고 시행착오와 명용이의 자문을 구해 테스트한 결과 정말 gc()가 실행되더랍니다..

로컬커넥션은 메모리에 통신이 가능한 주소지를 설정하여 이곳을 통해 send객체와 이를 바라보는 connect객체를 통해 서로다른 swf간 통신을 하게하는것입니다.
주소지의 등록은 connect("이름")을 통해 주소지를 등록하는데, 메모리에 같은 주소지를 두번 호출(할당)하게 되면 그때 에러를 발생하면서 시스템의 가비지 컬렉션이 실행하게 됩니다. 따라서 try~catch문을 사용하여 무비가 먹통이 되는것을 방지하여야 합니다.



이 파일을 디버거가 아닌 플레이어 실행결과 System.gc();는 실행되지 않고 LC에 의한 메모리 감소를 확인하였습니다.

var before:String = tmp.currencyFormat( System.totalMemory , {  group:"," , decimal:"." ,
                                                                                          currency:"" , before : false } );

try {
          new LocalConnection().connect('myConnection');
          new LocalConnection().connect('myConnection');
} catch (error:ArgumentError) {
          trace("이미 연결되어있다");
}

var after:String = tmp.currencyFormat( System.totalMemory , {  group:"," , decimal:"." ,  
                                                                                        currency:"" , before : false } );

memory.text = "before :" + before + ",  after :" + after;


테스트 코어부분입니다...테스트를 위해 설정하는 코딩이 너무 많아서 생략하고 실제 LC를 통한 가비지 컬렉터를 실행하는 부분입니다.


* 중요 참고 
gc()에 의해 제거 될수 있는 대상은 사용이 끝난 불필요한 말그대로 쓰레기를 회수합니다. 따라서 제거하고자 하는 대상은 화면에 붙어있다면 지워진 상태이며 이름은 null이고 addEventListener를 통해 바라보고 있는 객체가 있으면 안됩니다...지우거나 null까지는 어떻게 해보겠지만 다른클래스에 있는 리스너까지 손보려면 좀 성가시죠....따라서 addEventListener의 useWeakReference를 활용합니다.

* addEventListener 이외에도 Dictionary클래스에도  WeakReference를 제공합니다. 가비지 컬렉션 시스템에서는 WeakReference(약한 참조)를 무시하므로, WeakReference만 있는 객체는 가비지 컬렉션의 대상이 됩니다.
Posted by 버터백통

어떠한 객체를 회전운동하고 싶을 때는 원의 자취를 구하는 식을 이용하면 된다.
이는 sin과 cos을 이용하여 기본적인 삼각비를 구한다.

사용자 삽입 이미지
각 면의 길이와 각도를 아는 경우에는 삼각함수를 통해 p1의 좌표를 구할 수 있다.
sin = b/c           ->          b = sin * c : y좌표를 구할 수 있다.
cos = a/c          ->          a = cos * c : x좌표를 구할 수 있다.
그림처럼 높이 b는 y축에 관한 값을 구할 수 있고 밑변 a는 x축의 값을 구할 수 있다.



var _square:Sprite = new Sprite();
var _angle:int = 0;


_square.graphics.lineStyle(2,0x000000);
_square.graphics.beginFill( 0xF79646 )
_square.graphics.drawCircle(0,0,20);
addEventListener( Event.ENTER_FRAME , onEnter )
addChild(_square)

 

function onEnter( e:Event ):void
{
//호도각으로 변환
 var a:Number = _angle * Math.PI/180
//밑변 구하기
 _square.x = Math.cos( a) * 100 + 550/2
//높이 구하기
 _square.y = Math.sin( a ) * 100 + 200
 _angle++
}










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

그림 처럼 빗면 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 버터백통

random클래스는 임의의 난수를 추출하여 값을 반환하는 메서드이다. 사용법은 Math클래스에서 random()을 호출하면 된다.

* Math.random();
위처럼 메서드를 실행시키면 반환되는 값은 소수점 이하 15자리의 난수를 반환한다.
trace( NumberUtilities.random() )     // 출력 : 0.424370180349797

하지만 개발시 주로 사용하는 값은 정수를 많이 사용한다. 가령 "10개의 값중에 난수가 1이면 공격하라"라고 개발하였다면 10분의 1확율로 공격을 할 것이다. 난수가 0.xxxxxxxx..... 이면 공격하라...개발도 지저분 해질 것이다. 따라서 난수의 값에 연산을 하여 필요한 값을 얻어야 한다.

* 두자리 정수를  얻기위한 연산
trace( Math.random()*100 )     // 출력 : 99.72788169980049
위처럼 100을 곱하면 난수 자체가 소수점 이하의 값이므로 두자리의 정수와 소수점이하 15개의 값을 얻을 수 있다. 따라서 아래처럼 수정하여 사용 하면 정수만 추출할 수 있다.
trace( Math.floor( Math.random()*100 ) );     // 출력 99
필요한 값을 얻기 위해서 이렇게 난수에 연산과 올림/내림을 적절하게 사용하여야 한다.

* AS3에서 아쉬운 랜덤의 범위
AS 1에서는 random(10) 을 하면 0~9까지 10개의 정수중 1개를 리턴하였다. 하지만 AS3에서는 이러한 기능이 사라져 버렸다. 따라서 범위를 구하고 싶으면 따로 개발해야한다... 그러나 ascb에서는 이러한 범위를 구할 수 있는 메서드를 만들어 제공하고 있다.

NumberUtilities.random( 작은수 , 큰수 , 구간 )
가령 random(0,10) 으로 실행시키면 0~10까지의 값이 반환하고록 되어있다.
심지어 반올림까지 할 수 있도록 Interval까지 설정하게 되어있다.
 random(0,10,2)으로 설정하면 2의 곱인 값(근접하게 반올림)이 반환된다. 또는  random(0,10,10)으로 하면 0과 10의 1곱인 10만이 반환된다. 훌륭하다...
하지만 단점은 기본 기능인 소수점 이하 15개의 난수를 얻는 것이 없다..-_-;;;

기본기능을 사용하고 싶을때는 다시 Math.random()을 호출하여야 한다. util의 기능은 가급적 여러 클래스에서 불러와 사용하는 것 보다는 캡슐화된 유틸을 사용하는 것이 좋다...
그래서 기본기능을 포함한 랜덤클래스를 ascb를 활용하여 만들어 보았다.

private static var _minimum:Number;
private static var _maximum:Number;
private static var _roundToInterval:Number = 1
public static function random( minimum:Number = 0, maximum:Number = 0 ,
                                             roundToInterval:Number = 1 ):Number
{
   _minimum = minimum;
   _maximum = maximum;
   _roundToInterval = roundToInterval;

    //범위를 설정하지 않았을 때 Math.random()을 호출 그값을 반환
    //범위가 설정 되어있으면 section()을 실행하여 범위내 정수를 반환
    return ( minimum == 0 && maximum == 0 ) ?  original() : section();
}
 
//소수점 이하 난수를 반환
private static function original():Number
{
   return Math.random();
}
 
//범위에서 정수를 추출하여 반환 
private static function section():Number
{
     if(_minimum > _maximum) {
          var tmp:Number = _minimum;
          _minimum = _maximum;
          _maximum = tmp;
       }
 
       var nDeltaRange:Number = (_maximum - _minimum) + (1 * _roundToInterval);
       var nRandomNumber:Number = Math.random() * nDeltaRange;
       nRandomNumber += _minimum;
       
       return Math.floor(nRandomNumber / _roundToInterval) * _roundToInterval;
}



이 클래스는 random()만 호출시에는 기본 랜덤 메서드인 Math.random()의 반환값을 반환하고 구간을 설정하면 구간내의 값을 반환하게 되어있다. 물론 인터벌도 설정하여 설정값의 근접한 값에 반올림 하돌록 되어있다.
1) trace( NumberUtilities.random() )                                  // 출력 : 0.872785918880254
2) trace( Math.floor( NumberUtilities.random()*100 ) );        // 출력 : 66
3) trace( NumberUtilities.random(0,100,10) )                       // 출력 : 50
4) trace( NumberUtilities.random(10,20,3) )                        // 출력 : 18
5) trace( NumberUtilities.random(10,20,5) )                         //출력 : 15

2번과 3번은 세자리수 100을 제외한 같은 범주의 값을 반환한다.

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

클래스는 어떠한 프로젝트를 만들때 우리가 필요한 기능들을 묶어 처리하는 하나의 캡슐과도 같은 것이다.
그안에 해당되는 기능/처리에 필요한 많은 명령문과 함수(메서드)를 만들게 된다. 보통 클래스는 public이나 internal로 선언해서 만든다.


사용자 삽입 이미지


그림과 같이 플렉스에서는 새로운 클래스를 만들때 패키지(클래스의 포함경로)와 이름을 정하게 되고 접근제한자를 public/internal중에 한개를 선택하게 되어있다.
superClass에는 상속받을 부모의 클래스를 넣어주면 자동으로 네임스페이스를 클래스 내부에 선언하게 된다.
Interface의 경우에는 구현할 인터페이스의 경로를 설정한다.

사용자 삽입 이미지

그림은 패키지를 com.test라는 경로로 선언하였다. 그러면 com폴더에  test폴더에 저장이 된다.
* 패키지 : 클래스를 그룹화하여 서로 충돌없이 사용하도록 폴더의 구조를 나누는 것이다.
com.test라고 선언한다면 생성하는 클래스는 com이라는 폴더에 test라는 폴더 및에 생성하게 된다.
관행적으로 패키지 이름은 소문자로 한다.
클래스 이름은 관행적으로 첫문자를 대문자로 사용한다. 그리고 Test라고 선언한 클래스이름과 같은 이름(Test.as)으로 파일이 생성하게 된다.
* 클래스이름과 파일명은 항상 같은 이름으로 일치시켜야 한다. 만약 이후 클래스명이나 파일명이 수정되면 둘다 같은 이름으로 일치시키도록 한다.
클래스의 스코프는 전체패키지에서 접근가능하도록 public으로 설정하였고 상속받을 부모는 Sprite(프레임 없는 무비클립)을 상속받았다..
* 상속을 받지 않고 클래스를 생성하면 기본적으로 최상위 클래스인 Object를 상속받게 된다.
실행하면 아래의 그림처럼 클래스가 생성된다.
사용자 삽입 이미지

[ com -> test -> Test.as ]


Test의 소스코드를 보면 아래와 같다.
package com.test
{
 import flash.display.Sprite;
flash라는 폴더에 display라는 폴더에 Sprite 클래스를 임포트하였다.
위의 클래스는 어도비에서 제공하고 플렉스빌더의 sdk에 swc형태로 저장되어있다.
* swc : 라이브러리 프로젝트로 압축된 파일안에 소스코드를 저장해 넣은 클래스집합

 public class Test extends Sprite
Sprite에서 상속을 받았기 때문에 Test클래스는 Sprite의 extends이다

 {
  public function Test()
  {
   super();
  }
이부분이 생성자이다 패키지 어디에선가 이 클래스를 사용하고자 생성시킬때 이 부분이 실행하게 되며
반드시 생성자에는 반환타입이 없다.
super()라는것은 부모의 생성자를 의미한다. 여기서는 Sprite의 생성자를 호출하게 된다.
* parent는 계층구조상 상위의 개념
* super는 상속에서의 상위 개념
 
 }
}

사용자 정의 클래스를 만들어 보았다...이를 다시 상속받는 클래스를 하나 더 만들어보고 비교하면 금방 이해가 가실 것이다.

앞서 만든 Test를 상속받는 클래스 Test2를 com.test2라는 패키지에 만들어 본다.

사용자 삽입 이미지

그림처럼 설정하고 실행하면 아래의 경로에 클래스가 생성되게된다.
사용자 삽입 이미지

소스코드는 아래와 같다
package com.test2
{
 import com.test.Test;

 public class Test2 extends Test
 {
  public function Test2()
  {
   super();
  }
 
 }
}

이 클래스는 Test를 상속받았다 Test클래스는 Sprite를 상속받았으므로 Test2에는 Sprite성분과 Test성분을 모두 포함하고 있다.

* 클래스의 캡슐화 : 클래스를 만들 때 유념해야 할것은 각 메서드의 스코프를 잘 정의하고 내부에서만 사용하는 메서드는 외부에서 접근이 불가능하게 하고 다른 클래스 메서드와의 충돌이나 에러 발생율를 최소한으로 하여 "한 덩어리"로서 자신의 역할만을 충실히 수행하도록 하는 것이 좋다.

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