변수

변수를 사용하면 프로그램에서 사용하는 값을 저장할 수 있습니다. 변수를 선언하려면 변수 이름과 함께 var 문을 사용해야 합니다. ActionScript 3.0에서는 항상 var 문을 사용해야 합니다. 예를 들어 다음 ActionScript 행에서는 i라는 이름의 변수를 선언합니다.

var i;

변수를 선언할 때 var 문을 생략하면 엄격 모드에서는 컴파일러 오류가 발생하고, 표준 모드에서는 런타임 오류가 발생합니다. 예를 들어 i 변수가 이미 정의되어 있지 않으면 다음 코드 행에서 오류가 발생합니다.

i; // error if i was not previously defined

변수를 데이터 유형과 연결하려면 변수를 선언할 때 연결해야 합니다. 변수 유형을 지정하지 않고도 변수를 선언할 수는 있지만 이 경우 엄격 모드에서는 컴파일러 경고가 발생합니다. 변수 이름 뒤에 콜론(:)과 변수 유형을 차례로 추가하여 변수 유형을 지정합니다. 예를 들어 다음 코드에서는 int 유형의 i 변수를 선언합니다.

var i:int;

대입 연산자(=)를 사용하여 변수에 값을 지정할 수 있습니다. 예를 들어 다음 코드에서는 i 변수를 선언하고 해당 값을 20으로 지정합니다.

var i:int; 
i = 20;

다음 예제와 같이 변수를 선언하는 동시에 변수에 값을 지정하는 것이 보다 간편할 수 있습니다.

var i:int = 20;

변수를 선언할 때 변수에 값을 지정하는 방법은 정수 및 문자열과 같은 프리미티브 값을 지정하는 경우뿐만 아니라 배열을 만들거나 클래스의 인스턴스를 인스턴스화하는 경우에도 일반적으로 사용됩니다. 다음 예제에서는 하나의 코드 행으로 배열을 선언하고 값을 지정하는 방법을 보여 줍니다.

var numArray:Array = ["zero", "one", "two"];

new 연산자를 사용하여 클래스의 인스턴스를 만들 수 있습니다. 다음 예제에서는 CustomClass 인스턴스를 만들고 customItem 변수에 새로 만든 클래스 인스턴스에 대한 참조를 지정합니다.

var customItem:CustomClass = new CustomClass();

선언할 변수가 둘 이상이면 변수를 구분하는 쉼표 연산자(,)를 사용하여 하나의 코드 행에서 모든 변수를 선언할 수 있습니다. 예를 들어 다음 코드에서는 하나의 코드 행에 세 개의 변수를 선언합니다.

var a:int, b:int, c:int;

동일한 코드 행의 각 변수에 값을 지정할 수도 있습니다. 예를 들어 다음 코드에서는 a, b, c 등 세 개의 변수를 선언하고 각각 값을 지정합니다.

var a:int = 10, b:int = 20, c:int = 30;

쉼표 연산자를 사용하여 변수 선언을 명령문 하나로 그룹화할 수는 있지만 코드에 대한 가독성이 떨어질 수 있습니다.

변수 범위 이해

변수의 범위는 코드에서 어휘 참조로 변수에 액세스할 수 있는 영역입니다. 전역 변수는 코드의 모든 영역에 정의되는 반면 로컬 변수는 코드의 한 부분에만 정의됩니다. ActionScript 3.0에서 변수는 변수가 선언되는 함수 또는 클래스의 범위가 항상 지정됩니다. 전역 변수는 모든 함수 또는 클래스 정의 외부에 정의된 변수입니다. 예를 들어 다음 코드에서는 모든 함수 외부에 strGlobal 변수를 선언하여 전역 변수로 만듭니다. 이 예제에서는 함수 정의 내부와 외부에서 모두 사용할 수 있는 전역 변수를 보여 줍니다.

var strGlobal:String = "Global"; 
function scopeTest() 
{ 
    trace(strGlobal); // Global 
} 
scopeTest(); 
trace(strGlobal); // Global

함수 정의 내부에 변수를 선언하여 로컬 변수를 선언합니다. 함수 정의는 로컬 변수를 정의할 수 있는 가장 작은 코드 영역입니다. 함수 내에 선언된 로컬 변수는 해당 함수 안에서만 존재합니다. 예를 들어 localScope() 함수 내에 str2 변수를 선언하는 경우 해당 변수는 함수 외부에서 사용할 수 없습니다.

function localScope() 
{ 
    var strLocal:String = "local"; 
} 
localScope(); 
trace(strLocal); // error because strLocal is not defined globally

로컬 변수에 사용하는 변수 이름이 이미 전역 변수로 선언되어 있는 경우 해당 로컬 변수가 범위 안에 있는 동안에는 로컬 정의에 의해 전역 정의가 가려집니다. 이러한 경우에도 전역 변수는 함수 외부에서 계속 존재합니다. 예를 들어 다음 코드에서는 str1이라는 전역 문자열 변수를 만든 다음 scopeTest() 함수 내에 동일한 이름의 로컬 변수를 만듭니다. 함수 내의 trace 문은 변수의 로컬 값을 출력하지만 함수 외부의 trace 문은 변수의 전역 값을 출력합니다.

var str1:String = "Global"; 
function scopeTest () 
{ 
    var str1:String = "Local"; 
    trace(str1); // Local 
} 
scopeTest(); 
trace(str1); // Global

C++ 및 Java의 변수와는 달리 ActionScript 변수에는 블록 수준 범위가 없습니다. 코드 블록은 여는 중괄호( { )와 닫는 중괄호( } ) 사이의 모든 명령문 그룹입니다. C++ 및 Java 등 일부 프로그래밍 언어에서는 코드 블록 내에 선언된 변수를 해당 코드 블록 밖에서 사용할 수 없습니다. 이 범위 제한을 블록 수준 범위라고 하며 ActionScript에는 이러한 제한이 없습니다. 코드 블록 내에 변수를 선언하면 해당 코드 블록뿐만 아니라 코드 블록이 속한 함수의 다른 모든 부분에서 해당 변수를 사용할 수 있습니다. 예를 들어 다음 함수에는 여러 블록 범위에 정의된 변수가 포함되어 있습니다. 이러한 변수는 모두 함수 전체에서 사용할 수 있습니다.

function blockTest (testArray:Array) 
{ 
    var numElements:int = testArray.length; 
    if (numElements > 0) 
    { 
        var elemStr:String = "Element #"; 
        for (var i:int = 0; i < numElements; i++) 
        { 
            var valueStr:String = i + ": " + testArray[i]; 
            trace(elemStr + valueStr); 
        } 
        trace(elemStr, valueStr, i); // all still defined 
    } 
    trace(elemStr, valueStr, i); // all defined if numElements > 0 
} 
 
blockTest(["Earth", "Moon", "Sun"]);

블록 수준 범위가 없다는 것은 함수 정의가 끝나기 전에 변수를 선언하기만 하면 해당 변수가 선언되기 이전에도 변수를 읽거나 변수에 쓸 수 있다는 것을 의미합니다. 이는 컴파일러에서 모든 변수 선언을 함수 맨 위로 이동하는 호이스팅이라는 기술에 의해 가능합니다. 예를 들어 다음 코드에서는 num 변수가 선언되기 전에 첫 번째 trace() 함수를 num 변수에 대해 호출하지만 정상적으로 컴파일됩니다.

trace(num); // NaN 
var num:Number = 10; 
trace(num); // 10

그러나 컴파일러에서 대입문을 호이스팅하지는 않습니다. 따라서 num에 대한 첫 번째 trace() 호출의 결과가 Number 데이터 유형의 변수에 대한 기본값인 NaN(숫자 아님)이 되는 것입니다. 이는 다음 예제와 같이 변수가 선언되기 전에도 변수에 값을 지정할 수 있다는 것을 의미합니다.

num = 5; 
trace(num); // 5 
var num:Number = 10; 
trace(num); // 10

기본값

기본값은 변수에 값을 설정하기 전에 해당 변수가 이미 보유하고 있는 값입니다. 변수에 처음으로 값을 설정하는 것은 변수를 초기화하는 것입니다. 그러나 변수를 선언하고 값을 설정하지 않으면 변수는 초기화되지 않은 것입니다. 초기화되지 않은 변수의 값은 데이터 유형에 따라 달라집니다. 다음 표에는 변수의 기본값이 데이터 유형별로 설명되어 있습니다.

데이터 유형

기본값

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

선언되지 않음(유형 약어 *에 해당)

undefined

사용자 정의 클래스를 포함한 기타 모든 클래스

null

Number 유형의 변수인 경우 기본값은 NaN(숫자 아님)이며, 이는 숫자를 나타내지 않는 값을 의미하는 특수 값으로 IEEE-754 표준에 정의되어 있습니다.

변수를 선언하고 해당 데이터 유형을 선언하지 않은 경우 기본 데이터 유형인 *가 적용되며 이는 변수의 유형이 지정되지 않았다는 것을 의미합니다. 유형이 지정되지 않은 변수에 값을 설정하여 초기화하지 않으면 기본값이 undefined가 됩니다.

Boolean, Number, int 및 uint 이외의 데이터 유형인 경우 초기화되지 않은 모든 변수의 기본값은 null입니다. 이는 ActionScript 3.0에 의해 정의된 모든 클래스 및 사용자가 만든 모든 사용자 정의 클래스에 적용됩니다.

null 값은 Boolean, Number, int 또는 uint 유형의 변수에 사용할 수 없습니다. 이러한 변수에 null 값을 지정하려고 하면 이 값이 해당 데이터 유형에 대한 기본값으로 변환됩니다. Object 유형의 변수에는 null값을 지정할 수 있습니다. Object 유형의 변수에 undefined 값을 지정하려고 하면 이 값이 null로 변환됩니다.

Number 유형의 변수인지 확인할 때는 isNaN()이라는 특수한 최상위 함수를 사용합니다. 이 함수는 변수가 숫자가 아니면 부울 값 true를 반환하고, 그렇지 않으면 false를 반환합니다.