Goal
1. 함수 오버로딩의 개념에 대한 이해
2. 함수 매개변수 디폴트 값의 개념과, 사용방법
● 함수 오버로딩 (Function Overloading)
함수 오버로딩이란, 동일한 이름의 함수를 정의하여, 생산성을 높이는 방식이다.
그러나, C에서는 이를 허용하지 않았다.
왜냐하면, C와 C++은 호출할 함수를 찾는 방식이 다르기 떄문이다.
'함수의 이름' 으로 함수를 구분하는 C와 달리
C++은 '함수의 이름'과, '매개변수'로 함수를 구별한다.
따라서, 이름은 동일하고, 매개변수가 다른 여러개의 함수를 만들 수 있는것이다.
다음 예시를 보자.
#include <iostream>
void sum(int a, int b) {
std::cout << a + b << std::endl;
}
void sum(int a, int b,int c) {
std::cout << a + b + c << std::endl;
}
void sum(int a, int b, double c) {
std::cout << a + b + c << std::endl;
}
int main(void)
{
std::cout << "sum(int a,int b)호출" << std::endl;
sum(1, 2);
std::cout << "sum(int a,int b,int c)호출" << std::endl;
sum(1, 2, 3);
std::cout << "sum(int a,int b,float c)호출" << std::endl;
sum(1, 2, 4.5);
}
sum 함수 3개를 오버로딩하여 작성해 보았다.
함수의 오버로딩이 성립하기 위해선 다음 조건이 성립해야 한다.
1. 동일한 함수의 이름
2. 서로 다른 매개변수
void sum(int a, int b) {
std::cout << a + b << std::endl;
}
void sum(int a, int b,int c) {
std::cout << a + b + c << std::endl;
}
1번째 함수는 매개변수가 2개이고,
2번째 함수는 매개변수가 3개이다.
따라서 매개변수의 '개수' 가 다르기에, 오버로딩의 사례로 적합하다.
void sum(int a, int b,int c) {
std::cout << a + b + c << std::endl;
}
void sum(int a, int b, double c) {
std::cout << a + b + c << std::endl;
}
1번째 함수는 매개변수 3개의 자료형이 모두 int형이지만,
2번째 함수의 3번째 매개변수의 자료형이 double형이다.
따라서 매개변수의 '형식'이 다르기에 오버로딩의 사례로 적합하다.
void sum(int a, int b) {
std::cout << a + b << std::endl;
}
int sum(int a, int b) {
std::cout << a + b << std::endl;
}
다음 두 함수는 오버로딩에 성공한 것일까?
정답은 아니다. 두 함수의 반환값은 각각 void형 int형으로 다르지만,
반환값은 함수의 오버로딩과 관련이 없다.
함수의 오버로딩의 조건 중
첫 번째 조건인. "동일한 함수의 이름"은 성립했지만,
두 번째 조건인, "서로 다른 매개변수"의 조건이 성립하지 않았기 때문이다.
● 디폴트 값(Default Value)
C++ 함수에는 '디폴트 값' 을 설정할 수 있다.
디폴트 값의 의미는 '기본적으로 설정되어 있는 값'이다.
#include <iostream>
void MySum(int a=1, int b=2)
{
std::cout << a + b << std::endl;
}
int main(void)
{
std::cout << "MySum(int a,int b)호출" << std::endl;
MySum(10, 20);
std::cout << "MySum(int a,int b)호출" << std::endl;
MySum();
}
MySum함수를 해석해보자면 다음과 같다.
만약, a의 값이 전달되지 않았다면 a는 1로 간주하고,
b의 값이 전달되지 않았다면 b는 2로 간주한다.
MySum(10, 20);
따라서, 다음과 같이 정상적으로, 매개변수의 값을 보내주면,
10과 20의 값을 더해서, 30 을 출력한다.
MySum();
그러나, 이렇게, 매개변수의 값을 보내주지 않으면, 초기에 설정해 둔 디폴트값인 1과 2가 더해져서 3을 출력한다.
다음으로, 디폴트값을 설정할 때 쉽게 범하는 오류에 대해 알아보자.
void MySum(int a=1, int b)
{
std::cout << a + b << std::endl;
}
언뜻보면, 정상적으로 디폴트 값을 설정한 것처럼 보인다.
그러나, 이는 잘못된 코드이다.
void MySum(int a, int b=1)
{
std::cout << a + b << std::endl;
}
디폴트 값은 무조건 오른쪽의 매개변수부터 채우는 형태로 정의해야 한다.
왜냐하면, 함수에 전달되는 인자는 왼쪽에서부터 오른쪽으로 채워지기 떄문이다.
생각해보면 당연한 말이다.
MySum함수에 3을 보낸다고 생각해 보자.
void MySum(int a,int b=1) 와 같이 디폴트 값을 오른쪽부터 채운 함수의
a의 값은 3이 되고 , b는 설정해 둔 1이 될 것이다.
그러나 void MySum(int a=1,int b) 와 같이 디폴트 값을 왼쪽부터 채운 함수에 3을 보낸다고 생각해보자.
a의 값을 3으로 설정되겠지만, b의값은 설정해 둔 디폴트 값도 없고, 보낸 인자도 없기에, 컴파일 에러가 난다.
'Programming > C,C++' 카테고리의 다른 글
[C++] #5 참조자(Reference)와 함수 (0) | 2021.01.02 |
---|---|
[C++] #4 참조자(Reference) (0) | 2021.01.02 |
[C++] #3 이름공간(Name Space)의 사용방법 (0) | 2020.12.23 |
[C++] #1 C++ 에서의 입출력 (std::cout, std::cin, std::endl) (0) | 2020.12.22 |
[C언어] 스트림(stream)이란? (0) | 2020.12.19 |
댓글