ADOBE/ ActionScript

액션스크립트(3.0기준): 함수 매개 변수

AlrepondTech 2011. 4. 22. 16:35
반응형

 

 

 

=================================

=================================

=================================

 

 

 

 

 

출처: http://designonex.com/bbs/board.php?bo_table=flash&wr_id=104

함수 매개 변수

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

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

여러 프로그래밍 언어에서 값에 의한 인수 전달과 참조에 의한 인수 전달 간의 차이점은 코드를 설계하는 방법에 영향을 미칠 수 있기 때문에 잘 이해해야 합니다.
값 에 의한 전달은 인수 값이 함수 내에서 사용할 로컬 변수에 복사되는 것을 의미합니다. 참조에 의한 전달은 실제 값 대신 인수에 대한 참조만 전달되는 것을 의미합니다. 이 경우 실제 인수가 복사되지는 않습니다. 대신 인수로 전달된 변수에 대한 참조가 만들어져 함수 내에서 사용할 로컬 변수에 지정됩니다. 로컬 변수를 함수 외부의 변수에 대한 참조로 사용하여 원본 변수의 값을 변경할 수 있습니다.
Actionscript 3.0에서는 모든 값이 객체로 저장되므로 모든 인수가 참조를 기준으로 전달됩니다. 그러나 Boolean, Number, int, uint 및 String 등이 포함된 프리미티브 데이터 유형에 속한 객체에는 값을 기준으로 전달된 것과 같이 동작하도록 하는 특수 연산자가 있습니다. 예를 들어, 다음 코드에서는 
xParam 및 
yParam이라고 하는 int 유형의 두 매개 변수를 정의하는 
passPrimitives() 함수를 만듭니다. 이러한 매개 변수는 
passPrimitives() 함수 본문 내에 선언된 로컬 변수와 유사합니다. 
xValue 및 
yValue 인수를 사용하여 함수를 호출하면 
xParam 및 
yParam 매개 변수는 
xValue 및 
yValue로 표시되는 int 객체에 대한 참조로 초기화됩니다. 인수가 프리미티브 값이기 때문에 값을 기준으로 전달된 것처럼 동작합니다. 처음에는 
xParam 및 
yParam에 
xValue 및 
yValue 객체에 대한 참조만 포함되지만 함수 본문 내에서 xParam 및 yParam의 값을 변경하면 메모리에 새 값의 복사본이 생성됩니다.
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() 함수 내에서는 
xParam 및 
yParam의 값이 증가되지만 마지막 
trace 문에서와 같이 
xValue 및 
yValue의 값에는 영향을 주지 않습니다. 함수 내에 있는 
xValue 및 
yValue는 함수 외부에 있는 동일한 이름의 변수와 별개로 존재하는 메모리의 새 위치를 가리키기 때문에 매개 변수가 
xValue 및 
yValue 변수와 이름이 동일한 경우에도 영향을 미치지 않습니다.
프리미티브 데이터 유형에 속하지 않은 다른 모든 객체는 항상 참조로 전달되므로 원본 변수의 값을 변경할 수 있습니다. 예를 들어, 다음 코드에서는 
x와 
y라는 두 가지 속성이 있는 
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 객체의 
x 및 
y 속성을 변경하면 
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.length
     속성에는 함수에 전달된 매개 변수의 수가 저장됩니다.
  • arguments.callee
     속성은 함수 자체에 대한 참조를 제공하며 이는 함수 표현식에 대한 재귀 호출에 유용합니다.함수 본문에서 
    arguments
     객 체를 참조하는 경우 Actionscript 3.0에서는 함수 정의에 정의된 매개 변수보다 많은 매개 변수를 사용하여 함수를 호출할 수 있지만, 매개 변수의 수가 필수 매개 변수(경우에 따라 모든 선택적 매개 변수도 포함)의 수와 일치하지 않으면 엄격 모드에서 컴파일러 오류가 발생합니다.
    arguments
     객체를 배열로 사용하면 해당 매개 변수가 함수 정의에 정의되어 있는지 여부에 관계없이 함수에 전달된 모든 매개 변수에 액세스할 수 있습니다. 다음은 
    arguments.length
     속성과 함께 
    arguments
     배열을 사용하여 
    traceArgArray()
     함수에 전달된 매개 변수를 모두 추적하는 예제입니다. 이 예제는 표준 모드에서만 컴파일됩니다.
    arguments.callee
     속성은 주로 재귀를 만들 때 익명 함수에 사용됩니다. 이 속성을 사용하여 코드에 융통성을 추가할 수 있습니다. 함수 이름 대신
    arguments.callee
    를 사용하면 개발 주기 과정에서 재귀 함수 이름이 변경된 경우 함수 본문에서 재귀 호출을 변경하는 것에 신경 쓰지 않아도 됩니다.
    arguments.callee
     속성은 다음 함수 표현식에서 재귀를 활성화하는 데 사용됩니다.함수 선언에서 ...(rest) 매개 변수를 사용하면 
    arguments
     객체는 사용할 수 없습니다. 대신 선언한 매개 변수 이름을 사용하여 매개 변수에 액세스해야 합니다.function traceArgArray(x:int, arguments:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // no output
    이전 버전의 Actionscript에 있는 
    arguments
     객체에는 현재 함수를 호출한 함수에 대한 참조인 
    caller
     속성도 포함되어 있습니다. Actionscript 3.0에는
    caller
     속성이 없지만 호출 함수에 대한 참조가 필요한 경우 호출 함수 자체에 대한 참조인 추가 매개 변수가 전달되도록 호출 함수를 변경할 수 있습니다.
  • 또한 매개 변수 이름으로 
    "arguments"
     문자열을 사용하면 
    arguments
     객체가 가려지므로 이렇게 사용하지 않는 것이 좋습니다. 예를 들어,
    traceArgArray() 
    함수가 다시 작성되어 
    arguments
     매개 변수가 추가되는 경우 함수 본문에 있는 
    arguments
    에 대한 참조를 사용하면 
    arguments
     객체가 아닌 매개 변수를 참조하게 됩니다. 다음 코드는 출력을 생성하지 않습니다.
  • var factorial:Function = function (x:uint) { if(x == 0) { return 1; } else { return (x * arguments.callee(x - 1)); } } trace(factorial(5)); // 120
  • function traceArgArray(x:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // output: // 1 // 2 // 3
  • 참고: arguments 객체는 이름이 arguments인 매개 변수가 있거나 사용자가 ... (rest) 매개 변수를 사용하는 경우 사용할 수 없습니다.

... (rest) 매개 변수

Actionscript 3.0에는 ... (rest) 매개 변수라는 새 매개 변수 선언이 도입되었습니다. 이 매개 변수를 사용하면 쉼표로 구분된 인수를 무제한으로 받아들이는 배열 매개 변수를 지정할 수 있습니다. 매개 변수는 예약어가 아닌 어떤 이름이나 가질 수 있습니다. 이 매개 변수 선언은 마지막으로 지정된 매개 변수여야 합니다. 이 매개 변수를 사용하면 
arguments 객체를 사용할 수 없습니다. ... (rest) 매개 변수에서 
arguments 배열 및 
arguments.length 속성과 동일한 기능을 제공하지만
arguments.callee에서 제공하는 것과 유사한 기능을 제공하지는 않습니다. ...(rest) 매개 변수를 사용하기 전에 
arguments.callee를 사용할 필요가 없는지 확인해야 합니다.
다음은 
traceArgArray() 함수를 다시 작성하기 위해 
arguments 객체 대신 ...(rest) 매개 변수를 사용하는 예제입니다.
function traceArgArray(... args):void { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // output: // 1 // 2 // 3
... (rest) 매개 변수가 마지막으로 나열되기만 하면 다른 매개 변수와 함께 사용할 수도 있습니다. 다음은 
traceArgArray() 함수를 수정하여 int 유형의 
x를 첫 번째 매개 변수로 사용하고 ... (rest) 매개 변수를 두 번째 매개 변수로 사용하는 예제입니다. 첫 번째 매개 변수가 더 이상 ... (rest) 매개 변수에서 만든 배열의 일부가 아니기 때문에 첫 번째 값은 출력에서 제외됩니다.
function traceArgArray(x: int, ... args) { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // output: // 2 // 3
 

 

 

 

=================================

=================================

=================================

 

 

 

 

반응형