'인라인(inline) 함수'라는 이름의 의미부터 이해해보자.
in은 내부를 의미하고,
line은 '프로그램 코드라인'을 의미한다.
즉, "프로그램 코드라인 안으로 들어가 버린 함수"라는 뜻이 된다.
그럼 의문점이 들 수 있다.
"매크로 함수랑 인라인 함수랑 뭐가 다르지?"
일단, 매크로 함수의 단점을 생각하면 다음과 같다.
"정의하기가 어렵다. 복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다."
그럼 지난번 복습을 위해 매크로 함수를 정의해보자.
#include <iostream>
#define SQUARE(x) ((x)*(x))
using namespace std;
int main(void)
{
cout<<SQUARE(5)<<endl;
return 0;
}
SQUARE라는 매크로 함수를 정의하였다.
그럼 위 코드는 전처리 과정이 거치면 다음과 같이 변경된다.
#include <iostream>
using namespace std;
int main(void)
{
cout<<SQUARE((5)*(5))<<endl;
return 0;
}
이처럼 함수 호출 문장을 완전히 대체했을 때 '함수가 인라인화 되었다.'라고 표현한다.
그러나 매크로 함수는 정의하기가 복잡해서, 일반 함수처럼 정의가 가능하게 하고 싶어 진다.. :(
그래서 매크로 함수의 장점은 유지를 하되, 일반 함수처럼 정의가 가능하게 C++에서는 인라인(inline) 함수를 제공한다.
인라인 함수의 정의는 다음과 같다.
#include <iostream>
using namespace std;
inline int SQUARE(int x)
{
return x*x
}
int main(void)
{
cout<<SQUARE(5)<<endl;
return 0;
}
사실 위의 코드는 매크로 함수의 장점을 완전히 대체하지 못했다.
왜냐하면 int라는 자료형에 의존적인 함수가 되기 때문이다.
물론 함수의 오버로딩으로 해결할 수도 있겠지만, 그렇게 되면 여러 개의 함수를 추가로 정의하게 되므로
한 번만 정의하면 되는 매크로 함수의 장점과는 멀어지게 된다.
그러나 C++의 템플릿(template)이라는 것을 이용하면 매크로 함수와 마찬가지로 자료형에 의존적이지 않은 함수가 완성된다.
#include <iostream>
using namespace std;
template <typename T>
inline T SQUARE(T x)
{
return x*x
}
int main(void)
{
cout<<SQUARE(5)<<endl;
return 0;
}
이와 같은 프로그래밍을 일반화 프로그래밍 (Generic programming)이라하는데, 이건 나중에 템플릿(template)과 템플릿 특수화(specialization)과 함께 포스팅할 예정이다.
'스터디 > C++' 카테고리의 다른 글
[ C++ ] Call-by-value , Call-by-reference (0) | 2019.09.05 |
---|---|
[ C++ ] const ( 상수 )의 활용 (0) | 2019.09.05 |
[ C++ ] 선행처리기 / 전처리기 ( Preprocess ) (0) | 2019.09.05 |
[ C++ ] 매개변수의 디폴트 값 ( Default Value ) (0) | 2019.09.05 |
[ C++ ] 함수 오버로딩 ( Function Overloading ) (0) | 2019.09.05 |