StartprogrammingusingObjectPascal:CallingByReference

From 흡혈양파의 번역工房
Revision as of 10:34, 26 July 2012 by Onionmixer (talk | contribs) (SPOP 참조에의한호출 페이지 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

참조에 의한 호출

DoSomething의 x인자 선언부에 var 키워드를 추가하면 달라질 것입니다.

procedure DoSomething(var x: Integer);
begin
    x:= x * 2;
    Writeln('From inside procedure: x = ', x);
end;

// main

var
    MyNumber: Integer;
begin
    MyNumber:= 5;

    DoSomething(MyNumber);
    Writeln('From main program, MyNumber = ', MyNumber);
    Writeln('Press enter key to close');
    Readln;
end.

이제 x에 따라 MyNumber의 값이 달라질 것이며, 이는 이들 변수가 같은 메모리 위치를 공유한다는 의미입니다.

이 때, 우리는 같은 형식의 변수(상수 아님)를 프로시저로 전달할 것입니다. 만약 인자를 Byte로 선언했다면, MyNumber는 Byte로 선언할 것입니다. 반면에 인자가 정수형이면 MyNumber역시 정수형이 될 것입니다.

다음 예제는 인자에 변수를 필요로 하는 DoSomething을 호출했을 때, 오류가 생길 것입니다.

DoSomething(5);

값에 의한 호출에서는 이전 코드에서는 사용할 수 있었는데, 인자로 전달한 값에 대해서만 다루었고, 5가 값이었습니다. 하지만 참조에 의한 호출에서는 인자로 전달한 변수에 대해 취급하며, 전달한 변수의 값에 대해 동작합니다.

다음 예제에서는 두 개의 변수를 전달할 것이고, 프로시저에서 두 변수의 값을 바꿀 것입니다.

procedure SwapNumbers(var x, y: Integer);
var
    Temp: Integer;
begin
    Temp:= x;
    x:= y;
    y:= Temp;
end;

// main
var
    A, B: Integer;
begin

    Write('Please input value for A: ');
    Readln(A);
    Write('Please input value for B: ');
    Readln(B);

    SwapNumbers(A, B);
    Writeln('A = ', A, ', and B = ', B);
    Writeln('Press enter key to close');
    Readln;
end.