개발자 승학

C++ 함수 중복 본문

it/C++

C++ 함수 중복

유승학 2018. 6. 14. 18:43

함수 중복 이란?


C++에서는 C와 달리 같은 이름의 함수를 여러 개 만들 수 있습니다.


이를 함수 중복이라고 합니다.


함수 중복은 다형성의 한 예입니다.



중복 함수 조건


1. 중복된 함수들의 이름이 동일해야 한다.

2. 중복된 함수들은 매개 변수 타입이나 매개 변수의 개수가 달라야 한다.

3. 함수 중복에 리턴 타입은 고려되지 않는다.


간단한 함수 중복의 성공과 실폐 사례의 예를 보겠습니다.


-성공 사례-


#include <iostream>

#include <string>

using namespace std;


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(1, 2, 3) << endl;

cout << sum(1.0, 2.0) << endl;

cout << sum(1, 2) << endl;

}

매개 변수의 타입이나 매개 변수의 개수가 서로 다른 3개의 sum() 함수는 중복이 가능합니다.


-실패 사례-


#include <iostream>

#include <string>

using namespace std;


int sum(int a, int b) {

return a + b;

}


double sum(int a, int b) {

return a + b;

}



int main() {

cout << sum(1, 2) << endl;

cout << sum(1.0, 2.0) << endl;

}



int형 sum과 double형 sum의 매개변수의 형과 갯수가 모두 같기 때문에 오류가 나게 됩니다.


함수의 중복 간단한 예를 보겠습니다.

ex ) 큰 수를 리턴


#include <iostream>

#include <string>

using namespace std;


int big(int a, int b) {

if (a > b) return a;

else return b;

}


int big(int a[], int size) {

int result = a[0];

for (int i = 0; i < size; i++) {

if (result < a[i]) result = a[i];

}

return result;

}


int main() {

int array[5] = { 1, -8, 18, 50, 41 };

cout << big(2, 3) << endl;  

cout << big(array, 5) << endl;

}


디폴트 매개 변수


함수가 호출될 때 매개 변수에 값이 넘어오지 않는다면, 미리 정해진 디폴트 값을 받도록 선언된 매개 변수.


디폴트 매개 변수 선언 방법


디폴트 매개 변수는 '매개 변수 = 디폴트 값' 형태로 선언합니다.


void color(string c = "red"); // c의 값은 red


color(); // 매개 변수에 디폴트 값 red 자동 전달

color("blue") // 매개 변수 c에 blue값 전달


디폴트 매개 변수에 관한 제약 조건


디폴트 매개 변수는 반드시 끝 쪽에 몰려 선언되어야 한다는 규칙이 있습니다.


void sum(int a, int b=5, int c, int d=0); // 컴파일 오류

void sum(int a=0, int b, int c); // 컴파일 오류


void sum(int a, int b=5, int c=0, int d=0); // 컴파일 성공


함수 중복의 모호성


함수 중복 조건을 갖추었다 하더라고 중복된 함수에 대한 호출이 모호해 지는 경우가 발생합니다.


1. 형 변환으로 인한 모호성

2. 참조 매개 변수로 인한 모호성

3. 디폴트 매개 변수로 인한 모호성


1. 형 변환으로 인한 모호성


함수의 매개 변수 타입과 호출 문의 실인자 타입이 일치하지 않는 경우, 컴파일러는 형 변환을 시도합니다.


double square(doubla a);


square(3);


square(3)의 호출 문에서 실인자 3은 int 타입이지만, 컴파일러는 double 타입으로 형 변환하여 함수 호출에 문제가 없습니다.


하지만 아래와 같은 경우는 문제가 발생합니다.


float square(float a);

double square(double a);


square(3);


컴파일러는 정수 3을 float형 또는 double형으로 변환할지 모호합니다.


2. 참조 매개 변수로 인한 모호성


중복된 함수 중에서 참조 매개 변수를 가진 함수가 있는 경우 모호성이 존재할 수 있습니다.


int add(int a, int b);

int add(int a, int &b);


add(10,20);


앞의 두 함수 중 어떤 함수를 호출하는 것인지 판단할 수 없어 오류가 발생합니다.


3. 디폴트 매개 변수로 인한 모호성


디폴트 매개 변수를 가진 함수가 보통 매개 변수를 가진 함수와 중복 작성될 때, 모호성이 존재할 수 있습니다.


void student(int id);

void student(int id, int age="10");


student(15); 


다음의 함수 호출은 앞의 중복된 두 함수를 호출해도 무관하므로, 컴파일 오류가 발생합니다.

'it > C++' 카테고리의 다른 글

mfc c++ txt 파일 읽기  (1) 2019.03.21
c++ 스레드 사용법  (0) 2019.03.14
Comments