함수 오버로드

함수 오버로드()는 다양한 에이다(Ada), C#, C++, 자바(Java) 등의 다양한 프로그래밍 언어에서 사용되는 함수의 특징으로, 같은 함수 이름을 가지고 있으나 매개변수, 리턴타입 등의 특징은 다른 여러개의 서브프로그램 생성을 가능하게 한다.
(C언어는 지원하지 않는다)

예를 들어, doTask() 와 doTask(object O)는 오버로드된 함수이다. 후자를 호출하려면, 매개변수 없이 호출 가능한 전자의 경우와는 달리 객체를 매개변수로 넘겨주어야 한다. 자주 하는 실수가 바로 후자의 함수의 객체에 기본값을 부여하는 것인데, 이것은 모호한 호출을 하여 컴파일러가 둘 중의 어느 함수를 호출하였는지 알 수 없게되어 발생한다.

또 다른 예로 Print(object O) 함수를 들 수 있다. 이 경우, 우리는 글자를 출력하거나 그림을 출력할 때 이 함수가 서로 다르게 기능하기를 원한다. 이를 다른 두 함수로 표현하기 위해서는 Print(text_object T); Print(image_object P)로 각자 오버로드 되어야한다. 우리가 출력하기를 원하는 모든 객체에 오버로드 된 print 함수(메소드)를 사용할 수 있다면 우리는 객체의 형식과 올바른 함수를 호출 하기 위해 걱정할 필요가 없이 Print(something)의 통일된 형태로 가능하게 된다.

함수 오버로드는 런타임에 적절한 함수가 선택되는 가상 함수와 혼동되어서는 안된다.

주의사항 
만약 메소드(함수)가 너무 많은 오버로드로 설계되면, 개발자들이 단지 코드만을 보고 어떤 오버로드가 호출되었는지 아는 것이 어려워진다. 이것은 특히 오버로드된 매개변수 형식이 다른 가능한 매개변수로부터 상속받은 형식일 때 극명히 드러난다.

예시

C++에서의 함수 오버로딩 예시 
#include <iostream>

int Volume(int s) {  // Volume of a cube.
  return s * s * s;
}

double Volume(double r, int h) {  // Volume of a cylinder.
  return 3.1415926 * r * r * static_cast<double>(h);
}

long Volume(long l, int b, int h) {  // Volume of a cuboid.
  return l * b * h;
}

int main() {
  std::cout << Volume(10);
  std::cout << Volume(2.5, 8);
  std::cout << Volume(100l, 75, 15);
}

같이 보기 
 공장 메서드 패턴
 객체지향 프로그래밍
 생성자
 추상화
 동적할당
 함수 오버라이드
 연산자 오버라이드

외부 링크 
 Bertrand Meyer: Overloading vs Object Technology, in Journal of Object-Oriented Programming (JOOP), vol. 14, no. 4, October-November 2001, available online

프로그래밍 구성체
메소드 (컴퓨터 프로그래밍)