티스토리 뷰

반응형

* 함수 중복 정의 (function overloading)

1. c++에서 오버로딩이란 같은 클래스 내에서 같은 이름의 함수를 사용하는 것을 의미한다. 즉, 사용자가 정의한 함수명을 매개 변수 리스트에 따라 단 하나의 유일한 이름의 함수명으로 결정하는 과정이다.

2. c언어에서는 같은 이름을 갖는 함수를 정의할 수가 없다. 하지만 c++에서는 특정 조건을 만족하는 경우 같은 이름을 갖는 함수를 중복해서 정의 할 수 있다.

3. 함수가 중복되도 c++ 컴파일 과정에서 단 하나의 유일한 이름의 함수로 변경되고 호출부 코드도 인자가 가장 적절한 함수로 연결된다.

 

 

 

* 오버로딩 조건

1. 동일한 함수명을 써야함

2. 매개변수 타입이 달라야 한다.

3. 매개변수의 갯수가 달라야 한다.

4. 리턴하는 타입은 상관 없다.

 

 

 

오버로딩에는 2종류의 오버로딩이 있다.

 

1. 명시적 오버로딩

- 함수 이름은 같아도 각 함수들의 기능은 다르다.

- 함수 기능 재정의가 목적이다.

- 일반적으로 java에서 쓰이는 오버로딩 방법이다.

- 선언부의 함수와 정의부의 함수가 같아야 한다.

 

 

2. 암시적 오버로딩

- c++ 은 명확한 코딩을 해야한다. 명확성을 중시하는 방법이다.

- 코딩은 한줄인데 실제로는 여러줄의 오버로딩이 되고 있다.

- 디폴트 함수(생성자)를 생략할 수 있다.

- 디폴트 인자+ 1 개 만큼의 오버로딩 함수갯수가 존재한다

- 명시적 오버로딩과 암시적 오버로딩을 같이 사용하지 않는게 원칙이지만 실제로는 둘이 같이 많이 쓰인다.

 

 

 

코드를 보고 명시적 오버로딩과 암시적 오버로딩을 구별해보자

 

1. 명시적 오버로딩

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
#include <iostream>
#include <iomanip>
using namespace std;
 
void disp(int a, int b);
void disp(char c, char d);
void disp(float e, float f);
 
/*
오버로딩 : 동일한 함수명으로 여러개의 함수를 제공하는 방법
조건 : 매개변수의 타입이 달라야한다.
매개변수의 갯수가 달라야한다.
리턴타입이 상관없다.
 
*/
 
void main() {
    int a = 1, b = 2;
    char c = 'a', d = 'b';
    float e = 3.2f, f = 4.7f;
 
    disp(a, b);
    disp(c, d);
    disp(e, f);
}
void disp(int a, int b) {
 
    cout << a << "\t" << b << endl;
}
void disp(char c, char d) {
 
    cout << c << "\t" << d << endl;
}
void disp(float e, float f) {
 
    cout << e << "\t" << f << endl;
}
cs

 

명시적 오버로딩은 보내는 매개변수 타입을 다 맞춰줘야하며, 선언부 함수와 정의부 함수가 같은 모양이어야 한다.

 

 

 

 

2. 암시적 오버로딩

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
#include <iostream>
using namespace std;//이름공간 지움
void disp(int a, int b = 0int c = 0);
//선언부에 초기값주고, 정의부에는 값을 주지 않음
//타입 똑같고 데이터가 다를 경우 암시적 오버로딩 가능
//생성자에서 많이 씀
//만약 초기값 하나를 0을 빼면 disp() 함수의 값을 출력할 수 없다.
 
void main() {
 
    int a = 10;
    int b = 20;
    int c = 30;
 
    //disp();
    disp(a);
    disp(a, b);
    disp(a, b, c);
 
}
void disp(int a, int b, int c) {
 
 
    cout << a << "\t" << b << "\t" << c << "\t" << endl;
 
}
cs

암시적 오버로딩은 선언부에 0이라고 초기값을 줬을때 함수호출부분에서 매개변수를 보내지 않은 인자는 무조건 초기값이 0이라고 출력된다. 호출하는 함수는 여러가지지만 받는 함수는 한개이다. 여러가지 같은 이름의 함수들이 존재하지만 보여지는 코드는 한줄이므로 암시적 오버로딩 방법을 쓰면 코드의 가독성이 좋아진다.

반응형
댓글
공지사항