부프로그램의 형식 매개 변수란 부프로그램이 실행되는 동안 식 또는 다른 이름을 대신하여 그 프로그램에서 사용되는 이름을 의미하며, 대신 사용된 원래의 식 또는 이름을 실매개 변수라 부른다. 이 매개 변수는 프로시저의 정의에서 선언되어 일반적으로 지역 변수 역할을 한다.
아래 프로시저 P의 정의문들에서 A와 B가 형식 매개 변수이다.
- SUBROUTINE P(A, B) [Fotran]
- procedure P(A, B) [Algol]
- P : PROCEDURE(A, B) ; [PL/I]
위에서 선언된 부프로그램들을 실매개 변수 X와 Y*Z를 가지고 호출하는 문장들은 다음과 같다.
- CALL P(X, Y*Z)
- P(X, Y*Z)
- CALL P(X, Y*Z)
여기서 X는 부프로그램 P의 형식 매개 변수 A와 대응하는 실매개 변수이며, Y*Z는 형식 매개 변수 B에 대응하는 실매개 변수이다. 실매개 변수로서 상수난 수식의 사용 여부는 프로그래밍 언어에 따라 다르다. 어떻든 실매개 변수로서 가장 중요한 차이점은 실매개 변수가 변수인가 수식인가에 달려 있다. 프로시저가 호출되었을 때, 호출한 프로그램(caller)은 실매개 변수들의 주소들을 직접 또는 간접으로 프로시저에 보낸다.
호출당한 프로시저(caller)는 실매개 변수와 형식 매개 변수를 대응시키기 위하여 필요한 주소나 값을 복사하기도 한다. 프로그래밍 언어에 따라 대응되는 값을 전달시키는 방법은 다르지만 다음과 같은 기본적인 세 가지 기법이 사용된다.
1. Call By reference(by address, by location)
Call By reference는 참조에 의한 호출, 간결하게 참조 호출, 또는 참조 전달 기법(parameter passing by reference)이라 부르기도 한다.
참조 전달 기법이란 실매개 변수 주소를 대응하는 형식 매개 변수에 보내는 방법이다. 이 기법을 사용하는 대표적인 언어에 Fortran과 PL/I이 있다. Pascal에서도 예약어 var를 사용할 경우 이 기법이 적용되는데, 경우에 따라서는 call by value result 전달 기법이 적용되기도 한다.
이 기법을 수행하는 기본 순서는 다음과 같다. 우선 호출하는 프로그램(caller)은 사용된 실매개 변수가 수식인지를 판가름하여 수식이면 그 값을 계산해서 임시 기억 장소에 저장한다. 또한 필요한 경우 실매개 변수에 해당되는 주소(변수는 주소, 수식은 그 값이 있는 임시 기억 장소, 배열 원소는 그 원소의 주소)를 계산하여야 한다. 그러고 나서, 실매개 변수를 참조할 수 있도록 그 주소들을 호출당한 프로시저(caller)에 전달한다.
2. Call by value ; Call by result
Call by value 기법은 값에 의한 호출, 값 호출, 또는 값 전달 기법이라고도 부른다. 값 전달 기법은 호출된 부프로그램 자신이 형식 매개 변수에 해당되는 기억 장소를 별도로 유지하는 방법인데, 호출한 프로그램이 실매개 변수에 해당되는 주소를 보내면 호출된 부프로그램은 r-value를 구하여 그 자신이 보유하고 있는 형식 매개 변수의 기억 장소에 복사해서 다른 지역 변수와 동일하게 취급하여 사용한다.
값 전달 기법에서는 변수 값이 어떠한 경우라도 변하지 않는다. 실매개 변수의 r-value를 형식 매개 변수의 기억 장소에 복사하는 일은 callee에서만 행하는 것이 아니라, 언어의 구현하는 방법에 따라 caller에서도 지정된 장소에 복사해 준 후 호출할 수도 있다/ 이 기법은 Pascal에서 기본으로 사용되며 Algol 60 에서는 예약어 value를 사용하여 이 기법을 적용할 수 있다.
3. Call by name
Call by name은 이름에 의한 호출, 이름 호출 또는 이름 전달 기법이라 부르는데, 형식 매개 변수의 이름이 사용될 때마다 그에 대응되는 실매개 변수 그 자체가 사용된 것처럼, 필요한 r-value 또는 l-value를 매번 구하여 실행하는 방법을 의미한다.
그러므로, 형식 매개 변수가 사용된 모든 자리에 실매개 변수를 그대로 복사한 것처럼 간주하면 된다. 이 기법은 Algol 60에서 매개 변수 전달 기법의 표준으로 사용되었다.
댓글