이름 공간의 기본원리
프로젝트의 진행에 있어서 발생할 수 있는 이름의 충돌을 막을 목적으로 존재하는 것이 이름 공간이다.
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 |