[C++] 함수 오버로딩

김형태·2021년 5월 3일
0

C++

목록 보기
1/13

1. 함수 오버로딩

C언어에서는 동일한 이름의 함수가 정의되는 것을 허용하지 않는다.

int my_func(int num)
{
	num++;
    return (num);
}

int my_func(int a, int b)
{
	return (a + b);
}

하지만 위의 두 함수 정의를 허용해도 인자가 다르니 구분할 수 있지 않을까? 라는 생각이 들 수 있다.

실제로 C++에서는 이를 허용하고, 이러한 형태의 함수 정의를 가리켜 함수 오버로딩(Fucntion Overloading)이라고 한다.

C++에서는 호출할 함수를 찾을 때, '함수의 이름', '매개변수의 선언' 두 가지 정보를 동시에 활용하지만, C에서는 '함수의 이름'만으로 호출 대상을 찾기 때문이다.

함수 오버로딩이 가능하려면 매개변수의 선언이 달라야 한다.

int myFunc(char c) { ... }
int myFunc(int n) { ... }

매개변수의 자료형이 다르므로, 전달 인자의 자료형을 통해서 호출할 함수의 구분이 가능하기 때문이다. 마찬가지로 다음도 가능하다.

int myFunc(int n) { ... }
int myFunc(int n1, int n2) { ... }

매개변수의 개수가 다르기 때문이다.

정리하면 함수의 오버로딩을 위해 다음 조건을 만족하면 된다.

매개변수의 자료형 또는 개수가 다르다.

반환형이 다른 것은 호출되는 함수를 구분하는 기준이 될 수 없다!

// 컴파일 오류!
void myFunc(int n) { ... }
int myFunc(int n) { ... }

2. 매개변수 디폴트 값

C++의 함수에서는 '디폴트 값'을 설정할 수 있다. '디폴트 값'은 '기본적으로 설정되어 있는 값'이다. 함수의 매개변수를 다음과 같은 형태로 선언할 수 있다.

int myFunc(int n1 = 7, int n2 = 8)
{
	return (n1 + n2);
}

이는 다음을 의미한다.

함수 호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주한다!

// 다음 두 호출문이 동일한 의미.
myFunc();
myFunc(7, 8);

그리고 다음도 가능하다!

myFunc(3);

그리고 위 호출의 결과는 11이 된다. 위 코드블록을 통해 다음과 같이 정리할 수 있다.

매개변수에 디폴트 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자전달이 가능하다. 전달되는 인자는 왼쪽에서부터 채워져 나가고, 부족분은 디폴트 값으로 채워진다.

위의 정리로부터 함수의 디폴트 값은 오른쪽부터 채우는 형태로 정의해야 함을 알 수 있다. 디폴트 값보다 적은 숫자를 인자로 넘겨주면 왼쪽부터 인자를 적용하기 때문이다.

디폴트 값은 함수의 선언 부분에만 표현하면 된다. 함수의 원형을 별도로 선언하는 경우 디폴트 값은 함수의 원형 선언에만 위치시켜야 한다.

profile
steady

0개의 댓글