함수의 오버로딩, 매개변수의 디폴트 값 그리고 인라인 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <iostream> void MyFunc(void) { std::cout << "MyFunc(void) called" << std::endl; } void MyFunc(char) { std::cout << "MyFunc(char) called" << std::endl; } void MyFunc(int a, int b) { std::cout << "MyFunc(int a, int b) called" << std::endl; } int main(void) { MyFunc(); MyFunc('A'); MyFunc(12, 13); return 0; } | cs |
함수의 오버로딩
위의 예제는 C언어에서는 보지못했던 구조일 것입니다. C언어에서는 오버로딩이 불가능하고, 이를 문법적으로 허용하지도 않기 때문이죠.
하지만 C++에서는 이를 허용합니다! 다만 매개변수의 선언이 달라야하죠.
이러한 결과가 발생하는 이유는 무엇일까요? 두 언어가 함수를 구분하는 기준이 다르기 때문입니다. C언어는 '함수의 이름'만 이용해서 호출대상을 찾는 반면 C++는 '함수의 이름'과 '매개변수의 선언' 두가지를 모두 이용해서 호출할 함수를 찾는 것이죠.
대신 다음과 같은 경우는 불가합니다.
void MyFunc(int n){}
int MyFunc(int n){}
그 이유는 반환형은 함수를 구분하는 기준이 될 수 없기 떄문입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> int BoxVolume(int length, int width = 1, int height = 1); int main(void) { std::cout << "[3, 3, 3] : " << BoxVolume(3, 3, 3) << std::endl; std::cout << "[5, 5, D] : " << BoxVolume(5, 5) << std::endl; std::cout << "[7, D, D] : " << BoxVolume(7) << std::endl; // std::cout << "[D, D, D] : " << BoxVolume() << std::endl; return 0; } int BoxVolume(int length, int width, int height) { return length * width * height; } | cs |
매개변수의 디폴트 값
이번에는 매개변수의 디폴트 값(Default Value)에 대하여 이야기 하겠습니다.
디폴트 값은 기본적으로 설정되 있는 값을 의미합니다. 위의 예제를 기준으로 규칙을 설명하겠습니다.
1. 디폴트 값은 선언 부분에만 표현하면 됩니다.
함수의 정의와 선언을 따로하는 경우에는 선언 부분에만 위치시켜야 합니다.
2. 반드시 오른쪽 매개변수의 디폴트 값을 채우는 형태로 정의해야 합니다.
예를 들자면
가) int BoxVolume(int length, int width = 1, int height = 1);는 가능하지만
나) int BoxVolume(int length = 1, int width = 1, int height);는 불가능하다는 것입니다.
이유는 생각해보면 간단합니다. 함수에 전달되는 인자가 왼쪽에서부터 오른쪽으로 채워지기 때문이죠.
7행의 경우 BoxVolume(7)을 실행될 때 7은 가장 왼쪽인자인 length에 채워진다는 의미입니다. (가)의 경우에는 정상적으로 처리 되겠지만 (나)의 경우에는 가장 오른쪽 매개변수는 인자를 전달 받지 못했으므로 오류가 나는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> inline int SQUARE(int x) { return x * x; } int main(void) { std::cout << SQUARE(5) << std::endl; std::cout << SQUARE(12) << std::endl; return 0; } | cs |
인라인 함수
C언어를 공부하면서 매크로 함수에 대해서 공부하셨을 것입니다. 매크로 함수는 전처리 과정에 처리되기 떄문에 코드의 양을 반복시켜 파일의 크기가 커지지만 함수를 위한 공간할당을 하지 않기 때문에 실행속도가 빨라진다는 장점이 있지요. 하지만 복잡한 함수는 정의하기 힘들다는 단점이 있습니다.
장점은 유지하되 단점을 없앨 수 없을까라는 의문을 해소하기 위한 함수가 인라인 함수입니다.
정의하는 방법은 3행과 같이 하면 됩니다. 키워드 inline을 통해 함수 SQUARE가 인라인 함수가 되었습니다.
장점은 유지하고 단점은 극복했다고 이야기했으나 조금의 차이가 있습니다. 매크로 함수는 전적으로 전처리기에 의해 처리되지만, 키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해 처리가 됩니다. 따라서 컴파일러가 인라인화가 오히혀 성능저하를 유발한다고 판단하는 경우 무시하기도 합니다. 그 반대로 어떤 경우에는 일부함수를 임의로 인라인화 하기도 합니다.
또한 인라인 함수는 자료형에 의존하게 됩니다. 예를 들어 위의 예제에서 std:cout << SQUARE(3.15);경우에는 자료형이 int형이므로 0.15가 손실되어 9라는 결과가 나오게 됩니다. 자료형에 의존적이지 않은 매크로 함수와의 차이점인 것이죠.
정리
1. C++에서는 매개변수의 선언을 다르게 함으로서 함수의 오버로딩이 가능하다!
2. 디폴트 값은 함수의 선언부분에만 표현하면 된다.
3. 반드시 오른쪽에서 디폴트 값을 채우는 형식으로 정의해야 한다.
4. 인라인 함수는 inline키워드를 사용하여 정의한다.
출저: 열혈 C++ 프로그래밍 - 저자 윤성우