네임스페이스 사용법

#include <iostream>

namespace MySpace1
{
    int doSomething(int a, int b)
    {
        return a + b;
    }
}

int doSomething(int a, int b)
{
    return a * b;
}

using namespace std;

int main()
{
    cout << MySpace1::doSomething(3, 4) << endl;
    cout << doSomething(3, 4) << endl;

    return 0;
}

 

 

namespace는 중첩해서 선언 및 사용할 수 있다.

#include <iostream>

namespace MySpace1
{
    namespace test
    {
        int doSomething(int a, int b)
        {
            return a + b;
        }
    }
}

int doSomething(int a, int b)
{
    return a * b;
}

using namespace std;

int main()
{
    cout << MySpace1::test::doSomething(3, 4) << endl;
    cout << doSomething(3, 4) << endl;

    return 0;
}

 

그리고 using 문법을 사용해서 함수 호출 시 네임스페이스를 생략해서 사용할 수 있도록 선언할 수 있다.

#include <iostream>

namespace MySpace1
{
    namespace test
    {
        int doSomething(int a, int b)
        {
            return a + b;
        }
    }
}

using namespace std;
using namespace MySpace1::test; // 해당 문법을 통해 함수를 간단히 사용

int main()
{
    cout << doSomething(3, 4) << endl;

    return 0;
}

 

 

하지만, 이처럼 namespace를 생략할 수 있도록 using을 사용하였을 때 namespace 내부의 함수와 해당 소스파일에서 존재하는 함수의 이름이 동일한 경우가 존재한다면, 컴파일 에러가 발생한다.

#include <iostream>

namespace MySpace1
{
    namespace test
    {
        int doSomething(int a, int b)
        {
            return a + b;
        }
    }
}

int doSomething(int a, int b)
{
    return a * b;
}

using namespace std;
using namespace MySpace1::test;

int main()
{
    cout << MySpace1::test::doSomething(3, 4) << endl;
    cout << doSomething(3, 4) << endl;

    return 0;
}

 

 

 

그래서 using namespace를 헤더 파일에선 무조건 사용하지 않는게 좋고, cpp 파일에서도 웬만하면 쓰지 않는 것이 좋은 것 같다.

꼭 써야겠다면, 이처럼 함수 안에서 `using namespace`를 사용하던가, 아니면 필요한 가져와서 사용하는 방법이 있다.

int main()
{
    using namespace std;
    cout << MySpace1::test::doSomething(3, 4) << endl;
    cout << MySapce2::doSomething(3, 4) << endl;

    return 0;
}
int main()
{
    using std::cout;
    cout << MySpace1::test::doSomething(3, 4) << std::endl;
    cout << MySapce2::doSomething(3, 4) << std::endl;

    return 0;
}

 

 

 

iostream의 std 네임 스페이스 선언

이처럼 매크로를 통해 `namespace std{`와 `}`를 따로 선언하여 `cin`, `cout`, 등의 함수에 대해 namespace를 지정해주었다.