본문 바로가기

C++/윤성우의 열혈 프로그래밍 C++

윤성우의 열혈 C++ chpt2.

이름 공간의 기본원리

 

프로젝트의 진행에 있어서 발생할 수 있는 이름의 충돌을 막을 목적으로 존재하는 것이 이름 공간이다.

namespace BestComImpl
{
    void SimpleFunc(void)
    {
        std::cout << "BestCom이 정의한 함수" << std::endl;
    }
}

namespace ProgComImpl
{
    void SimpleFunc(void)
    {
        std::cout << "ProgCom이 정의한 함수" << std::endl;
    }
}

int main(void)
{
    // 존재하는 이름공간이 다르면 동일한 이름의 함수 및 변수를 선언하는 것이 가능

    BestComImpl::SimpleFunc(); // 이름공간 BestComImpl에 정의된 SimpleFunc의 호출
    ProgComImpl::SimpleFunc(); // 이름공간 ProgComImpl에 정의된 SimpleFunc의 호출

    return 0;
}

 

이름공간 기반의 함수 선언과 정의의 분리

namespace BestComImpl
{
    void SimpleFunc(void); //이름공간 BestComImpl에 위치하는 함수 SimpleFunc의 선언과 정의의 분리
}

namespace ProgComImpl
{
    void SimpleFunc(void); // 이름공간 ProgComImpl에 위치하는 함수 SimpleFunc의 선언과 정의의 분리
}

int main(void)
{
    BestComImpl::SimpleFunc();
    ProgComImpl::SimpleFunc();

    return 0;
}

void BestComImpl::SimpleFunc(void)
{
    std::cout << "BestCom이 정의한 함수" << std::endl;
}

void ProgComImpl::SimpleFunc(void)
{
    std::cout << "ProgCom이 정의한 함수" << std::endl;
}

 

 

동일한 이름공간 내에서의 함수호출

namespace BestComImpl
{
    void SimpleFunc(void);
}

namespace BestComImpl
{
    void PrettyFunc(void);
}

// 선언된 이름공간의 이름이 동일하다면, 이 둘은 동일한 이름공간으로 간주한다. 
// 즉, SimpleFunc와 PrettyFunc는 동일한 이름공간안에 존재하는 상황.

void BestComImpl::SimpleFunc(void)
{
    std::cout << "BestCom이 정의한 함수" << endl;
    pretty();			// 동일 이름공간
    ProgComImpl::SimpleFunc();	// 다른 이름공간
}

void BestComImpl::PrettyFunc(void)
{
    std::cout << "So Pretty!!" << std::endl;
}

// 이름공간을 명시하지 않고 함수를 호출하면, 함수의 호출문이 존재하는 함수와 동일한 이름공간 안에서 호출한 함수를 찾게 된다. 
// 따라서 SimpleFunc 함수 내에서는 이름공간을 명시하지 않은 상태에서 PrettyFunc 함수를 직접호출 할 수 있다.

 

 

이름공간의 중첩

 

std::cout, std::cin, std::endl

 

<iostream>에 선언되어 있는 cout, cin 그리고 endl은 이름공간 std 안에 선언되어 있다. 
이렇듯 이름충돌을 막기 위해서, C++ 표준에서 제공하는 다양한 요소들은 이름공간 std 안에 선언되어 있다.

 

std::cout -> 이름공간 std 에 선언된 cout

std::cin -> 이름공간 std 에 선언된 cin

std::endl -> 이름공간 std 에 선언된 endl

namespace std
{
    cout ...
    cin ...
    endl ...
}

 

 

using 을 이용한 이름곤간의 명시

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
// 이후부터 cin, cout, endl은 std::cin, std::cout, std::endl을 의미한다는 선언

int main(void)
{
    int num=20;

    cout << "Hello World!" << endl;
    cout << "Hello " << "World!" << endl;
    cout << num << ' ' << 'A';
    cout << ' ' << 3.14 << endl;

    return 0;
}
---------------------------------------------------
// using 사용

#include <iostream>

using namespace std;
// 이름공간 std에 선언된 것은 std라는 이름공간의 선언없이 접근하겠다는 선언

int main(void)
{
    int num=20;

    cout << "Hello World!" << endl;
    cout << "Hello " << "World!" << endl;
    cout << num << ' ' << 'A';
    cout << ' ' << 3.14 << endl;

    return 0;
}

 

너무 빈번한 using namespace의 선언은 이름의 충돌을 막기위한 이름공간의 선언을 의미없게 만든다.

따라서 제한적으로 사용할 필요가 있다.

 

 

이름공간의 별칭 지정과 전연변수의 접근

'C++ > 윤성우의 열혈 프로그래밍 C++' 카테고리의 다른 글

윤성우의 열혈 C++ chpt6.  (2) 2025.06.08
윤성우의 열혈 C++ chpt5.  (0) 2025.05.16
윤성우의 열혈 C++ chpt4.  (0) 2025.05.12
윤성우의 열혈 C++ chpt3.  (0) 2025.05.12
윤성우의 열혈 C++ chpt1.  (0) 2025.05.11