정의 된 이름들의 모음집이라고 한다. 그렇다면 이런 질문이 나온다. 이름? 뭐의 이름인데? 여기서 이름은 클래스의 정의 혹은 변수의 정의를 말한다.
우리는 이 개념을 많이 써왔다.
using namespace std;
이 코드는 아마 std라는 네임 스페이스를 불러오는 코드일 것이다. 프로그램은 많은 클래스와 함수를 가지기 때문에 같은 이름을 가지는 코드가 나올 수 있다. 때문에 이러한 이름 공간을 만들어서 함수나 클래스를 호출하는 것이다. 장점은 이것을 on / off할 수 있다는 점이다.
여기서 namespace안에 있는 이름들을 하나만 불러오거나 다 가져올 수 있다.
using namespace std;
이 경우에는 std 안에 있는 모든 것을 가져온 경우이다.
using std::cout;
이런 식으로 쓰면 하나만 가져오는 것이다.
선언은 다음과 같이 하면 된다.
namespace Sapce1
{
void greeting();
}
정의는 다음과 같이 한다.
namespace Space1
{
void greeting()
{
cout << "Hello from namespace Space1. \n";
}
}
이것은 로컬로 저장 된다고 한다.
#include <iostream>
using namespace std;
namespace {
const int i = 4;
int variable;
}
int main()
{
cout << i << endl;
variable = 100;
return 0;
}
다음과 같이 진짜 이름이 없는 namespace이다. 메인 함수에서 접근할 수 있다. 이것은 이 파일 안에서만 실행된다고 한다. 사실 왜 Local scope인지는 잘 이해가 되지 않는다. 외부에서 접근이 가능한거면 왜 local이지..? 단순하게 생각해서 namespace인데 이름이 없어서 그냥 접근 가능하다고 이해하자. 아직 링커에 대해서 공부하지 않아서 막히는 것 같다. 다음에 링커에 대해 정리를 좀 해야겠다.
Unnamed namespace
– Used for local name definitions
– Scope is compilation unit
Global namespace
– Items not in a namespace grouping at all
– Global scope