함수 오버로딩
함수 오버로딩 (Function overloading)
함수 오버로딩은 같은 이름의 함수를 서로 다른 형식 매개변수 목록으로 여러 번 정의하는 것이에요.
출처: 문서
본문
함수 오버로딩(function overloading)은 간단히 말해 같은 함수를 서로 다른 형식 매개변수 목록으로 여러 번 정의하는 것이에요. 이때 매개변수 목록은 요소 타입 중 적어도 하나가 달라야 해요. 컴파일러가 함수 호출을 만나면 그 함수의 매개변수를 보고, 정의된 함수들 중 어느 것을 호출할지 결정해요. 같은 함수를 여러 타입에 대해 정의해야 할 때 유용하죠.
예를 들어, 가상의 RTL에서 Random 프로시저는 다음과 같이 정의될 수 있어요.
Random (Max : Longint);
Random (Max : Double);
Random (Max, Ofsset : Longint);
컴파일러가 Random 호출을 만나면 어떤 함수를 쓸지 먼저 검색해요. 호출의 매개변수를 검사해서 지정된 매개변수 목록과 일치하는 함수 정의가 있는지 확인하고, 찾으면 그 함수를 호출하죠. 일치하는 함수가 없으면 컴파일 오류를 생성해요.
여기서 몇 가지 주의할 제한이 있어요.
- cdecl 수정자가 붙은 함수는 오버로딩할 수 없어요. (기술적으로는 이 수정자가 컴파일러의 함수 이름 맹글링[mangling]을 막기 때문이에요.)
- 컴파일러 1.9 버전 이전에는 오버로딩한 함수들이 같은 유닛에 있어야 했어요. 이제는 한 유닛에서 일치하는 버전을 찾지 못하고
overload키워드가 있으면, 컴파일러가 다른 유닛에서도 계속 검색해요. overload키워드가 없다면 모든 오버로딩 버전이 같은 유닛에 있어야 하고, 클래스의 메서드라면 같은 클래스에 있어야 해요. 즉overload키워드를 지정하지 않으면 컴파일러는 부모 클래스의 오버로딩 메서드를 찾지 않아요.
참고: 컴파일러 내장 함수를 재정의(그리고 오버로딩)하면 원래 컴파일러 함수는 더 이상 사용할 수 없어요. 예를 들어
Inc()와Dec()가 그런 경우예요.