C++ 기초 : 오버로딩, 디폴트값, 인라인 함수

Dora·2020년 7월 9일
0

함수 오버로딩

객체지향언어답게 C에서는 허용되지 않지만 Java에선 허용되는
'함수 오버로딩(Function Overloading)'을 허용한다.

이는 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하기 때문에 가능하다.

C는 안되고 C++은 되는 이유

C는 호출할 함수를 찾을 때 '함수의 이름'만을 이용하여 대상을 찾는다.
반면, C++은 '함수의 이름', '매개변수의 선언' 두 가지 정보를 동시에 활용한다.

  • 그러므로 함수의 오버로딩이 가능하려면 매개변수의 선언이 달라야 한다.
    (매개변수의 자료형 또는 개수의 변화)

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


매개변수의 디폴트 값 (Default Value)

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

매개변수에 디폴트 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자전달이 가능하다.

전달되는 인자는 왼쪽부터 채워지고 나머지는 디폴트로 채운다.

  • 디폴트 값은 함수의 선언 부분에만 표현하면 된다.
    (정의부분말고 선언부분)
  • 부분적 디폴트 값 설정
    • 일부분만 지정할 경우 오른쪽 값을 비우는 형태는 허용되지 않는다.
      = 함수에 전달되는 인자가 왼쪽부터 채워지기 때문이다.

인라인 함수 (Inline)

프로그램 코드라인 안의 함수로 매크로 함수와 반대되는 개념이다.

먼저 매크로 함수에 대해서 알아야 한다.

매크로 함수

매크로 : 선행처리 명령문 중 지시자 뒤에 등장하는 것.

#define PI 3.14

#define : 지시자
PI : 매크로
3.14 : 매크로 몸체(대체 리스트)

  • 매크로의 이름은 대문자로 정의하는 것이 일반적이다.

장점

  • 일반적인 함수에 비해 실행속도가 빠르다.
  • 자료형에 의존적이지 않다.

단점

정의하는 것이 어렵다. 복잡한 함수일 경우 한계가 있다.

인라인 함수의 정의

함수의 몸체부분이 함수 호출 문장을 완전히 대체했을 때 함수가 인라인화 되었다고 표현한다.

= 매크로 함수의 장점을 유지하면서 정의가 복잡하다는 단점을 제거한 것이 인라인 함수다.


ex.
#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; }

이런식으로ㅡ...

// 컴파일러가 인라인함수를 복사하여 함수 호출 부분이 생략된다. (매크로의 장점인 시간단축을 끌어올수있다.)

profile
Lv.1 개발자

0개의 댓글