함수 오버로드 - Overloading Functions

오버로드 (Overload) 라는 뜻은 어떤 사물을 Over 해서 적재 load 한다는 뜻입니다.

 

스타크래프트의 유명한 오버로드 (Overlord 위에 있는 군주)와 발음이 같으나 뜻이 다르니 주의해야 합니다.

 

함수를 오버로드한다는 뜻은 함수의 이름 하나에 여러개의 함수를 적재하겠다는 뜻입니다.

 

함수 오버로드 - Overloading Functions

예를 위한 덧셈 함수를 만들어 보겠습니다. 고전적이지만 이해하기 쉬운 예제입니다.

 

함수 Add 는 수를 더하는 함수입니다. 그런데 5개의 다른 형태의 함수가 있습니다.

 

▶ C++에서는 함수의 이름이 같고 매개변수가 다르거나 매개변수의 숫자가 다르면 오버로드라고 합니다. 

 

반환값만 다르고 매개변수가 같다면 오버로드라고 할 수 없습니다.

 

매개변수를 다르게 한 이유는 아래와 같이 결과값을 표시하기 위해서입니다.

 

정수 + 정수 = 정수

실수 + 실수 = 실수

정수 + 실수 = 실수

실수 + 정수 = 실수

 

정수형과 실수형의 사칙연산은 자동으로 실수형으로 캐스팅합니다. 즉 int 형 + double 형의 결과는 double 형이 됩니다. 반환값도 double 로 바뀌어야 손실없는 결과를 저장할 수 있습니다.

 

다형성 - polymorphism

 

동적타입 언어들에도 함수 오버로드가 있습니다. 그런데 동적타입 언어에서는 자료형에 대한 컴파일러의 자동추측을 하기 때문에 자료형의 제약이 없죠.

 

C++은 엄격한 자료형을 가지고 있지만 오버로드를 사용할 수 있습니다. Add 에 오버로드 한 만큼 자료형에 큰 제약을 받지 않고 사용할 수 있습니다. 하나의 함수에 여러개의 형태를 부여한다는 뜻으로 다형성(polymorphism) 이라고 합니다. 다형성의 장점은 어떤 함수를 부를 것인지 컴파일러가 결정한다는 점 입니다.

 

-> Add ( 1, 20) 을 부르면 int, int 를 호출할 것이고

 

-> Add(9.9, 42.12) 를 호출하면 double, double 을 호출합니다.

 

int, long, float, double 등의 자료형과 변환관계를 배우는 것은 함수 오버로드를 이해하는데 도움이 됩니다.

 

클래스의 메소드들도 마찬가지로 오버로드할 수 있습니다.

 

함수 오버로드가 있기 때문에 C++의 함수와 메소드를 더 유연하게 사용할 수 있습니다.

 

요약

함수의 오버로드를 사용하면 하나의 함수 이름으로 매개변수가 다른 여러개의 함수를 만들 수 있습니다. 다양한 형태를 만든다고 해서 C++은 다형성(polymorphism)의 특성을 갖습니다.

 

*예제코드

#include <iostream>


using namespace std;

#define Line cout <<"\n--------------------------------------------------------\n"

int Add(int a, int b);
int Add(int a, int b, int c);
double Add(double a, double b);
double Add(int a, double b);
double Add(double a, int b);

int main()
{
	Line;

	cout << " Add(int, int)       : " << Add(2, 5) << endl;
	cout << " Add(double, double) : " << Add(4.0, 3.5) << endl;
	cout << " Add(int, double)    : " << Add(1, 5.5) << endl;
	cout << " Add(double, int)    : " << Add(3.9, 2) << endl;
	cout << " Add(int, int, int)  : " << Add(3, 5, 7) << endl;
	
	return 0;
}

int Add(int a, int b){return a + b;}
int Add(int a, int b, int c) { return a + b + c; }
double Add(double a, double b){return a + b;}
double Add(int a, double b){return a + b;}
double Add(double a, int b){return a + b;}

 

공유하기

facebook twitter kakaoTalk kakaostory naver band