함수 오버로딩

함수 오버로딩 (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()가 그런 경우예요.

더 알아보기