함수 매개 변수

ActionScript 3.0의 함수 매개 변수에는 이 언어를 처음 접하는 프로그래머에게는 신기할 수 있는 몇 가지 기능이 있습니다. 대부분의 프로그래머는 값 또는 참조에 의한 매개 변수 전달이라는 개념에 익숙하지만 arguments 객체 및 ...(rest) 매개 변수에는 익숙하지 않을 수 있습니다.

세부 목차

값 또는 참조에 의한 인수 전달
매개 변수 기본값
arguments 객체
...(rest) 매개 변수

값 또는 참조에 의한 인수 전달

여러 프로그래밍 언어에서 값에 의한 인수 전달과 참조에 의한 인수 전달 간의 차이점은 코드를 설계하는 방법에 영향을 미칠 수 있기 때문에 잘 이해해야 합니다.

값에 의한 전달은 인수 값이 함수 내에서 사용할 로컬 변수에 복사되는 것을 의미합니다. 참조에 의한 전달은 실제 값 대신 인수에 대한 참조만 전달되는 것을 의미합니다. 이 경우 실제 인수가 복사되지는 않습니다. 대신 인수로 전달된 변수에 대한 참조가 만들어져 함수 내에서 사용할 로컬 변수에 지정됩니다. 로컬 변수를 함수 외부의 변수에 대한 참조로 사용하여 원본 변수의 값을 변경할 수 있습니다.

ActionScript 3.0에서는 모든 값이 객체로 저장되므로 모든 인수가 참조를 기준으로 전달됩니다. 그러나 Boolean, Number, int, uint 및 String 등이 포함된 프리미티브 데이터 유형에 속한 객체에는 값을 기준으로 전달된 것과 같이 동작하도록 하는 특수 연산자가 있습니다. 예를 들어, 다음 코드에서는 xParamyParam이라고 하는 int 유형의 두 매개 변수를 정의하는 passPrimitives() 함수를 만듭니다. 이러한 매개 변수는 passPrimitives() 함수 본문 내에 선언된 로컬 변수와 유사합니다. xValueyValue 인수를 사용하여 함수를 호출하면 xParamyParam 매개 변수는 xValueyValue로 표시되는 int 객체에 대한 참조로 초기화됩니다. 인수가 프리미티브 값이기 때문에 값을 기준으로 전달된 것처럼 동작합니다. 처음에는 xParamyParamxValueyValue 객체에 대한 참조만 포함되지만 함수 본문 내에서 xParamyParam의 값을 변경하면 메모리에 새 값의 복사본이 생성됩니다.

function passPrimitives(xParam:int, yParam:int):void
{
    xParam++;
    yParam++;
    trace(xParam, yParam);
}

var xValue:int = 10;
var yValue:int = 15;
trace(xValue, yValue);          // 10 15
passPrimitives(xValue, yValue); // 11 16
trace(xValue, yValue);          // 10 15

passPrimitives() 함수 내에서는 xParamyParam의 값이 증가되지만 마지막 trace 문에서와 같이 xValueyValue의 값에는 영향을 주지 않습니다. 함수 내에 있는 xValueyValue는 함수 외부에 있는 동일한 이름의 변수와 별개로 존재하는 메모리의 새 위치를 가리키기 때문에 매개 변수가 xValueyValue 변수와 이름이 동일한 경우에도 영향을 미치지 않습니다.

프리미티브 데이터 유형에 속하지 않은 다른 모든 객체는 항상 참조로 전달되므로 원본 변수의 값을 변경할 수 있습니다. 예를 들어, 다음 코드에서는 xy라는 두 가지 속성이 있는 objVar 객체를 만듭니다. 이 객체는 passByRef() 함수에 인수로 전달됩니다. 이 객체는 프리미티브 유형이 아니기 때문에 참조를 기준으로 전달될 뿐만 아니라 참조를 유지합니다. 즉, 함수 내에 있는 매개 변수가 변경되면 함수 외부의 객체 속성에도 적용됩니다.

function passByRef(objParam:Object):void
{
    objParam.x++;
    objParam.y++;
    trace(objParam.x, objParam.y);
}
var objVar:Object = {x:10, y:15};
trace(objVar.x, objVar.y); // 10 15
passByRef(objVar);         // 11 16
trace(objVar.x, objVar.y); // 11 16

objParam 매개 변수가 objVar 전역 변수와 동일한 객체를 참조합니다. 예제의 trace 문에서 볼 수 있듯이 objParam 객체의 xy 속성을 변경하면 objVar 객체에 반영됩니다.

매개 변수 기본값

ActionScript 3.0에는 함수의 매개 변수 기본값을 선언할 수 있는 새로운 기능이 있습니다. 매개 변수 기본값이 있는 함수를 호출할 때 기본값이 있는 매개 변수를 생략하면 해당 매개 변수에 대해 함수 정의에 지정된 값이 사용됩니다. 기본값이 있는 모든 매개 변수는 매개 변수 목록의 끝에 배치해야 합니다. 기본값으로 지정된 값은 컴파일 타임 상수여야 합니다. 매개 변수에 대해 기본값을 사용하여 매개 변수를 효과적으로 선택적 매개 변수로 만들 수 있습니다. 기본값이 없는 매개 변수는 필수 매개 변수로 간주됩니다.

예를 들어, 다음 코드는 세 개의 매개 변수가 있는 함수를 만들며 이 중 두 매개 변수에는 기본값이 있습니다. 하나의 매개 변수만 사용하여 함수를 호출하면 나머지 매개 변수에는 기본값이 사용됩니다.

function defaultValues(x:int, y:int = 3, z:int = 5):void
{
    trace(x, y, z);
}
defaultValues(1); // 1 3 5

arguments 객체

함수에 인수가 전달되면 arguments 객체를 사용하여 함수에 전달된 매개 변수에 대한 정보에 액세스할 수 있습니다. arguments 객체는 다음과 같은 측면에서 고찰해야 합니다.

중요

 

arguments 객체를 사용할 수 없는 경우, 이름이 arguments인 매개 변수가 있거나 사용자가 ...(rest) 매개 변수를 사용하는 경우

ActionScript 3.0에서는 함수 정의에 정의된 매개 변수보다 많은 매개 변수를 사용하여 함수를 호출할 수 있지만, 매개 변수의 수가 필수 매개 변수의 수보다 적으면 Strict 모드에서 컴파일러 오류가 발생합니다. arguments 객체를 배열로 사용하면 해당 매개 변수가 함수 정의에 정의되어 있는지 여부에 관계없이 함수에 전달된 모든 매개 변수에 액세스할 수 있습니다. 다음 예제에서는 arguments.length 속성과 함께 arguments 배열을 사용하여 traceArgArray() 함수에 전달된 매개 변수를 모두 추적합니다.

function traceArgArray(x:int):void
{
    for (var i:uint = 0; i < arguments.length; i++)
    {
        trace(arguments[i]);
    }
}

traceArgArray(1, 2, 3);

// 출력:
// 1
// 2
// 3

arguments.callee 속성은 주로 재귀를 만들 때 익명 함수에 사용됩니다. 이 속성을 사용하여 코드에 융통성을 추가할 수 있습니다. 함수 이름 대신 arguments.callee를 사용하면 개발 주기 과정에서 재귀 함수 이름이 변경된 경우 함수 본문에서 재귀 호출을 변경하는 것에 신경 쓰지 않아도 됩니다. arguments.callee 속성은 다음 함수 표현식에서 재귀를 활성화하는 데 사용됩니다.

var factorial:Function = function (x:uint)
{
    if(x == 0)
    {
        return 1;
    }
    else
    {
        return (x * arguments.callee(x - 1));
    }
}

trace(factorial(5)); // 120

함수 선언에서 ...(rest) 매개 변수를 사용하면 arguments 객체는 사용할 수 없습니다. 대신 선언한 매개 변수 이름을 사용하여 매개 변수에 액세스해야 합니다.

또한 매개 변수 이름으로 "arguments" 문자열을 사용하면 arguments 객체가 가려지므로 이렇게 사용하지 않는 것이 좋습니다. 예를 들어, traceArgArray() 함수가 다시 작성되어 arguments 매개 변수가 추가되는 경우 함수 본문에 있는 arguments에 대한 참조를 사용하면 arguments 객체가 아닌 매개 변수를 참조하게 됩니다. 다음 코드는 출력을 생성하지 않습니다.

function traceArgArray(x:int, arguments:int):void
{
    for (var i:uint = 0; i < arguments.length; i++)
    {
        trace(arguments[i]);
    }
}

traceArgArray(1, 2, 3);

// 출력되는 내용이 없습니다.

이전 버전의 ActionScript에 있는 arguments 객체에는 현재 함수를 호출한 함수에 대한 참조인 caller 속성도 포함되어 있습니다. ActionScript 3.0에는 caller 속성이 없지만 호출 함수에 대한 참조가 필요한 경우 호출 함수 자체에 대한 참조인 추가 매개 변수가 전달되도록 호출 함수를 변경할 수 있습니다.

...(rest) 매개 변수

ActionScript 3.0에서 ...(rest) 매개 변수라는 새 매개 변수 선언을 제공합니다. 이 매개 변수를 사용하면 쉼표로 구분된 인수를 무제한으로 받아들이는 배열 매개 변수를 지정할 수 있습니다. 매개 변수에는 예약어를 제외한 모든 이름이 포함될 수 있습니다. 이 매개 변수 선언은 마지막으로 지정된 매개 변수여야 합니다. 이 매개 변수를 사용하면 arguments 객체를 사용할 수 없습니다. ... (rest) 매개 변수에서 arguments 배열 및 arguments.length 속성과 동일한 기능을 제공하지만 arguments.callee에서 제공하는 것과 유사한 기능을 제공하지는 않습니다. ...(rest) 매개 변수를 사용하기 전에 arguments.callee를 사용할 필요가 없는지 확인해야 합니다.

다음 예제에서는 arguments 객체 대신 ...(rest) 매개 변수를 사용하여 traceArgArray() 함수를 다시 작성합니다.

function traceArgArray(... args):void
{
    for (var i:uint = 0; i < args.length; i++)
    {
        trace(args[i]);
    }
}

traceArgArray(1, 2, 3);

// 출력:
// 1
// 2
// 3

... (rest) 매개 변수가 마지막으로 나열되기만 하면 다른 매개 변수와 함께 사용할 수도 있습니다. 다음 예제에서는 int 유형의 x를 첫 번째 매개 변수로 사용하고 ... (rest) 매개 변수를 두 번째 매개 변수로 사용할 수 있도록 traceArgArray() 함수를 수정합니다. 첫 번째 매개 변수가 더 이상 ...(rest) 매개 변수에서 만든 배열의 일부가 아니기 때문에 첫 번째 값은 출력에서 제외됩니다.

function traceArgArray(x: int, ... args)
{
    for (var i:uint = 0; i < args.length; i++)
    {
        trace(args[i]);
    }
}

traceArgArray(1, 2, 3);

// 출력:
// 2
// 3

Flash CS3

 

이 페이지에 의견 추가되면 전자 메일 알림 받기 | 의견 보고서

현재 페이지: http://livedocs.adobe.com/flash/9.0_kr/main/00000055.html