3. C++ 기본(3)
인라인 (inline) 함수
인라인 함수를 공부하기 전에 매크로 함수에 대해서 먼저 살펴보자.
매크로 장점 |
매크로 단점 |
실행 속도의 이점이 있다. |
정의하기 어렵다. 복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다. |
예제를 통해 살펴보자
- #include <iostream>
- #define square(x) ((x)*(x))
- using namespace std;
- int main() {
- cout << square(5) << endl;
- return 0;
- }
위의 코드는 전처리 과정을 거치면 다음과 같이 변경된다.
- #include <iostream>
- using namespace std;
- int main() {
- cout << ((5)*(5)) << endl;
- return 0;
- }
위 예제와 같이 함수의 몸체부분이 함수호출 문장을 완전히 대체하였을때 "함수가 인라인화 되었다" 라고 표현한다.
다음 예제를 통해 인라인 함수를 이해해보자.
- #include <iostream>
- using namespace std;
- inline int square(int x) {
- return x*x;
- }
- int main() {
- cout << square(5) << endl;
- cout << square(12) << endl;
- return 0;
- }
예제 결과
※ 매크로를 이용한 함수 인라인화는 전처리기에 의해서 처리되지만 inline을 이용한 함수는 컴파일러에서 처리한다.
자료형을 정의하기 때문에 데이터 손실이 발생할 수 있다. => 템플릿 이용 (나중에 언급)
이름공간(namespace)
이름공간이란 말 그대로 특정 영역에 이름을 붙여주기 위한 문법적 요소이다.
다음의 예제를 통해 이해해보자.
- #include <iostream>
- using namespace std;
- namespace bobgood{
- void func1() {
- cout << "bobgood func" << endl;
- }
- }
- namespace comp {
- void func1() {
- cout << "comp func" << endl;
- }
- }
- int main() {
- bobgood::func1();
- comp::func1();
- return 0;
- }
예제 결과
bobgood 이라는 공간을 마련하였다. 그리고 그 안에 func1 함수를 정의하였다.
따라서 이 함수는 bobgood :: func1이라고 지칭하게 된다.
comp 이라는 공간을 마련하였다. 그리고 그 그 안에 func1 함수를 정의하였다.
따라서 이 함수는 comp :: func1 이라고 지칭하게 된다.
그리고 각각의 공간에서 func1 함수를 호출하였다.
위 예제에서 사용한 연산자 ( :: )를 가리켜 범위지정 연산자 라 하며, 이름공간을 지정할 때 사용하는 연산자이다.
다음 예제를 계속해서 살펴보자.
- #include <iostream>
- using namespace std;
- namespace bobgood {
- void func1();
- }
- namespace comp {
- void func1();
- }
- int main() {
- bobgood::func1();
- comp::func1();
- return 0;
- }
- void bobgood::func1() {
- cout << "bestcom func1" << endl;
- }
- void comp::func1() {
- cout << "comp func1" << endl;
- }
결과는 위의 소스코드 의 결과와 같다.
4 ~ 6행 : 이름공간 안에 함수의 선언만 삽입되었다.
8 ~ 10행 : 마찬가지로 이름공간 안에 함수의 선언만 삽입되었다.
19행 ~ 21행 : 이름공간 bobgood에 선언된 함수 func1을 정의한다.
23 ~ 25행 : 마찬가지로 comp에 선언된 함수 func1을 정의한다.
동일한 이름공간에 정의된 함수를 호출할 때에는 이름공간을 명시할 필요가 없다.
- #include <iostream>
- using namespace std;
- namespace bobgood {
- void func1();
- }
- namespace bobgood {
- void func2();
- }
- namespace comp {
- void func3();
- }
- int main() {
- bobgood::func1();
- return 0;
- }
- void bobgood::func1() {
- cout << "bobgood func1" << endl;
- func2();
- comp::func3();
- }
- void bobgood::func2() {
- cout << "so pretty func2" << endl;
- }
- void comp::func3() {
- cout << "comp func3" << endl;
- }