StartprogrammingusingObjectPascal:CallingByReference
참조에 의한 호출
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.