동일한 이름의 함수가 공존
다형성
C 언어에서는 불가능
function overloading
함수 중복이 가능한 범위
보통 함수들 사이
클래스의 멤버 함수들 사이
상속 관계에 있는 기본 클래스와 파생 클래스의 멤버 함수들 사이
int sum(int a, int b, int c){
return a + b + c;
}
double sum(double a, double b){
return a + b;
}
int sum(int a, int b){
return a + b;
}
int main(){
cout << sum(2,5,33);
cout << sum(12.5,33.6);
cout << sum(2,6);
}
int sum(int a, int b){
return a + b;
}
double sum(int a, int b){
return (double)(a + b);
}
int main(){
cout << sum(2,5);
}
동일한 이름을 사용하면 함수 이름을 구분하여 기억할 필요 없음
함수 호출을 잘못하는 실수를 줄임
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int big(int a, int b){
if(a>b) return a;
else return b;
}
int big(int a[], int size){
int res = a[0];
for(int i = 0 ; i < size; i++)
if(res < a[i]) res = a[i];
return res;
}
int main(){
int arry[5] = {1,9,-2,8,6};
cout << big(2,3) << endl;
cout << big(arry,5) << endl;
}
class Circle{
.....
pulblc:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
...
};
int main(){
Circle donut; //Circle() 생성자 호출
Circle pizza(30); //Circle(int r) 생성자 호출
}
Default parameter
매개 변수에 값이 넘어오지 않는 경우, 디폴트 값을 받도록 선언된 매개 변수
티폴트 매개 변수 선언 사례
void star(int a=5);
디폴트 매개 변수를 가진 함수 호출
star(); // a의 디폴트 값은 5
star(10); // a에 10을 넘겨줌
void msg(int id, string text="Hello"); // text의 디폴트 값은 "Hello"
msg(10); //msg(10,"Hello"); 호출과 동일
msg(20,"Good Morning"); // id 에 20 , text에 Good Morning 전달
msg(); //컴파일 오류
msg("Hello"); //컴파일 오류
디폴트 매개 변수는 보통 매개 변수 앞에 선언될 수 없음
void calc(int a, int b=5,int c,int d =0);//컴파일 오류
void sum(int a=0,int b,int c); //컴파일 오류
void calc(int a,int b=5,int c =0, int d= 0);//컴파일 성공
사례
void square(int width=1,int height=1);
square(); => square(_ _); => square(1,1);
square(5); => square(5, _); => square(5,1);
square(3,8); => square(3,8); => square(3,8);
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
void star(int a=5);
void msg(int id, string text="");
void star(int a){
for(int i = 0; i < a;i++)
cout << '*';
cout << endl;
}
void msg(int id, string text){
cout << id << ' ' << text << endl;
}
int main(){
star();
star(10);
msg(10);
msg(10,"hello");
}
결과
*****
**********
10
10 hello
동일 코드
void star(int a=5){
for(int i =0; i < a;i++){
cout << '*';
}
cout << endl;
}
void msg(int id,string text = ""){
cout << id << ' '<< text << endl;
}
디폴트 매개 변수의 장점 - 함수 중복 간소화
class Circle{
.........
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
};
위 코드 간소화
class Circle{
.....
public:
Circle(int r = 1){ radius = r; }
.....
};
2 개의 생성자 함수를 디폴트 매개 변수를 가진 하나의 함수로 간소화
class Circle{
......
public:
Circle() { radius = 1; }
Circle(int r){ radius = r; }
Circle(int r = 1){ radius = r; } //중복된 함수와 동시 사용 불가 오류 발생
}
정상 컴파일
double square(double a){
return a*a;
}
int main(){
cout << square(3);
}
모호한 호출, 컴파일 오류
float square(float a){
return a*a;
}
double square(double a){
return a*a;
}
int main(){
cout << square(3.0); // double square(bouble a) 호출
cout << square(3); //?? int type 3을 double로 할지 float로 할지 모호함 , 컴파일 오류
}
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int add(int a, int b){
return a + b;
}
int add(int a, int &b){
b = b + a;
return b;
}
// 위 두 함수는 근본적으로 중복 시킬 수 없다.
int main(){
int s = 10, t= 20;
cout << add(s,t); //컴파일 오류 call by value 인지 call by reference 인지 모호
}
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
void msg(int id){
cout << id << endl;
}
void msg(int id,string s = ""){
cout << id << ":" << s << endl;
}
int main(){
msg(5,"Good Morning"); //정상 컴파일
msg(6); // 함수 호출 모호, 컴파일 오류
}