변수 매개변수
변수 매개변수 (Variable parameters)
값 매개변수는 복사본을 전달해서 호출 쪽에 영향을 줄 수 없었죠. 반대로 프로시저가 호출 쪽의 값을 직접 바꿔야 한다면 **변수 매개변수(variable parameter)**를 써야 해요. 이 방식은 변수의 **주소(포인터)**를 넘겨서, 프로시저 안에서 바꾼 값이 호출 쪽에도 그대로 반영돼요.
본문
변수 매개변수는 매개변수 이름 앞에 var 키워드를 붙여서 선언해요.
procedure 이름(var 매개변수 : 타입);
매개변수가 변수 매개변수로 선언되면, 프로시저나 함수는 호출 블록이 매개변수 목록에 넘긴 변수에 직접 접근해요. 프로시저는 넘겨진 변수의 포인터를 받아서, 그 포인터를 통해 변수의 값을 접근해요. 여기서 알 수 있듯이, 매개변수에 가해진 어떤 변경도 호출 블록으로 그대로 반향(전파)돼요.
이 메커니즘은 프로시저에서 값을 다시 돌려보내는 데 쓸 수 있어요. 그래서 호출 블록은 반드시 선언된 매개변수의 타입과 정확히 같은 타입의 매개변수를 넘겨야 해요. 그렇지 않으면 컴파일러가 에러를 발생시켜요.
변수 매개변수와 상수 매개변수는 타입이 없는(untyped) 상태로도 선언될 수 있어요. 이 경우 그 변수에는 타입이 없으므로, 다른 모든 타입과 호환되지 않아요. 다만 주소 연산자(@)를 쓸 수 있고, 똑같이 타입 없는 매개변수를 가진 함수에 넘길 수 있어요. 타입 없는 매개변수를 대입문에서 쓰거나 값을 할당해야 한다면 반드시 typecast를 사용해야 해요.
파일 타입 변수는 항상 변수 매개변수로 전달해야 해요.
개방 배열(open array)도 변수 매개변수로 전달할 수 있어요. 자세한 내용은 14.4.5절(759페이지)에서 다뤄요.
참고: 변수 매개변수에는 기본값이 지원되지 않아요. 호출자에게 값을 다시 돌려보내는 목적을 생각하면, 기본값을 두는 것은 의미가 없거든요.
한 가지 더 알아둘 점이 있어요. 함수 결과(function result)는 내부적으로 변수 매개변수처럼 취급되며, 0이 아닌(또는 nil이 아닌) 초기값을 가질 수 있어요. 이것은 특히 관리 타입(managed type)에서 중요해요.
더 알아보기
- 값 매개변수(14.4.1)와의 차이를 비교해 보면 좋아요 — 값 매개변수는 복사, 변수 매개변수는 참조.
- 타입 없는 매개변수(untyped parameter)에 대해 더 보고 싶다면 14.4.7을 참고해요.