본문 바로가기
C++

C++ 강의 6장 - inline 함수 & 이름 공간(namespace) -

by ChocoPeanut 2017. 4. 23.

C++ 강의 6

- inline 함수 & 이름 공간(namespace) -

 

inline 함수는 다른 언어를 배운 사람들이 보면 조금 생소할 수도 있다. in내부를 의미하고 line프로그램 코드라인을 의미하는 말이다. 따라서 프로그램 코드라인 안으로 들어가 버린 함수라는 의미로 해석할 수 있다.


C언어에 대해 먼저 선행을 하였을 경우 매크로 함수에 대해 공부를 하였을 것이다. 매크로 함수는 함수의 결과 값을 도출하는 식을 미리 정의하는 형태를 가진다. 전처리 부분에 함수를 정의한다.

 

#define 매크로 함수명(인수) 치환될 부분

 

위와 같은 형태로 매크로 함수를 정의하는데 다른 함수들에 비해 일반적으로 실행속도가 빠르다는 이점을 가지고 있다. 매크로의 정의가 전처리 부분에서 되므로 함수의 몸체부분이 함수의 호출문으로 변경되는 효과를 가지고 있기 때문이다. 하지만 복잡한 형태의 함수를 매크로 함수로 정의하는데 어려운 점을 가지고 있다. 따라서 일반 함수처럼 정의가 가능하면서 실행속도를 빠르게 진행할 수 있는 방법이 필요했다. 그 방법이 C++에서 생긴 inline 함수이다.


 

inline 함수는 사용이 매우 간단하다. 일반적으로 정의된 함수 앞에 inline이라는 정의만 붙이면 그 함수는 inline화 되었다고 한다. 매크로 함수의 경우 전처리기에 의해서 처리되지만, inline 함수는 컴파일러에 의해서 처리가 된다. 따라서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우 inline화를 풀어버린다. 또한 반대로 컴파일러가 필요한 경우 일부 함수를 임의로 인라인 처리하기도 한다. 따라서 어떤 프로그래머는 모든 함수를 inline 처리를 하여 성능을 높이기도 한다.


 

하지만 인라인 함수에도 단점을 가지고 있다. 매크로 함수의 경우 전처리기에 정의가 되면 자료형에 의존하지 않는 함수가 된다. 따라서 int형이든 double형이든지에 상관없이 정확한 값을 처리할 수 있다. 하지만 inline함수는 inline을 정의한 일반 함수의 자료형에 따라 결과 값의 형태가 정해져있다. 그러나 C++에는 템플릿이라는 도구가 존재하여 이런 점은 크게 문제라고 할 수 없다. 템플릿을 사용하면 자료형에 구애받을 일이 없다. 템플릿에 대해서는 나중에 다시 설명을 할 것이다.


 

이름 공간은 무엇일까? 이름 공간은 특정 영역에 이름을 붙여주는 문법적인 요소이다. 어떠한 이름 공간에 이름을 정의하고 그 내부에 우리가 원하는 함수나 변수들을 넣어 사용한다. 그러면 이름 공간을 왜 사용할까? 우리는 이름이 왜 필요한가? 바로 상대방과 구분하기 위해서이다. 그런데 만약 이름이 같다면 어떻게 될까? 내 이름이 홍길동인데 같은 학교에 홍길동이라는 친구가 또 있다고 생각해보자. 그러면 나와 이 친구를 어떻게 구분하겠는가? 교실에서 같은 경우에는 번호로 구분을 할 수도 있고 생김새에 따라 구분을 할 수도 있다. 이렇게 부가적으로 이름을 구분할 수 있게 하는 요소가 바로 이름 공간이다. 이름 공간이 코드에서 필요한 이유는 회사와 같은 공간에서 더욱 두각을 보인다. 회사에서는 나 혼자 프로젝트에 참여해서 코드를 만들지 않는다. 여러 사람들이 협업을 해서 프로그램을 짜게 되는데 이럴 때 서로 다른 상황에서 코드를 만들다보면 함수의 이름이나 변수의 이름이 겹치게 사용되는 경우가 많다. 이렇게 이름충돌이 생기게 되면 나중에 프로그램을 돌리게 되면 동작을 하지 않는다. 따라서 이러한 문제를 방지하기 위해 이름 공간을 만드는 것이다. 이름 공간을 만들어 누가 만든 누구의 함수인지를 분명하게 구별시켜준다. 나중에 특정 이름 공간의 함수를 불러오고 싶을 때에는 범위지정 연산자(::)를 사용하여 불러올 수 있다. 또한 이름 공간 안에서도 새로운 이름 공간을 만들 수 있다.




그런데 이름 공간을 사용할 때 매번 일일이 범위지정 연산자를 이용해서 불러오기 귀찮을 수 있다. 그래서 이럴 때 사용하는 도구가 생겼다. 하나의 프로젝트 파일에 내가 선언한 이름 공간의 함수만을 사용하면 된다고 하면 우리는 using이라는 이름 공간 명시 도구를 사용할 수 있다. using을 사용하게 되면 해당 이름 공간의 정의된 함수는 범위 연산자를 통해 이름 공간을 일일이 명시하지 않아도 컴파일러는 그 함수는 using에서 선언된 이름 공간으로부터 온 것을 알 수 있다.

그런데 우리는 조금 더 귀찮음을 느껴 내가 선언한 이름 공간 안의 모든 함수와 변수를 범위 연산자를 사용하지 않고 사용하고 싶다고 하자. 그러면 우리는 using namespace라는 선언을 할 수 있다.


using namespace 이름 공간;


위와 같은 형태로 이름 공간을 지정하면 모든 것에 대해 이름 공간 지정의 생략을 명령하는 것이다. 대표적인 예시로 using namespace std가 있다. 우리는 앞에서 출력이나 개행하기 위한 명령어를 사용할 때, coutendl을 사용하였는데 앞에 std를 붙여 사용하였다. 출력에 대한 명령어가 많은 경우 위와 같은 선언을 하여 이름 공간 지정을 생략할 수 있다.



댓글0