overload 함수 수식자
overload 함수 수식자
함수·프로시저가 오버로드(overload)됐다는 걸 컴파일러에 알려주는 수식자가 overload예요. Free Pascal에서는 대부분의 경우 인자 없이도 오버로딩이 되지만, 다른 유닛의 함수를 오버로드할 때는 이 수식자가 필수예요.
본문
overload 수식자는 이 함수가 오버로드되었다고 컴파일러에 알려줘요. 주로 Delphi 호환성을 위해 쓰이는데, Free Pascal에서는 이 수식자 없이도 모든 함수·프로시저를 오버로드할 수 있어요.
overload 수식자가 필수인 경우는 딱 하나예요. 바로 다른 유닛에 있는 함수를 오버로드할 때예요. 이때는 두 함수 모두 overload 수식자로 선언해야 해요. overload 수식자는 컴파일러에게 다른 유닛에서 오버로드된 버전을 계속 찾으라고 알려주는 역할을 해요.
예시를 통해 볼게요. 첫 번째 유닛부터 살펴보죠.
unit ua;
interface
procedure DoIt(A : String); overload;
implementation
procedure DoIt(A : String);
begin
Writeln('ua.DoIt received ',A)
end;
end.
그리고 오버로드된 버전을 담은 두 번째 유닛이에요.
unit ub;
interface
procedure DoIt(A : Integer); overload;
implementation
procedure DoIt(A : integer);
begin
Writeln('ub.DoIt received ',A)
end;
end.
두 유닛을 모두 사용하는 프로그램은 다음과 같아요.
program uab;
uses ua,ub;
begin
DoIt('Some string');
end.
컴파일러가 DoIt의 선언을 찾기 시작하면 ub 유닛에서 하나를 발견하게 돼요. 만약 overload 지시어가 없다면 컴파일러는 다음과 같은 인자 불일치 오류를 내보낼 거예요.
home: >fpc uab.pp
uab.pp(6,21) Error: Incompatible type for arg no. 1:
Got "Constant String", expected "SmallInt"
두 위치 모두에 overload 지시어가 있으면, 컴파일러는 일치하는 매개변수 목록을 가진 오버로드 버전을 계속 찾아야 한다는 것을 알게 돼요. 여기서 중요한 점이 하나 있어요. 두 선언 모두 overload 수식자가 지정되어야 한다는 거예요. ub 유닛에만 수식자가 있고 다른 쪽엔 없다면 부족해요. 이는 원치 않는 오버로딩을 막기 위해서예요. ua 유닛을 만든 프로그래머가 이 프로시저가 오버로딩에 적합하다는 것을 명시적으로 표시해야 하는 거죠.
더 알아보기
- Free Pascal의 프로시저·함수 오버로딩
- Delphi 호환성 관련 지시어
- Free Pascal Reference의 프로시저·함수 수식자 섹션