본문 바로가기

Programming/C++

[C++] 1. 이름공간(Namespace), 인라인 함수(Inline function)

이 포스팅은 윤성우님의 열혈 C++ 프로그래밍 책을 기반으로 작성되었습니다.

유튜버 포프님의 영상을 보고 unmanaged 언어의 중요성을 느끼고, 이제부터 학부 초반에 배웠던 객체지향프로그래밍과 데이터구조의 기억을 되살려서 한번 C++을 공부해보고자 한다. 앞으로의 포스팅은 순전히 나를 위한, 내가 모르는 것들을 기반으로 기록하는 형태로 작성될 예정이다.
윤성우님은 C를 안다는 가정하에 C++책을 작성해나가셨고, 나는 C를 본 적이 없지만. 이전에 C++경험이 있고 파이썬을 계속 공부를 했으니 어느정도 괜찮지 않을까라는 믿음에서 출발해본다.

Namespace란 무엇일까?

A사 B사가 함께 개발 콜라보를 진행한다고 했을 때, 서로 분담을 한 후 만나서 합치려고 보니 함수의 이름이 양쪽이 똑같은 게 많다고 생각해보자. 이는 어느 한 쪽이 모든 함수의 이름을 새로 비교해가며 짜야하는 불필요한 작업을 요구하게 된다.
하지만 namespace라는 이름공간을 사용하면 A사의 함수F를 호출해! B사의 함수F를 호출해! 등등의 같은 이름이라 하더라도 다른 용도로 호출이 가능한 것이다.
C++을 조금이라도 접해본 사람이 친숙한 using namespace std;는 이 공간안에서는 namespace를 std로 하겠다고 정의한 것이며, 실제로 cout cin 등등의 기본적인 C++ 표준의 요소들은 std라는 namespace안에 정의되어 있다.

이 외에 namespace를 불러오고 정의하기 위해서는 아래와 같이 주로 사용된다.
주로 함수의 선언과 정의를 분리해서 하는 게 좋으며, 선언은 반드시 메인 프로그램 위에서 이루어져야 한다.

namespace jiwan
{
    void jiwan_func(void);
}

int main
{
    jiwan::jiwan_func(); //jiwan이라는 namespace의 jiwan_func()라는 함수를 호출한다.
    return 0
}

void jiwan::jiwan_func(void)
{
    std::cout<<"jiwan is good"<<endl; //std라는 namespace의 cout을 이용.
}

한 이름공간 안에 또 다른 두 개의 이름공간이 있는 것과 같은 이름공간의 중첩도 가능하며 이 경우에는 AAA::BBB::Func()와 같이 사용한다.
해당 이름공간 내에서는 std::같이 이름공간을 명시하지 않고 직접 함수호출이 가능하다. 
이름공간의 선언은 다음과 같은 방식으로 이루어진다.

using namespace std; //std라는 이름공간 사용 선언.
using std::cout; //std라는 이름공간의 cout을 이름공간 선언 없이 사용하겠다 선언.

여기서 알아둬야할 것은 귀찮음때문에 namespace를 다 선언하는 것은 초기 namespace라는 개념의 도입이 무의미해지는 결과를 낳는다.

또한, 하나의 꿀팁을 알려주자면 전역 변수와 함수 내 지역변수의 이름이 같을 때, 일반적으로 함수 내에서의 해당 변수 이름의 호출은 함수 내 지역변수를 가리키지만 ::variable과 같은 형식으로 호출하면 전역변수를 가리키게 된다. 이는 ::앞에 아무것도 안 붙어있다는 것이 전역 즉 이름공간이 없는 공간을 의미하기 때문이다. 

인라인함수(Inline func)는 무엇일까?

인라인 함수는 기존 C의 매크로 함수와 궤를 같이 한다고 보면 된다.
그 장점은 살리고 단점은 보완한 확장형같은 느낌인데.. 인라인 함수의 장/단점은 다음과 같다.
1. 함수의 인라인화로 인하여 성능이 향상될 수 있다.
2. 기존 매크로함수의 복잡한 정의 방식을 보완하였다.
3. 하지만 기존 매크로함수의 자료형에 독립적인 특성은 유지되지 못하고 함수를 오버로딩 해줘야하지만 이는 템플릿을 통해 해결할 수 있다.

인라인 함수의 선언은 다음과 같이 한다. 그냥 일반 함수처럼 한 다음에 앞에 inline을 적어주면 되는 것이다.

using namespace std;

inline int double_return(int x)
{
    return 2*x;
}

int main(void)
{
    cout<<double_return(10)<<endl; // inline화 되면 다음코드는 cout<<2*10<<endl;과 같이 된다.
    return 0;
}

//template을 사용한다면 다음과 같이 쓰자.

template <typename T>
inline T double_return(T x)
{
    return 2*x;
}