본문 바로가기
스터디/C++

[ C++ ] 인라인(inline) 함수

by 알 수 없는 사용자 2019. 9. 5.

'인라인(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)과 함께 포스팅할 예정이다.