본문으로 바로가기

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

category 프로그래밍/C++ 2017. 2. 20. 00:45
728x90
반응형

안녕하세요. letitkang입니다.


요즘 피곤해서 글을 몇일 못썼네요 ㅠㅠ


오늘부터 다시 1일 2포스팅 시작하겠습니다!


오늘도 주황주황한 '윤성우의 C++ 열혈강의'를 보고 있습니다.


지난 시간에는 함수 오버로딩과 매개변수의 디폴트 값을 어떻게 사용하는지에 대해 알아보았습니다.


바로 오늘의 포스팅 시작하겠습니다.

 

 

 

 



인라인(inline)함수??


인라인 함수란 '프로그램 소스코드라인 안으로 들어가 버린 함수'입니다.


즉, 코드 안에 들어가 있는 함수입니다.


보통 인라인 함수는 매크로 함수와 비교 대상이 됩니다.


매크로 함수는 define으로 정의해 놓은 함수입니다.


===============================================================================================

매크로 함수 예제 소스 코드

===============================================================================================

  1 #include <iostream>

  2 #define SQUARE(x) ((x)*(x))

  3

  4 int main(void)

  5 {

  6     std::cout<< SQUARE(5) << std::endl;

  7     return 0;

  8 }

===============================================================================================

결과

===============================================================================================

25

===============================================================================================


매크로 함수를 간단히 살펴보겠습니다.


define으로 SQUARE 함수를 만들어서 인자로 5를 넣고 출력하였습니다.


C를 해보신분이라면 이정도 소스는 아시겠죠? 모르시면 매크로 함수 관련 자료 한번만 보시면 됩니다!!!


매크로 함수의 장점은


'일반적인 함수에 비해서 성능향상으로 인한 속도의 이점이 있습니다'


그러면 반대로 단점은


'정의 하기가 어려워, 복잡한 함수는 정의의 한계가 있습니다.


그러면 출력 부분을 살펴보겠습니다.


===============================================================================================

std::cout<< SQUARE(5) << std::endl;

===============================================================================================


위의 SUQARE(5)가 전처리되면서, 아래처럼 되었습니다.


===============================================================================================

std::cout<< ((5)*(5)) << std::endl;

===============================================================================================


((5)*(5))로 함수 몸체부분이 함수 호출문을 대체했다고 보시면 됩니다.


위와 같이 함수 몸체가 함수 호출문을 완전히 대체 되면 '함수가 인라인화가 되었다'라고 합니다.


매크로 함수의 장, 단점을 살펴 보았는데, 매크로 함수의 장점은 가지고, 단점을 없앤 것이 바로 '인라인 함수'입니다.


매크로 함수의 예제를 살펴보겠습니다.


===============================================================================================

매크로 함수 예제 소스 코드

===============================================================================================

  1 #include <iostream>

  2

  3 inline int SQUARE(int x)

  4 {

  5     return x*x;

  6 }

  7

  8 int main(void)

  9 {

 10     std::cout<<SQUARE(5)<<std::endl;

 11     std::cout<<SQUARE(12)<<std::endl;

 12     return 0;

 13 }

===============================================================================================

결과

===============================================================================================

25

144

===============================================================================================


 

 

 



이런 식으로 인라인 함수를 쓰시면됩니다. 참 쉽죠?


참고로 매크로 함수를 사용하면, 전처리기에 의해서 처리되지만, inline으로 정의된 함수는 컴파일러에 의해 처리가 됩니다.


따라서 함수 인라인화가 성능에 방해가 된다고 생각하면, 이 키워드를 무시해버리고, 일반 함수로 정의해버립니다.


참 똑똑하죠?


그 다음 매크로 함수에 있지만, 인라인 함수에 없는 장점을 살펴보겠습니다.


자료형에 의존적이지 않습니다.


===============================================================================================

#define SQUARE(x) ((x)*(x))

===============================================================================================


위의 매크로 함수에서 x가 어떤 값이던지, 자료형에 맞게 출력하게 됩니다.


인라인 함수는 어떨까요?


===============================================================================================

inline int SQUARE(int x)

{

    return x*x;

}

===============================================================================================


inline 함수는 자료형을 명시하기 때문에 다른 자료형을 사용하면 데이터의 손실이 발생합니다.


int 형이기 때문에 double 형의 값을 넣는다면, int형으로 출력이 됩니다.


그러나 추후에 template를 사용하면 이문제는 해결할 수 있습니다. 추후에 자세히 설명드리겠습니다.


 

 



이번 포스팅은 이까지 하도록 하겠습니다.


다음 강에서는 namespace에 대해서 이야기해보도록 하겠습니다!


읽어주셔서 감사합니다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++]이름공간(namespace) (2)  (0) 2017.02.20
[C++]이름공간(namespace) (1)  (0) 2017.02.20
[C++]함수 오버로딩(Function Overloading)과 매개변수의 디폴트값  (0) 2017.02.12
[C++]C++? (2)  (0) 2017.02.07
[C++]C++? (1)  (0) 2017.01.31