인라인 (inline) 함수


인라인 함수를 공부하기 전에 매크로 함수에 대해서 먼저 살펴보자.


매크로 장점

매크로 단점 

 실행 속도의 이점이 있다.

정의하기 어렵다.

복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다. 


예제를 통해 살펴보자


  1. #include <iostream>  
  2. #define square(x) ((x)*(x))  
  3. using namespace std;  
  4.   
  5. int main() {  
  6.     cout << square(5) << endl;  
  7.     return 0;  
  8. }  



위의 코드는 전처리 과정을 거치면 다음과 같이 변경된다.


  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main() {  
  5.     cout << ((5)*(5)) << endl;  
  6.     return 0;  
  7. }  



위 예제와 같이 함수의 몸체부분이 함수호출 문장을 완전히 대체하였을때 "함수가 인라인화 되었다" 라고 표현한다.


다음 예제를 통해 인라인 함수를 이해해보자.


  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. inline int square(int x) {  
  5.     return x*x;  
  6. }  
  7.   
  8. int main() {  
  9.     cout << square(5) << endl;  
  10.     cout << square(12) << endl;  
  11.   
  12.     return 0;  
  13. }  



예제 결과




※ 매크로를 이용한 함수 인라인화는 전처리기에 의해서 처리되지만 inline을 이용한 함수는 컴파일러에서 처리한다.


자료형을 정의하기 때문에 데이터 손실이 발생할 수 있다. => 템플릿 이용 (나중에 언급)



이름공간(namespace)


이름공간이란 말 그대로 특정 영역에 이름을 붙여주기 위한 문법적 요소이다.


다음의 예제를 통해 이해해보자.


  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. namespace bobgood{  
  5.     void func1() {  
  6.         cout << "bobgood func" << endl;  
  7.     }  
  8. }  
  9. namespace comp {  
  10.     void func1() {  
  11.         cout << "comp func" << endl;  
  12.     }  
  13. }  
  14.   
  15. int main() {  
  16.     bobgood::func1();  
  17.     comp::func1();  
  18.   
  19.     return 0;  
  20. }  



예제 결과




bobgood 이라는 공간을 마련하였다. 그리고 그 안에 func1 함수를 정의하였다.

따라서 이 함수는 bobgood :: func1이라고 지칭하게 된다.


comp 이라는 공간을 마련하였다. 그리고 그 그 안에 func1 함수를 정의하였다.

따라서 이 함수는 comp :: func1 이라고 지칭하게 된다.


그리고 각각의 공간에서 func1 함수를 호출하였다.


위 예제에서 사용한 연산자 ( :: )를 가리켜 범위지정 연산자 라 하며, 이름공간을 지정할 때 사용하는 연산자이다.


다음 예제를 계속해서 살펴보자.


  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. namespace bobgood {  
  5.     void func1();  
  6. }  
  7.   
  8. namespace comp {  
  9.     void func1();  
  10. }  
  11.   
  12. int main() {  
  13.     bobgood::func1();  
  14.     comp::func1();  
  15.   
  16.     return 0;  
  17. }  
  18.   
  19. void bobgood::func1() {  
  20.     cout << "bestcom func1" << endl;  
  21. }  
  22.   
  23. void comp::func1() {  
  24.     cout << "comp func1" << endl;  
  25. }  


결과는 위의 소스코드 의 결과와 같다.



4 ~ 6행  : 이름공간 안에 함수의 선언만 삽입되었다.

8 ~ 10행 : 마찬가지로 이름공간 안에 함수의 선언만 삽입되었다.

19행 ~ 21행 : 이름공간 bobgood에 선언된 함수 func1을 정의한다.

23 ~ 25행 : 마찬가지로 comp에 선언된 함수 func1을 정의한다.



동일한 이름공간에 정의된 함수를 호출할 때에는 이름공간을 명시할 필요가 없다.


  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. namespace bobgood {  
  5.     void func1();  
  6. }  
  7.   
  8. namespace bobgood {  
  9.     void func2();  
  10. }  
  11.   
  12. namespace comp {  
  13.     void func3();  
  14. }  
  15.   
  16. int main() {  
  17.     bobgood::func1();  
  18.     return 0;  
  19. }  
  20.   
  21. void bobgood::func1() {  
  22.     cout << "bobgood func1" << endl;  
  23.     func2();  
  24.     comp::func3();  
  25. }  
  26.   
  27. void bobgood::func2() {  
  28.     cout << "so pretty func2" << endl;  
  29. }  
  30.   
  31. void comp::func3() {  
  32.     cout << "comp func3" << endl;  
  33. }  



'Language > C++' 카테고리의 다른 글

6. C++ 기본(6)  (0) 2016.12.13
5. C++ 기본(5) - OOP 단계별 프로젝트 01  (0) 2016.12.12
4. C++ 기본(4)  (0) 2016.12.11
2. C++ 기본(2)  (0) 2016.12.09
1. C++ 기본  (0) 2016.12.08

+ Recent posts