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++에서 인라인 함수는 자주 쓰는 함수이므로, 이번 기회에 한번 씩 사용해보는 건 어떨까.
이상으로 포스팅을 마치겠습니다.
서로 링크 추가는 항상 환영입니다. :)
'프로그래밍 > C || CPP' 카테고리의 다른 글
[C++] “Field has incomplete type” error 문제 해결 (0) | 2018.07.11 |
---|---|
[C | C++] #define 매크로 상수, 함수 정리 (1) | 2018.05.10 |
[C++11] DEFAULT / DELETE 키워드 정리 (0) | 2018.05.02 |
[STL] STL 반복자 정리 (iterator) (1) | 2018.04.29 |
[C++11] std::set 을 알아보자. (0) | 2018.04.29 |
댓글