Out 매개변수
Out 매개변수 (Out parameters)
프로시저가 값을 "출력"하기만 하고 싶을 때가 있어요. 그럴 때 쓰는 것이 **out 매개변수(output parameter)**예요. 변수 매개변수처럼 참조로 전달되지만, 호출할 때 변수의 초기값을 버리고 결과만 돌려받는 용도로 설계됐어요.
본문
out 매개변수는 매개변수 이름 앞에 out 키워드를 붙여서 선언해요.
procedure 이름(out 매개변수 : 타입);
out 매개변수의 목적은 값을 호출한 루틴에 다시 돌려주는 거예요. 이때 변수는 참조로 전달돼요. 함수에 진입할 당시의 매개변수 초기값은 버려지고, 사용되면 안 돼요.
만약 변수가 함수에 값을 전달하면서 결과도 받아와야 한다면, 변수 매개변수(variable parameter)를 써야 해요. 단지 값을 받아오기만 하면 된다면 out 매개변수를 쓰면 돼요.
말할 것도 없이, out 매개변수에는 기본값이 지원되지 않아요.
out 매개변수와 참조(변수) 매개변수의 차이는 아주 작아요(단, 아래의 관리 타입은 예외예요). 차이는 주로 컴파일러에게 더 많은 정보를 준다는 점이에요: out 매개변수는 변수가 호출 전에 초기화되지 않아도 된다는 것을 컴파일러가 알게 해줘요. 다음 예시로 확인해 볼게요.
Procedure DoA(Var A : Integer);
begin
A:=2;
Writeln('A is ',A);
end;
Procedure DoB(Out B : Integer);
begin
B:=2;
Writeln('B is ',B);
end;
Var
C,D : Integer;
begin
DoA(C);
DoB(D);
end.
두 프로시저 DoA와 DoB는 실질적으로 같아요. 하지만 DoB의 선언은 컴파일러에게 더 많은 정보를 줘서, D는 DoB가 호출되기 전에 초기화될 필요가 없다는 것을 감지하게 해요. 반면 DoA의 매개변수 A는 값을 받을 수도 있고 돌려줄 수도 있기 때문에, 컴파일러는 C가 DoA 호출 전에 초기화되지 않았다는 사실을 알려줘요.
home: >fpc -S2 -vwhn testo.pp
testo.pp(19,8) Hint: Variable "C" does not seem to be initialized
이것은 매개변수가 값을 돌려주는 데만 쓰인다면 out 매개변수를 쓰는 편이 더 낫다는 것을 보여줘요.
참고: out 매개변수는 Delphi와 ObjFPC 모드에서만 지원돼요. 그 외의 모드에서는 out이 유효한 식별자예요.
참고: 관리 타입(참조 카운트 타입)의 경우 out 매개변수를 쓰면 약간의 오버헤드가 발생해요. 컴파일러가 값이 올바르게 초기화(즉 참조 카운트가 0)되도록 보장해야 하기 때문이에요. 이 초기화는 보통 호출자가 수행해요.
더 알아보기
- 변수 매개변수(14.4.2)와 함께 비교해 보면 out 매개변수의 용도를 정확히 이해할 수 있어요.
- 관리 타입(관리 타입과 참조 카운트)은 14.4.8에서 다뤄요.