데이터 유형
데이터 유형은 값의 집합을 정의합니다. 예를 들어 Boolean 데이터 유형은 정확히 두 가지 값, true와 false의 집합입니다. ActionScript 3.0에서는 Boolean 데이터 유형 외에도 String, Number 및 Array 등 보다 일반적으로 사용되는 여러 데이터 유형을 정의합니다. 클래스 또는 인터페이스를 사용하여 직접 데이터 유형을 정의하고 사용자 정의 값 집합을 정의할 수 있습니다. 프리미티브 값 또는 복합 값인지에 관계없이 ActionScript 3.0에서 모든 값은 객체입니다.
프리미티브 값은 Boolean, int, Number, String 및 uint 데이터 유형 중 하나에 속한 값입니다. 일반적으로 프리미티브 값을 사용하여 작업하면 복합 값을 사용하여 작업하는 것보다 속도가 빠릅니다. 이는 ActionScript에서 메모리와 속도를 최적화할 수 있는 특수 방식으로 프리미티브 값을 저장하기 때문입니다.
참고: 기술적인 세부 사항에 관심이 있는 독자를 위해 설명하자면 ActionScript 내부적으로는 프리미티브 값을 변경되지 않는 객체로 저장합니다. 프리미티브 값을 변경되지 않는 객체로 저장한다는 것은 참조에 의한 전달이 실제로는 값에 의한 전달과 동일함을 의미합니다. 일반적으로 값 자체의 크기보다 참조의 크기가 매우 작으므로 참조에 의한 전달을 통해 메모리 사용량이 줄어들고 실행 속도가 빨라집니다.
복합 값은 프리미티브 값이 아닌 값입니다. 복합 값 집합을 정의하는 데이터 유형에는 Array, Date, Error, Function, RegExp, XML, XMLList 등이 있습니다.
많은 프로그래밍 언어에서 프리미티브 값과 래퍼 객체를 구분합니다. 예를 들어 Java에는 int 프리미티브 값과 이 값을 래핑하는 java.lang.Integer 클래스가 있습니다. Java 프리미티브 값은 객체가 아니지만 Java 프리미티브 값의 래퍼는 객체입니다. 이러한 차이점으로 인해 일부 연산에는 프리미티브 값이 유용하고 나머지 연산에는 래퍼 객체가 보다 적합합니다. ActionScript 3.0에서 프리미티브 값과 해당 래퍼 객체는 실제로 구분할 수 없습니다. 프리미티브 값을 포함한 모든 값이 객체입니다. 런타임에서는 이러한 프리미티브 유형을 객체처럼 동작하지만 객체를 만드는 작업과 관련된 일반적인 오버헤드를 발생시키지 않는 특별한 경우로 간주합니다. 이는 다음 두 코드 행이 동일하다는 것을 의미합니다.
var someInt:int = 3;
var someInt:int = new int(3);
위에 나열된 프리미티브 및 복합 데이터 유형은 모두 ActionScript 3.0 기본 클래스에 의해 정의됩니다. 기본 클래스를 사용하면 new 연산자 대신 리터럴 값을 사용하여 객체를 만들 수 있습니다. 예를 들어 다음과 같이 리터럴 값 또는 Array 클래스 생성자를 사용하여 배열을 만들 수 있습니다.
var someArray:Array = [1, 2, 3]; // literal value
var someArray:Array = new Array(1,2,3); // Array constructor
유형 검사유형 검사는 컴파일 타임이나 런타임에 수행할 수 있습니다. C++ 및 Java와 같이 정적으로 유형이 지정되는 언어는 컴파일 타임에 유형 검사를 수행합니다. Smalltalk 및 Python과 같이 동적으로 유형이 지정되는 언어는 런타임에 유형 검사를 처리합니다. 동적으로 유형이 지정되는 언어인 ActionScript 3.0의 경우 런타임에 유형 검사를 수행하지만 엄격 모드라는 특수 컴파일러 모드에서의 컴파일 타임 유형 검사도 지원합니다. 엄격 모드에서는 컴파일 타임과 런타임에 모두 유형 검사가 수행되지만, 표준 모드에서는 런타임에만 유형 검사가 수행됩니다.
동적으로 유형이 지정되는 언어를 사용하면 코드를 구성할 때 상당한 융통성을 누릴 수 있지만 런타임에 유형 오류가 출력되는 것을 감수해야 합니다. 정적으로 유형이 지정되는 언어를 사용하면 컴파일 타임에 유형 오류를 확인할 수 있지만 컴파일러에게 유형 정보를 제공해야 하는 부담을 지게 됩니다.
컴파일 타임 유형 검사프로젝트 규모가 커지면 일반적으로 데이터 유형 유연성보다 유형 오류를 가능한 빨리 포착하는 것이 중요해지므로 대형 프로젝트에서는 컴파일 타임 유형 검사가 자주 사용됩니다. 이러한 이유 때문에 Flash Professional 및 Flash Builder의 ActionScript 컴파일러가 엄격 모드에서 실행되도록 기본 설정되어 있습니다.
Adobe Flash Builder[Project Properties] 대화 상자의 ActionScript 컴파일러 설정을 통해 Flash Builder에서 엄격 모드를 비활성화할 수 있습니다.
컴파일 타임 유형 검사를 제공하려면 컴파일러에서 코드의 변수 또는 표현식에 대한 데이터 유형 정보를 알고 있어야 합니다. 변수의 데이터 유형을 명시적으로 선언하려면 변수 이름에 콜론 연산자(:)를 추가하고 그 뒤에 데이터 유형을 접미어로 추가합니다. 데이터 유형을 매개 변수와 연결하려면 콜론 연산자와 데이터 유형을 차례로 사용합니다. 예를 들어 다음 코드에서는 xParam 매개 변수에 데이터 유형 정보를 추가하고 명시적 데이터 유형을 사용하여 myParam 변수를 선언합니다.
function runtimeTest(xParam:String)
{
trace(xParam);
}
var myParam:String = "hello";
runtimeTest(myParam);
엄격 모드의 ActionScript 컴파일러에서는 컴파일러 오류에 따라 유형 불일치를 보고합니다. 예를 들어 다음 코드에서는 Object 유형의 xParam 함수 매개 변수를 선언하지만 이후 해당 매개 변수에 String 및 Number 유형 값을 지정하려고 합니다. 이로 인해 엄격 모드에서 컴파일러 오류가 발생합니다.
function dynamicTest(xParam:Object)
{
if (xParam is String)
{
var myStr:String = xParam; // compiler error in strict mode
trace("String: " + myStr);
}
else if (xParam is Number)
{
var myNum:Number = xParam; // compiler error in strict mode
trace("Number: " + myNum);
}
}
그러나 엄격 모드에서도 대입문의 우변을 유형이 지정되지 않은 상태로 두면 컴파일 타임 유형 검사에서 해당 대입문을 제외할 수 있습니다. 유형 약어를 생략하거나 특수 별표(*) 유형 약어를 사용하여 유형이 지정되지 않은 변수 또는 표현식을 표시할 수 있습니다. 예를 들어 이전 예제를 수정하여 xParam 매개 변수의 유형 약어를 생략하면 엄격 모드에서 코드가 컴파일됩니다.
function dynamicTest(xParam)
{
if (xParam is String)
{
var myStr:String = xParam;
trace("String: " + myStr);
}
else if (xParam is Number)
{
var myNum:Number = xParam;
trace("Number: " + myNum);
}
}
dynamicTest(100)
dynamicTest("one hundred");
런타임 유형 검사ActionScript 3.0에서는 엄격 모드 또는 표준 모드 중 어느 모드에서 컴파일했는지와 관계없이 런타임 유형 검사가 수행됩니다. 배열 인수가 필요한 함수에 값 3이 전달되는 경우를 생각해 봅시다. 값 3이 Array 데이터 유형과 호환되지 않으므로 엄격 모드의 컴파일러에서 오류가 발생합니다. 엄격 모드를 사용하지 않고 표준 모드에서 실행하는 경우 컴파일러에서는 유형 불일치에 대한 오류가 발생하지 않지만 런타임 유형 검사를 수행하면 런타임 오류가 발생합니다.
다음 예제에서는 필요한 Array 인수 대신 값 3이 전달된 typeTest() 함수를 보여 줍니다. 값 3이 매개 변수의 선언된 데이터 유형(Array)의 멤버가 아니기 때문에 표준 모드에서 런타임 오류가 발생합니다.
function typeTest(xParam:Array)
{
trace(xParam);
}
var myNum:Number = 3;
typeTest(myNum);
// run-time error in ActionScript 3.0 standard mode
엄격 모드에서 작업하는 경우에도 런타임 유형 오류가 발생할 수 있습니다. 엄격 모드에서 유형이 지정되지 않은 변수를 사용하면 컴파일 타임 유형 검사에서 해당 변수가 제외되므로 런타임에 유형 오류가 발생할 수도 있습니다. 유형이 지정되지 않은 변수를 사용하는 경우 유형 검사는 취소되지 않고 런타임까지 연기됩니다. 예를 들어 이전 예제의 myNum 변수에 선언된 데이터 유형이 없는 경우 컴파일러에서는 유형 불일치를 감지할 수 없지만 코드에서는 런타임 오류가 발생합니다. 이는 Flash Player에서 대입문의 결과 값인 3으로 설정된 myNum의 런타임 값을 Array 데이터 유형으로 설정된 xParam의 유형과 비교하기 때문입니다.
function typeTest(xParam:Array)
{
trace(xParam);
}
var myNum = 3;
typeTest(myNum);
// run-time error in ActionScript 3.0
또한 런타임 유형 검사의 경우 컴파일 타임 검사에 비해 상속의 사용을 덜 엄격하게 검사합니다. 표준 모드에서 유형 검사를 런타임으로 연기하면 하위 클래스를 업캐스팅한 경우에도 하위 클래스의 속성을 참조할 수 있습니다. 기본 클래스를 사용하여 클래스 인스턴스의 유형을 선언하고, 하위 클래스를 사용하여 클래스 인스턴스를 인스턴스화하면 업캐스팅이 일어납니다. 예를 들어 확장할 수 있는 ClassBase 클래스를 만들 수 있습니다. final 특성이 있는 클래스는 확장할 수 없습니다.
class ClassBase
{
}
이어서 다음과 같이 someString 속성 하나가 있는 ClassExtender라는 ClassBase의 하위 클래스를 만들 수 있습니다.
class ClassExtender extends ClassBase
{
var someString:String;
}
두 클래스를 사용하면 ClassBase 데이터 유형으로 선언되고 ClassExtender 생성자로 인스턴스화되는 클래스 인스턴스를 만들 수 있습니다. 기본 클래스에는 하위 클래스에 없는 속성 또는 메서드가 포함되어 있지 않기 때문에 업캐스팅은 안전한 작업으로 간주됩니다.
var myClass:ClassBase = new ClassExtender();
그러나 하위 클래스에는 기본 클래스에 없는 속성 또는 메서드가 포함되어 있습니다. 예를 들어 ClassExtender 클래스에는 ClassBase 클래스에 없는 someString 속성이 포함되어 있습니다. ActionScript 3.0 표준 모드에서 다음 예제와 같이 컴파일 타임 오류를 생성하지 않고 myClass 인스턴스를 사용하여 이 속성을 참조할 수 있습니다.
var myClass:ClassBase = new ClassExtender();
myClass.someString = "hello";
// no error in ActionScript 3.0 standard mode
is 연산자is 연산자를 사용하면 변수 또는 표현식이 지정된 데이터 유형의 멤버인지 여부를 테스트할 수 있습니다. 이전 버전의 ActionScript에서는 instanceof 연산자가 이 기능을 제공했지만, ActionScript 3.0에서는 데이터 유형 멤버 여부를 테스트하는 데 instanceof 연산자를 사용할 수 없습니다. x instanceof y 표현식으로는 x의 프로토타입 체인에서 y가 존재하는지만 확인할 수 있고 ActionScript 3.0에서는 프로토타입 체인을 통해 완전한 상속 계층 구조에 액세스할 수 없으므로 유형 검사를 수동으로 수행하려면 instanceof 연산자 대신 is 연산자를 사용해야 합니다.
is 연산자는 정확한 상속 계층 구조를 검사하며, 객체가 특정 클래스의 인스턴스인지 여부뿐 아니라 객체가 특정 인터페이스를 구현하는 클래스의 인스턴스인지 여부를 확인하는 데 사용할 수 있습니다. 다음 예제에서는 mySprite라는 Sprite 클래스의 인스턴스를 만들고 is 연산자를 사용하여 mySprite가 Sprite 및 DisplayObject 클래스의 인스턴스인지 여부와 IEventDispatcher 인터페이스를 구현하는지 여부를 테스트합니다.
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // true
trace(mySprite is DisplayObject);// true
trace(mySprite is IEventDispatcher); // true
is 연산자는 상속 계층 구조를 검사하고 mySprite가 Sprite 및 DisplayObject 클래스와 호환되는지 보고합니다. Sprite 클래스는 DisplayObject 클래스의 하위 클래스입니다. 또한 is 연산자는 mySprite가 IEventDispatcher 인터페이스를 구현하는 클래스에서 상속되는지 여부를 확인합니다. Sprite 클래스가 IEventDispatcher 인터페이스를 구현하는 EventDispatcher 클래스에서 상속되므로 is 연산자는 mySprite가 동일한 인터페이스를 구현하고 있음을 정확하게 보고합니다.
다음 예제에서는 이전 예제와 동일한 테스트를 보여 주지만 is 연산자 대신 instanceof를 사용합니다. instanceof 연산자는 mySprite가 Sprite 또는 DisplayObject의 인스턴스인지를 정확하게 식별하지만 mySprite에서 IEventDispatcher 인터페이스를 구현하는지 여부를 테스트하기 위해 사용하는 경우에는 false를 반환합니다.
trace(mySprite instanceof Sprite); // true
trace(mySprite instanceof DisplayObject);// true
trace(mySprite instanceof IEventDispatcher); // false
as 연산자as 연산자 역시 표현식이 지정된 데이터 유형의 멤버인지 여부를 확인하는 데 사용할 수 있습니다. is 연산자와 달리 as 연산자는 부울 값을 반환하지 않습니다. as 연산자는 true 대신 표현식의 값을 반환하고 false 대신 null을 반환합니다. 다음 예제에서는 Sprite 인스턴스가 DisplayObject, IEventDispatcher 및 Number 데이터 유형의 멤버인지 여부를 확인할 때 is 연산자 대신 as 연산자를 사용하는 경우에 대한 결과를 보여 줍니다.
var mySprite:Sprite = new Sprite();
trace(mySprite as Sprite); // [object Sprite]
trace(mySprite as DisplayObject); // [object Sprite]
trace(mySprite as IEventDispatcher); // [object Sprite]
trace(mySprite as Number); // null
as 연산자를 사용하는 경우 오른쪽 피연산자는 데이터 유형이어야 합니다. 오른쪽 피연산자로 데이터 유형이 아닌 표현식을 사용하려고 하면 오류가 발생합니다.
동적 클래스동적 클래스는 속성 및 메서드를 추가하거나 변경하여 런타임에 변경할 수 있는 객체를 정의합니다. String 클래스와 같이 동적이지 않은 클래스는 봉인된 클래스입니다. 런타임에 속성 또는 메서드를 봉인된 클래스에 추가할 수 없습니다.
클래스를 선언할 때 dynamic 특성을 사용하여 동적 클래스를 만듭니다. 예를 들어 다음 코드에서는 Protean이라는 동적 클래스를 만듭니다.
dynamic class Protean
{
private var privateGreeting:String = "hi";
public var publicGreeting:String = "hello";
function Protean()
{
trace("Protean instance created");
}
}
나중에 Protean 클래스의 인스턴스를 인스턴스화하는 경우 클래스 정의 외부에 있는 인스턴스에 속성 또는 메서드를 추가할 수 있습니다. 예를 들어 다음 코드에서는 Protean 클래스의 인스턴스를 만들고 aString 속성과 aNumber 속성을 해당 인스턴스에 추가합니다.
var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
trace(myProtean.aString, myProtean.aNumber); // testing 3
동적 클래스의 인스턴스에 추가한 속성은 런타임 엔터티이므로 모든 유형 검사는 런타임에 수행됩니다. 이러한 방법으로 추가한 속성에 유형 약어를 추가할 수 없습니다.
함수를 정의하고 해당 함수를 myProtean 인스턴스의 속성에 연결하여 myProtean 인스턴스에 메서드를 추가할 수도 있습니다. 다음 코드에서는 trace 문을 traceProtean() 메서드로 이동합니다.
var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
myProtean.traceProtean = function ()
{
trace(this.aString, this.aNumber);
};
myProtean.traceProtean(); // testing 3
그러나 이렇게 만든 메서드에서는 Protean 클래스의 모든 전용 속성 또는 메서드에 액세스하지 못합니다. 또한 Protean 클래스의 공용 속성 또는 메서드에 대한 참조를 this 키워드 또는 클래스 이름으로 정규화해야 합니다. 다음 예제에서는 Protean 클래스의 전용 및 공용 변수에 액세스하려고 하는 traceProtean() 메서드를 보여 줍니다.
myProtean.traceProtean = function ()
{
trace(myProtean.privateGreeting); // undefined
trace(myProtean.publicGreeting); // hello
};
myProtean.traceProtean();
데이터 유형 설명프리미티브 데이터 유형에는 Boolean, int, Null, Number, String, uint 및 void 등이 포함됩니다. 또한 ActionScript 기본 클래스에서 Object, Array, Date, Error, Function, RegExp, XML 및 XMLList 등의 복합 데이터 유형을 정의합니다.
Boolean 데이터 유형Boolean 데이터 유형에는 두 가지 값, 즉true와 false가 포함됩니다. 그 외 다른 값은 Boolean 유형의 변수에 사용할 수 없습니다. 선언되었지만 초기화되지 않은 부울 변수의 기본값은 false입니다.
int 데이터 유형int 데이터 유형은 내부적으로 32비트의 정수로 저장되며
-2,147,483,648 (-231)부터 2,147,483,647(231 - 1)까지의 정수 집합(-2,147,483,648 및 2,147,483,647 포함)으로 구성됩니다. 이전 버전의 ActionScript에서는 정수와 부동 소수점 숫자에 모두 사용되는 Number 데이터 유형만 제공했습니다. ActionScript 3.0에서는 이제 32비트의 부호가 있거나 없는 정수에 대한 저수준의 시스템 유형에 액세스할 수 있습니다. 변수에서 부동 소수점 숫자가 필요하지 않는 경우 Number 데이터 유형 대신 int 데이터 유형을 사용하는 것이 보다 빠르고 효율적입니다.
최소 및 최대 int 값의 범위를 벗어나는 정수 값인 경우 Number 데이터 유형을 사용하여 양수와 음수 각각 9,007,199,254,740,992(53비트 정수 값) 사이의 값을 처리할 수 있습니다. int 데이터 유형의 변수에 대한 기본값은 0입니다.
Null 데이터 유형Null 데이터 유형에는 null 값만 포함됩니다. 이는 Object 클래스를 포함하여 복합 데이터 유형을 정의하는 모든 클래스와 String 데이터 유형의 기본값입니다. Boolean, Number, int 및 uint 같은 기타 프리미티브 데이터 유형에는 null 값이 포함되어 있지 않습니다. Boolean, Number, int 또는 uint 유형의 변수에 null을 지정하려고 하면 null 값은 런타임에 적절한 기본값으로 변환됩니다. 이 데이터 유형은 유형 약어로 사용할 수 없습니다.
Number 데이터 유형ActionScript 3.0에서 Number 데이터 유형은 정수, 부호 없는 정수, 부동 소수점 숫자 등을 나타낼 수 있습니다. 그러나 성능을 최대화하려면 32비트 int 및 uint 유형이 저장할 수 있는 값보다 큰 정수 값 또는 부동 소수점 숫자에만 Number 데이터 유형을 사용해야 합니다. 부동 소수점 숫자를 저장하려면 숫자 안에 소수점을 넣습니다. 소수점을 생략하면 숫자가 정수로 저장됩니다.
Number 데이터 유형에서는 이진 부동 소수점 산술에 대한 IEEE 표준(IEEE-754)에 지정된 64비트 배정밀도 형식을 사용합니다. 이 표준에는 64비트를 사용하여 부동 소수점 숫자를 저장하는 방법이 규정되어 있습니다. 1비트는 숫자가 양수 또는 음수인지 지정하는 데 사용됩니다. 11비트는 2를 밑수로 하는 지수를 저장하는 데 사용됩니다. 남은 52비트는 지수에 따라 거듭제곱되는 숫자인 유효 숫자(또는 가수)를 저장하는 데 사용됩니다.
Number 데이터 유형에서는 지수를 저장하는 데 일부 비트를 사용하므로 모든 비트가 유효 숫자를 저장하는 데 사용되는 경우에 비해 매우 큰 부동 소수점 숫자를 저장할 수 있습니다. 예를 들어 Number 데이터 유형에서 유효 숫자를 저장하는 데 64비트를 모두 사용하는 경우, 저장할 수 있는 가장 큰 숫자는 265 - 1입니다. 11비트를 사용하여 지수를 저장하면 Number 데이터 유형에서 유효 숫자를 21023으로 거듭제곱할 수 있습니다.
Number 유형에서 나타낼 수 있는 최소값 및 최대값은 Number.MAX_VALUE 및 Number.MIN_VALUE라는 Number 클래스의 정적 속성에 저장됩니다.
Number.MAX_VALUE == 1.79769313486231e+308
Number.MIN_VALUE == 4.940656458412467e-324
Number 데이터 유형의 경우 숫자의 범위는 방대하지만 정밀도는 떨어집니다. Number 데이터 유형에서는 유효 숫자를 저장하는 데 52비트를 사용하므로 정확하게 나타내기 위해 52비트 이상이 필요한 숫자(예: 분수 1/3)는 근삿값만 표현할 수 있습니다. 응용 프로그램에서 절대 정밀도의 십진수가 필요한 경우 이진 부동 소수점 산술과 대립되는 십진 부동 소수점 산술을 구현하는 소프트웨어를 사용해야 합니다.
Number 데이터 유형을 사용하여 정수 값을 저장하면 유효 숫자의 52비트만 사용됩니다. Number 데이터 유형에서는 해당 52비트 및 특수 은폐 비트를 사용하여 -9,007,199,254,740,992(-253)부터 9,007,199,254,740,992(253)까지의 정수를 나타냅니다.
NaN 값은 Number 유형의 변수에 대한 기본값으로 사용될 뿐만 아니라 숫자를 반환해야 하지만 이를 반환하지 않는 모든 연산의 결과로도 사용됩니다. 예를 들어 음수의 제곱근을 계산하려고 하면 결과는 NaN이 됩니다. 기타 특수 Number 값에 양의 무한대와 음의 무한대가 포함됩니다.
참고: 제수가 0인 경우 0으로 나눈 결과도 NaN입니다. 피제수가 양수인 경우 0으로 나누면 infinity가 되고, 피제수가 음수인 경우 0으로 나누면 -infinity가 됩니다.
String 데이터 유형String 데이터 유형은 16비트 문자열을 나타냅니다. 문자열은 내부적으로 UTF-16 포맷을 사용하여 유니코드 문자로 저장합니다. 문자열은 Java 프로그래밍 언어와 마찬가지로 변경할 수 없는 값입니다. String 값에 대한 작업은 해당 문자열의 새 인스턴스를 반환합니다. String 데이터 유형으로 선언되는 변수의 기본값은 null입니다. null 값은 빈 문자열("")과는 다릅니다. null 값은 변수에 저장된 값이 없음을 의미하지만 빈 문자열은 변수에 저장된 값이 문자를 포함하지 않는 문자열임을 의미합니다.
uint 데이터 유형uint 데이터 유형은 내부적으로 32비트의 부호 없는 정수로 저장되며 0부터 4,294,967,295(232 - 1)까지의 정수 집합(0 및 4,294,967,295 포함)을 포함합니다. 음이 아닌 정수를 호출하는 특수한 경우에는 uint 데이터 유형을 사용합니다. 예를 들어 int 데이터 유형에는 색상 값 처리에 적합하지 않은 내부 부호 비트가 포함되어 있기 때문에 픽셀의 색상 값을 나타내려면 uint 데이터 유형을 사용해야 합니다. 최대 uint 값보다 큰 정수 값의 경우에는 53비트 정수 값을 처리할 수 있는 Number 데이터 유형을 사용합니다. uint 데이터 유형의 변수에 대한 기본값은 0입니다.
Void 데이터 유형void 데이터 유형에는 undefined 값만 포함됩니다. 이전 버전의 ActionScript에서는 Object 클래스의 인스턴스에 대한 기본값이 undefined였지만, ActionScript 3.0에서는 Object 인스턴스에 대한 기본값이 null입니다. Object 클래스의 인스턴스에 undefined 값을 지정하려고 하면 이 값이 null로 변환됩니다. undefined 값은 유형이 지정되지 않은 변수에만 지정할 수 있습니다. 유형이 지정되지 않은 변수는 유형 약어가 없거나 유형 약어에 별표(*) 기호를 사용하는 변수입니다. void는 반환 유형 약어로만 사용할 수 있습니다.
Object 데이터 유형Object 데이터 유형은 Object 클래스에 의해 정의됩니다. Object 클래스는 ActionScript에서 모든 클래스 정의에 대한 기본 클래스 역할을 합니다. ActionScript 3.0 버전의 Object 데이터 유형은 세 가지 면에서 이전 버전의 Object 데이터 유형과 다릅니다. 첫 번째, Object 데이터 유형은 더 이상 유형 약어가 없는 변수에 지정되는 기본 데이터 유형이 아닙니다. 두 번째, Object 데이터 유형에는 Object 인스턴스의 기본값이었던 undefined 값이 더 이상 포함되지 않습니다. 세 번째, ActionScript 3.0에서는 Object 클래스의 인스턴스에 대한 기본값이 null입니다.
이전 버전의 ActionScript에서 유형 약어가 없는 변수는 자동으로 Object 데이터 유형으로 지정되었습니다. ActionScript 3.0에는 유형이 지정되지 않은 변수라는 개념이 도입되면서 이전 버전과는 다르게 처리됩니다. 이제 유형 약어가 없는 변수는 유형이 지정되지 않은 변수로 간주됩니다. 변수의 유형을 지정하지 않으려는 자신의 의도를 코드를 읽는 사람에게 분명히 밝히려면 유형 약어로 별표(*) 기호를 사용할 수 있습니다. 이는 유형 약어를 생략하는 것과 같습니다. 다음 예제에서는 유형이 지정되지 않은 변수 x를 선언하는 동일한 두 명령문을 보여 줍니다.
var x
var x:*
유형이 지정되지 않은 변수에만 undefined 값을 저장할 수 있습니다. 데이터 유형이 있는 변수에 undefined 값을 지정하려고 하면 런타임에서 undefined 값을 해당 데이터 유형의 기본값으로 변환합니다. Object 데이터 유형의 인스턴스인 경우 기본값은 null입니다. 따라서 Object 인스턴스에 undefined를 지정하려고 하면 이 값은 null로 변환됩니다.
유형 변환어떤 값이 다른 데이터 유형의 값으로 변형되면 유형 변환이 발생한다고 합니다. 유형 변환은 암시적 또는 명시적으로 수행될 수 있습니다. 암시적 변환은 강제 형 변환이라고도 하며 런타임에 수행되는 경우도 있습니다. 예를 들어 Boolean 데이터 유형에 값 2를 지정하면 변수에 값을 지정하기 전에 값 2가 부울 값인 true로 변환됩니다. 컴파일러가 특정 데이터 유형의 변수를 다른 데이터 유형의 변수로 처리하도록 코드에서 지정하면 형 변환이라는 명시적 변환이 발생합니다. 프리미티브 값이 포함되어 있으면 형 변환에 의해 실제로 한 데이터 유형에서 다른 데이터 유형으로 값이 변환됩니다. 객체를 다른 유형으로 변환하려면 객체 이름을 괄호로 묶고 그 앞에 새 유형의 이름을 붙여야 합니다. 예를 들어 다음 코드는 부울 값을 사용하며 이 값을 정수로 변환합니다.
var myBoolean:Boolean = true;
var myINT:int = int(myBoolean);
trace(myINT); // 1
암시적 변환런타임에 암시적 변환이 발생하는 몇 가지 경우는 다음과 같습니다.
대입문인 경우
값이 함수 인수로 전달되는 경우
함수에서 값이 반환되는 경우
더하기(+) 연산자와 같은 특정 연산자를 사용하는 표현식의 경우
사용자 정의 유형의 경우 변환할 값이 대상 클래스 또는 대상 클래스에서 파생된 클래스의 인스턴스이면 암시적 변환이 이루어집니다. 암시적 변환에 실패하면 오류가 발생합니다. 예를 들어 다음 코드에는 성공적인 암시적 변환과 실패한 암시적 변환이 포함되어 있습니다.
class A {}
class B extends A {}
var objA:A = new A();
var objB:B = new B();
var arr:Array = new Array();
objA = objB; // Conversion succeeds.
objB = arr; // Conversion fails.
프리미티브 유형의 경우 명시적 변환 함수에서 호출하는 내부 변환 알고리즘과 동일한 알고리즘을 호출하여 암시적 변환을 처리합니다.
명시적 변환엄격 모드에서 컴파일할 때 유형 불일치로 인해 컴파일 타임 오류가 발생하지 않도록 하려면 명시적 변환 또는 형 변환을 사용하는 것이 도움이 됩니다. 강제 형 변환이 런타임에 값을 올바르게 변환한다는 것을 알고 있는 경우를 가정해 봅시다. 예를 들어 양식에서 전달된 데이터를 처리하는 경우 특정 문자열 값을 숫자 값으로 변환하기 위해 강제 형 변환을 사용할 수 있습니다. 다음 코드는 표준 모드에서 올바르게 실행되지만 컴파일 타임에 오류가 발생합니다.
var quantityField:String = "3";
var quantity:int = quantityField; // compile time error in strict mode
계속해서 엄격 모드를 사용하면서 문자열이 정수로 변환되도록 하려면 다음과 같이 명시적 변환을 사용할 수 있습니다.
var quantityField:String = "3";
var quantity:int = int(quantityField); // Explicit conversion succeeds.
int, uint 및 Number로 형 변환모든 데이터 유형을 int, uint 및 Number 등의 숫자 유형 중 하나로 변환할 수 있습니다. 어떤 이유로 숫자를 변환할 수 없는 경우 int 및 uint 데이터 유형에 기본값으로 0이 지정되고 Number 데이터 유형에는 기본값으로 NaN이 지정됩니다. 부울 값을 숫자로 변환하면 true는 값 1이 되며 false는 값 0이 됩니다.
var myBoolean:Boolean = true;
var myUINT:uint = uint(myBoolean);
var myINT:int = int(myBoolean);
var myNum:Number = Number(myBoolean);
trace(myUINT, myINT, myNum); // 1 1 1
myBoolean = false;
myUINT = uint(myBoolean);
myINT = int(myBoolean);
myNum = Number(myBoolean);
trace(myUINT, myINT, myNum); // 0 0 0
숫자만 포함된 문자열 값을 숫자 유형 중 하나로 변환할 수 있습니다. 음수 형태의 문자열 또는 16진수 값(예: 0x1A)을 나타내는 문자열도 숫자 유형으로 변환할 수 있습니다. 변환 과정에서 문자열 값에 있는 선행 또는 후행 공백 문자는 무시됩니다. Number()를 사용하여 부동 소수점 숫자 형태의 문자열을 변환할 수도 있습니다. 소수점이 포함된 문자열을 uint() 및 int()에 전달하면 소수점과 그 뒤의 문자를 잘라내고 정수를 반환합니다. 예를 들어 다음 문자열 값을 숫자로 변환할 수 있습니다.
trace(uint("5")); // 5
trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE
trace(uint(" 27 ")); // 27
trace(uint("3.7")); // 3
trace(int("3.7")); // 3
trace(int("0x1A")); // 26
trace(Number("3.7")); // 3.7
숫자가 아닌 문자가 포함된 문자열 값을 int() 또는 uint()로 변환하면 0이 반환되고 Number()로 변환하면 NaN이 반환됩니다 변환 과정에서 선행 또는 후행 공백 문자는 무시되지만 문자열에 두 개의 숫자를 구분하는 공백이 있는 경우 0 또는 NaN을 반환합니다.
trace(uint("5a")); // 0
trace(uint("ten")); // 0
trace(uint("17 63")); // 0
ActionScript 3.0에서 Number() 함수는 더 이상 8진수 또는 밑수가 8인 숫자를 지원하지 않습니다. ActionScript 2.0에서 Number() 함수에 0으로 시작되는 문자열을 제공하면 숫자가 8진수로 해석된 후 10진수로 변환됩니다. ActionScript 3.0에서 Number() 함수는 문자열 맨 앞에 있는 0을 무시하기 때문에 이전 버전에서와 같이 수행되지 않습니다. 예를 들어 다음 코드를 서로 다른 버전의 ActionScript를 사용하여 컴파일하면 각기 다른 결과가 출력됩니다.
trace(Number("044"));
// ActionScript 3.0 44
// ActionScript 2.0 36
특정 숫자 유형의 값이 다른 숫자 유형의 변수에 지정된 경우에는 변환할 필요가 없습니다. 엄격 모드에서도 숫자 유형이 다른 숫자 유형으로 암시적으로 변환됩니다. 이는 경우에 따라 유형 범위를 벗어나면 예기치 못한 값이 발생할 수 있다는 것을 의미합니다. 경우에 따라 예기치 못한 값이 생성될 수 있지만 다음 예제는 엄격 모드에서 모두 컴파일됩니다.
var myUInt:uint = -3; // Assign int/Number value to uint variable
trace(myUInt); // 4294967293
var myNum:Number = sampleUINT; // Assign int/uint value to Number variable
trace(myNum) // 4294967293
var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variable
trace(myInt); // 0
myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variable
trace(myInt); // -2147483648
다음 표에는 다른 데이터 유형에서 Number, int 또는 uint 데이터 유형으로의 변환 결과가 요약되어 있습니다.
데이터 유형 또는 값
|
Number, int 또는 uint로 변환한 결과
|
Boolean
|
값이 true이면 1로 변환되고 그렇지 않으면 0으로 변환됩니다.
|
Date
|
Date 객체의 내부 표현, 즉 표준시 1970년 1월 1일 자정 이후 경과된 밀리초로 변환됩니다.
|
null
|
0
|
Object
|
null인 인스턴스를 Number로 변환하면 NaN이 반환되고 그 외의 경우에는 0이 반환됩니다.
|
String
|
문자열을 숫자로 변환할 수 있는 경우 숫자가 반환되고, 그렇지 않은 경우 Number로 변환하면 NaN이 반환되고 int 또는 uint로 변환하면 0이 반환됩니다.
|
undefined
|
Number로 변환하면 NaN이 반환되고 int 또는 uint로 변환하면 0이 반환됩니다.
|
Boolean으로 변환숫자 데이터 유형(uint, int 및 Number)에서 Boolean으로 변환하면, 숫자 값이 0인 경우 false가 반환되고 그렇지 않으면 true가 반환됩니다. Number 데이터 유형의 경우 NaN 값 역시 false가 됩니다. 다음 예제에서는 숫자 -1, 0 및 1을 변환한 결과를 보여 줍니다.
var myNum:Number;
for (myNum = -1; myNum<2; myNum++)
{
trace("Boolean(" + myNum +") is " + Boolean(myNum));
}
이 예제의 출력에서 숫자 0만 false 값을 반환하는 것을 확인할 수 있습니다.
Boolean(-1) is true
Boolean(0) is false
Boolean(1) is true
문자열 값에서 Boolean으로 변환하는 경우 문자열이 null이거나 빈 문자열("")이면 false를 반환합니다. 그렇지 않으면 true를 반환합니다.
var str1:String; // Uninitialized string is null.
trace(Boolean(str1)); // false
var str2:String = ""; // empty string
trace(Boolean(str2)); // false
var str3:String = " "; // white space only
trace(Boolean(str3)); // true
Object 클래스의 인스턴스에서 Boolean으로 변환하는 경우 인스턴스가 null이면 false를 반환하고 그렇지 않으면 true를 반환합니다.
var myObj:Object; // Uninitialized object is null.
trace(Boolean(myObj)); // false
myObj = new Object(); // instantiate
trace(Boolean(myObj)); // true
엄격 모드에서 모든 데이터 유형의 값을 Boolean으로 변환하지 않고 부울 변수에 지정할 수 있다는 점에서 부울 변수는 특수하게 처리되는 변수입니다. 엄격 모드에서도 모든 데이터 유형에서 Boolean 데이터 유형으로 암시적으로 강제 형 변환합니다. 즉, 대부분의 다른 모든 데이터 유형과 달리 엄격 모드 오류를 방지하기 위해 Boolean으로 변환할 필요가 없습니다. 다음 예제는 엄격 모드에서 모두 컴파일되고 런타임에 예상대로 작동됩니다.
var myObj:Object = new Object(); // instantiate
var bool:Boolean = myObj;
trace(bool); // true
bool = "random string";
trace(bool); // true
bool = new Array();
trace(bool); // true
bool = NaN;
trace(bool); // false
다음 표에는 다른 데이터 유형에서 Boolean 데이터 유형으로 변환한 결과가 요약되어 있습니다.
데이터 유형 또는 값
|
Boolean로 변환한 결과
|
String
|
값이 null 또는 빈 문자열("")이면 false를 반환하고 그렇지 않으면 true를 반환합니다.
|
null
|
false
|
Number, int 또는 uint
|
값이 NaN 또는 0이면 false를 반환하고 그렇지 않으면 true를 반환합니다.
|
Object
|
인스턴스가 null이면 false를 반환하고 그렇지 않으면 true를 반환합니다.
|
String으로 변환모든 숫자 데이터 유형에서 String 데이터 유형으로 변환하면 숫자의 문자열 표현을 반환합니다. 부울 값에서 String 데이터 유형으로 변환하면 값이 true인 경우 "true" 문자열을 반환하고 값이 false인 경우 "false" 문자열을 반환합니다.
Object 클래스의 인스턴스에서 String 데이터 유형으로 변환하면 인스턴스가 null인 경우 "null" 문자열을 반환합니다. 그렇지 않은 경우, Object 클래스에서 String 유형으로 변환하면 "[object Object]" 문자열을 반환합니다.
Array 클래스의 인스턴스에서 String으로 변환하면 모든 배열 요소가 쉼표로 구분된 목록으로 구성된 문자열을 반환합니다. 예를 들어 다음과 같이 String 데이터 유형으로 변환하면 세 가지 배열 요소가 모두 포함되어 있는 하나의 문자열을 반환합니다.
var myArray:Array = ["primary", "secondary", "tertiary"];
trace(String(myArray)); // primary,secondary,tertiary
Date 클래스의 인스턴스에서 String으로 변환하면 인스턴스에 포함된 날짜의 문자열 표현을 반환합니다. 예를 들어 다음 예제에서는 Date 클래스 인스턴스의 문자열 표현(태평양 일광 절약 시간으로 결과 표시)을 반환합니다.
var myDate:Date = new Date(2005,6,1);
trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005
다음 표에는 다른 데이터 유형에서 String 데이터 유형으로 변환한 결과가 요약되어 있습니다.
데이터 유형 또는 값
|
문자열로 변환한 결과
|
Array
|
모든 배열 요소로 구성된 문자열을 반환합니다.
|
Boolean
|
"true" 또는 "false"
|
Date
|
Date 객체의 문자열 표현을 반환합니다.
|
null
|
"null"
|
Number, int 또는 uint
|
숫자의 문자열 표현을 반환합니다.
|
Object
|
인스턴스가 null이면 "null"을 반환하고 그렇지 않으면 "[object Object]"를 반환합니다.
|
|
|