객체지향언어답게 C에서는 허용되지 않지만 Java에선 허용되는
'함수 오버로딩(Function Overloading)'을 허용한다.
이는 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하기 때문에 가능하다.
C는 호출할 함수를 찾을 때 '함수의 이름'만을 이용하여 대상을 찾는다.
반면, C++은 '함수의 이름', '매개변수의 선언' 두 가지 정보를 동시에 활용한다.
그러므로 함수의 오버로딩이 가능하려면 매개변수의 선언이 달라야 한다.
(매개변수의 자료형 또는 개수의 변화)
반환형은 호출되는 함수를 구분하는 기준이 될 수 없다.
C++의 함수에서는 디폴트 값을 설정할 수 있다.
int Func1(int num = 7) {
return num + 1;
}
이는 함수호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주하다는 뜻이다.
Func1() == Func1(7) 라고 볼 수 있다.
int Func2(int n1 = 1, int n2 = 2) {
return n1 + n2;
}
int main(void) {
std::cout<<Func2()<<std::endl;
std::cout<<Func2(5)<<std::endl;
std::cout<<Func2(3, 5)<<std::endl;
return 0;
}
Func2() n1 = 1, n2 = 2
Func2(5) n1 = 5, n2 = 2
Fucn2(3, 5) n1 = 3, n2 = 5
매개변수에 디폴트 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자전달이 가능하다.
전달되는 인자는 왼쪽부터 채워지고 나머지는 디폴트로 채운다.
프로그램 코드라인 안의 함수로 매크로 함수와 반대되는 개념이다.
먼저 매크로 함수에 대해서 알아야 한다.
매크로 : 선행처리 명령문 중 지시자 뒤에 등장하는 것.
#define PI 3.14
#define : 지시자
PI : 매크로
3.14 : 매크로 몸체(대체 리스트)
정의하는 것이 어렵다. 복잡한 함수일 경우 한계가 있다.
함수의 몸체부분이 함수 호출 문장을 완전히 대체했을 때 함수가 인라인화 되었다고 표현한다.
= 매크로 함수의 장점을 유지하면서 정의가 복잡하다는 단점을 제거한 것이 인라인 함수다.
#include <iostream> //매크로 함수 이용
#define SQUARE(x) ((x) * (x))
int main(void) {
std::cout<< SQUARE(5) <<std::endl;
return 0;
}
이 코드가 전처리 과정을 거치면
#include<iostream> //몸체가 호출문 대체(인라인화)
int main(void) {
std::cout<< ((5) * (5)) << std::endl;
return 0;
}
이런 식으로 변경된다.
매크로를 이용한 함수의 인라인화는 전처리기에 의해서 처리된다.
#include <iostream> //인라인 함수 이용
inline int SQUARE(int x) { return x * x; }
//키워드 inline의 선언을 통해 함수 SQUARE는 인라인 함수가 되었다.
int main(void) {
std::cout<<SQUARE(5)<<std::endl;
std::cout<<SQUARE(12)<<std:endl;
return 0;
}
키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해 처리된다.
매크로 함수와 달리 자료형에 의존적이다.
이는 C++ 템플릿을 이용하면 해결할 수 있다.
template <typename T>
inline T SQUARE(T x) { return x * x; }
이런식으로ㅡ...
// 컴파일러가 인라인함수를 복사하여 함수 호출 부분이 생략된다. (매크로의 장점인 시간단축을 끌어올수있다.)