본문 바로가기
프로그래밍/C || CPP

[C++] 인라인(inline) 함수를 알아보자!

by _BlankSpace 2018. 5. 6.

1. 인라인(inline) 함수란?


먼저, 인라인 함수라고 이름을 붙인 의미를 이해해보자. 인라인은 말 그대로 인(in) + 라인(line) 으로 '코드라인 내부에 들어간 함수' 라고 생각하면 될 것 같다.


인라인 함수와 비슷한 기능으로는 C언어에서 매크로 함수가 있었다.

혹시, 매크로 함수가 정확히 기억이 나지 않는다면, 다음 링크를 참고해보자!

[매크로 함수 알아보기]


어쨌든, 비슷한 기능을 하는 매크로 함수가 존재하였는 데, 인라인 함수가 추가된 이유는 뭘까.

그러므로, 먼저 매크로 함수의 장/단점을 간단하게 정리해보자.


매크로 함수의 장점일반적인 함수에 비해서 실행속도가 더 빠르다는 점이다.

반면에 단점으로는 정의하는 것이 어렵고, 복잡한 매크로 형태로 정의하는 것에 한계가 있다는 것이다.

간단한 예를 보자.

1
2
3
4
5
6
7
8
#include <iostream>
#define DOUBLE(x) ((x) * (x))
 
int main(void)
{
    std::cout << DOUBLE(3<< std::endl;
    return 0;
}
cs


위의 예로 매크로 함수의 과정을 설명하자면..

6번 라인이 매크로 함수 내용으로 대체되면서, 다음과 같이 된다.

1
std::cout << ((3* (3)) << std::endl;
cs


위의 예에서는 매크로 함수 정의가 간단하였지만, 조금만 복잡해져도 사용하기가 힘들다.

따라서, 매크로 함수의 장점은 유지하면서, 단점을 제거하는 방법으로 C++에서 인라인 함수가 추가된 것이다.

그럼, 인라인 함수의 간단한 예를 확인해보자.


1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
inline int DOUBLE(int x)
{
    return x * x;
}
 
int main(void)
{
    std::cout << DOUBLE(3<< std::endl;
    return 0;
}
cs


위의 예제와 같이, 인라인 함수는 함수의 정의를 더욱 명확하게 할 수 있어서, 가독성에도 도움을 줄 수 있다.


(+) 매크로 함수를 이용한 인라인화는 전처리기에 의해서 처리되지만, inline 키워드를 이용한 함수의 인라인화는 컴파일러에 의해서 처리가 된다.


2. 인라인 함수의 단점, 그 단점을 보완하기 위한 방법.


인라인 함수는 매크로 함수에는 없는 단점 한 가지가 있다.


다음 예를 보자.

1
#define DOUBLE(x) ((x) * (x))
cs

만약, x에 정수형말고 실수형이 들어간다면 어떻게 될까?

매크로 함수는 자료형에 의존적이지 않는 함수이므로, 데이터의 손실이 일어나지 않는다.


예를 들어서, 다음과 같이 자료형에 상관 없이 된다는 말이다.

1
2
3
std::cout << DOUBLE(3);
-> std::cout << ((3* (3));
-> 9
cs


1
2
3
std::cout << DOUBLE(1.5);
-> std::cout << ((1.5* (1.5));
-> 2.25
cs


하지만, 인라인 함수는 매크로 함수와는 다르게 인자에 자료형을 표시하므로, 문제가 발생한다.

1
inline int DOUBLE(int x) { return x*x; }
cs


이러한 문제점을 보완하기 위해서는 템플릿을 사용하는 방법이 있다.

사실, 템플릿은 C++ 뒷 부분에 나오므로, 템플릿을 모른다면 가볍게 봐도 상관 없을 듯 하다.


아래 예는 템플릿을 사용한 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
template <typename T>
inline T DOUBLE(T x)
{
    return x * x;
}
 
int main(void)
{
    std::cout << DOUBLE(3<< std::endl;
    std::cout << DOUBLE(1.25<< std::endl;
    return 0;
}
cs


템플릿을 사용하여, 정수나 실수형을 모두 커버할 수 있는 인라인 함수를 만들 수 있게 되었다.

C++에서 인라인 함수는 자주 쓰는 함수이므로, 이번 기회에 한번 씩 사용해보는 건 어떨까.


이상으로 포스팅을 마치겠습니다.

서로 링크 추가는 항상 환영입니다. :)

댓글