StartprogrammingusingObjectPascal:CallingByReference

From 흡혈양파의 번역工房
Jump to: navigation, search

참조에 의한 호출

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

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.