같은 클래스 내에서 같은 이름의 함수를 사용하는 것은 의미한다. 즉 사용자가 정의한 함수명을 매개 변수 리스트에 따라 하나의 유일한 이름의 함수명으로 결정하는 것이다.
오버로딩 조건
○중복된 함수들의 이름이 동일해야 한다.
○중복된 함수들은 매개변수의 개수가 다르거나, 매개변수의 개수가 같고 타입이 달라야 한다.
○위의 두 조건을 모두 만족하면 반환형의 차이는 함수 오버로딩에 영향을 미치지 않는다.(리턴타입상관없음)
●오버로딩 성공
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <iostream>
using namespace std;
int sum(int x, int y, int z) {
return x + y + z;
}
double sum(double x, double y) {
return x + y;
}
int sum(int x, int y) {
return x + y;
}
int main() {
cout << sum(2, 3, 23) << "\n";
cout << sum(2.23, 3.23) << "\n";
cout << sum(2,3);
}
|
cs |
main()안에 중복된 sum() 함수 호출, 컴파일러가 구분
중복된 sum() 함수
●오버로딩 실패
어떤 sum() 함수인지 컴파일러가 구분할 수 없음
디폴트 매개 변수 선언
디폴트 매개 변수 선언 형태
매개 변수 = 디폴트 값
디폴트 매개변수를 가진 함수 star()
1
|
void star(int a = 5); //a의 디폴트 값 5
|
cs |
디폴트 매개 변수를 가진 함수를 호출할 때 디폴트 매개변수에 값을 주어도 되고 생략해도 된다.
1
2
|
star(); //매개 변수 a에 디폴트 값 5 자동전달, star(5)와 동일
star(10); //매개 변수 a에 10 전달
|
cs |
디폴트 매개변수에 디폴트 값을 전달하는 것은 컴파일러 에 의해 처리된다.
●디폴트 매개 변수 예제
매개 변수 id와 디폴트 매개 변수 text를 가진 함수 msg()
1
2
|
void msg(int id, string text = "Hello")
|
cs |
msg()호출 방법
1
2
|
msg(10); //id에 10, text에 "Hello" 전달
msg(20, "Good Morning"); //id에 20, text에 "Good Morning" 전달
|
cs |
함수 호출 시, 디폴트 매개 변수에 값을 전달하느 것은 선택 사항이지만, 보통 매개 변수에는 반드시 값을 전달해야한다.
1
2
|
msg(); //컴파일 오류, 매개 변수 id에 값이 전달되지 않았음
msg("Good Morning"); //컴파일 오류, 매개 변수 id에 값이 전달 되지 않았음
|
cs |
디폴트 매개 변수에 관한 제약 조건
다폴트 매개 변수는 모두 끝 쪽에 선언되어야 한다. 디폴트 매개 변수는 보통 매개 변수 앞에 선언 불가능하다.
▶오버로딩:명시적오버로딩
명시적오버로딩+ reference
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include <iostream>
using namespace std;
void change(int &a, int &b);
void change(char &a, char &b);
void change(float &a, float &b);
void main() {
int a = 10, b = 20;
char c = 'A', d = 'B';
float e = 3.7, f = 4.5;
change(a, b);
change(c, d);
change(e, f);
cout << a << "\t" << b << endl;
cout << c << "\t" << d << endl;
cout << e << "\t" << f << endl;
}
void change(int &a, int &b) {
int box;
box = a;
a = b;
b = box;
}
void change(char &a, char &b) {
char box;
box = a;
a = b;
b = box;
}
void change(float &a, float &b) {
float box;
box = a;
a = b;
b = box;
|
cs |
▶오버로딩:암시적오버로딩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream>
using namespace std;
/*
암시적 오버로딩 (디폴트인자값)
디폴트 인자값을 준 기준으로 뒤에 있는 매개변수는 무조건 추기화를 해주어야한다
디폴트인자값준 횟수 +1 만큼 호출
함수선언부에 디폴트인자값을 사용하고
함수정의부에는 사용을 하면 안된다
*/
int output(int a = 0, int b = 0, int c = 0);//함수선언
void main() {
int a = 10, b = 20, c = 30;
output();
output(a);
output(a, b);
output(a, b, c);
}
int output(int a , int b , int c)//함수정의
{
cout << a << b << c << endl;
|
cs |
▶오버로딩과 오버라이딩 비교
비교 | 오버로딩 | 오버라이딩 |
정의 | 매개 변수 타입이나 개수가 다르지만, 이름이 같은 함수들이 중복 작성하는 것 | 기본 클래스에 선언된 가상 함수를 파생 클래스에서 이름, 매개변수 타입, 매개 변수 개수, 리턴 타입까지 완벽히 같은 원형으로 재작성 하는 것 |
존재 | 외부 함수들 사이, 한 클래스의 멤버들, 상속관계 | 상속관계, 가상 함수에서만 적용 |
목적 | 이름이 같은 여러 개의 함수를 중복 작성하여 사용의 편의성 향상 | 기본 클래스에 구현된 가상 함수를 무시하고, 파생 클래스에서 새로운 기능을 재정의하고자 함 |
바인딩 | 정적 바인딩, 컴파일 시에 중복된 함수들의 호출 구분 | 동적 바인딩, 실행 시간에 오버라이딩된 함수를 찾아 실행 |
관련 객체 지향 특성 |
다형성 | 다형성 |