1. Default parameter
- C와 달리 C++는 함수호출부분에서 전달인자(Argument)값 생략 가능
- 전달인자 없이 함수가 호출된 경우 함수정의 부분에 선언된 Default 매개변수 사용
- 전달인자가 2개 이상인 경우 가장 왼쪽 매개변수와 짝을 맞춰 값 전달
- 전달인자가 2개 이상인 경우 Default 매개변수 값은 반드시 오른쪽부터!
- 전달인자가 3개 이상인 경우 Default 매개변수 중간값을 반드시 기술
#include <iostream>
using namespace std;
int TestFunct(int nParam1, int nParam2 = 10, int nParam3 = 20)
{
return nParam1 * nParam2 * nParam3;
}
int main()
{
cout << TestFunct(10) << endl;
return 0;
}
// 실행결과 2000
2.1 함수 오버로딩(Overloading)
- C에서는 동일한 이름을 갖는 함수가 존재할 수 없음
- C++에서는 함수 오버로딩을 통해 동일한 이름의 함수가 여러개 존재할 수 있음
- 함수 오버로딩은 매개변수의 개수가 다르거나 매개변수 type이 달라야 함
- Return type이 다른 경우는 함수 오버로딩 X
#include <iostream>
using namespace std;
// 함수 오버로딩(Overloading)에서 중요한 요소는 매개변수(Parameter)
// 매개변수의 type, 개수에 의해 함수 오버로딩 수행
// Return type만 다를 경우 오버로딩 구현 불가능!
int Add(int a, int b, int c)
{
return a + b * c;
}
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
int main()
{
cout << Add(10, 20) << endl;
cout << Add(10, 20, 30) << endl;
cout << Add(1.2, 2.3) << endl;
return 0;
}
2.2 함수 오버로딩의 모호성(Ambiguous) 문제
- Default 매개변수, 함수 오버로딩을 함께 사용할 경우 모호성 문제 발생
- 전달인자 생략과 오버로딩으로 인해 모호성 에러가 발생
- C++에서는 함수 오버로딩 보다 template 사용 권장
#include <iostream>
using namespace std;
void TestFunc(int a)
{
cout << "TestFunc(int)" << endl;
}
void TestFunc(int a, int b = 10)
{
cout << "TestFunc(int, int)" << endl;
}
int main()
{
// error: call to 'TestFunc' is ambiguous 발생
// 어떤 함수를 호출해야 하는지 모호함, 함수 오버로딩을 사용할 때 주의해야 하는 부분!
// 이러한 모호성 때문에 C++에서는 함수 오버로딩 보다는 Template 사용을 권장
TestFunc(5);
return 0;
}
2.3 함수 템플릿(Template)
- 함수 오버로딩은 사용자의 편의성과 확장성을 위해 사용
- 개발자는 비슷한 코드를 여러 번 구현해야 함(소스코드 증가, 메모리 문제 등)
- template 사용
- 함수 오버로딩 없이 여러 종류의 type 호출 대응
#include <iostream>
using namespace std;
template <typename T>
T Add(T a, T b)
{
return a + b;
}
int main()
{
// int 호출
cout << Add(3, 4) << endl;
// double 호출
cout << Add(3.3, 4.4) << endl;
return 0;
}
3. inline 함수
- 함수 호출은 스택 메모리 사용 증가
- 성능 문제로 함수 대신 매크로 사용
- 매크로는 type을 지정할 수 없음
- C++은 함수와 매크로를 합쳐 놓은 inline 함수 제공
- 함수 앞에
inline
키워드 입력
#include <cstdio>
#define ADD(a, b)((a) + (b))
int Add(int a, int b)
{
return a + b;
}
inline int AddNew(int a, int b)
{
return a + b;
}
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("ADD(): %d\n", ADD(a, b));
printf("Add(): %d\n", Add(a, b));
printf("AddNew(): %d\n", AddNew(a, b));
return 0;
}
4. namespace
- 함수, 변수, 클래스 등을 특정 범주로 묶어주기 위한 문법
- 동일한 변수 이름 또는 함수 이름 등의 충돌을 막기 위한 방법
- namespace는 중첩 가능
using
키워드를 통해 매번 namespace 입력을 생략할 수 있음
#include <iostream>
// 아래 주석을 제거하면 main() 함수에서 std:: 생략 가능
// using namespace std;
namespace TestFunc
{
int nData = 100;
}
int main()
{
std::cout << TestFunc::nData << std::endl;
return 0;
}
본 포스팅 내용은
이것이 C++이다
를 학습한 내용을 바탕으로 요약한 글입니다. 코드에 문제가 있을 수 있으며 다소 부정확한 내용이 있을 수 있으니 참고하시기 바랍니다. 잘못된 내용이 있다면 덧글로 남겨주시면 내용을 반영하여 수정하도록 하겠습니다. 감사합니다.
[Reference]
[1] 이것이 C++이다, p.57-91