함수 중복

shinyeongwoon·2022년 11월 22일
0

C++

목록 보기
6/10

함수 중복

  • 동일한 이름의 함수가 공존
    다형성
    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을 넘겨줌

사례 1

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; } //중복된 함수와 동시 사용 불가 오류 발생
}

함수 중복의 모호성

  • 함수 중복이 모호하여 컴파일러가 어떤 함수를 호출하는지 판단하지 못하는 경우
  1. 형 변환으로 인한 모호성
  2. 참조 매개 변수로 인한 모호성
  3. 디폴트 매개 변수로 인한 모호성

매개 변수의 형 변환으로 인한 중복 함수 호출의 모호성

정상 컴파일

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); // 함수 호출 모호, 컴파일 오류
}

0개의 댓글