Name Space
namespace는 특정 영역을 분리하는 식별자 역할을 한다. 데이터의 범위를 단순히 전역·지역으로 나누지 않고 namespace를 이용해 구체적으로 지정해 줄 수 있다.
namespace test1 {
void HelloWorld(void);
}
namespace test2 {
void HelloWorld(void);
}
test1과 test2라는 독립된 공간을 만들어 HelloWorld라는 같은 이름의 함수가 충돌하지 않도록 분리해 주었다. test1과 test2는 각각의 공간을 식별해주는 namespace가 된다.
test1::HelloWorld
namespace::함수/변수의 형태로 특정 namespace 내의 데이터를 정의하거나 불러온다.
예시: namespace로 분리하기
#include <iostream>
namespace test_inf {
int num = 3;
void HelloWorld(void);
}
int main(void) {
test_inf::HelloWorld();
std::cout << "test_inf::num: " << test_inf::num << std::endl;
// std::cout << num << std::endl; --> 오류
return 0;
}
void test_inf::HelloWorld(void) {
std::cout << "Hello World! from 'test_inf'" << std::endl;
}
파일 단위로 분리
// test.h
#ifndef TEST_H
#define TEST_H
// 선언
namespace test_inf {
void HelloWorld(void);
void PrintNum(int num);
}
#endif
// test.cpp
#include <iostream>
#include "test.h"
// 정의
void test_inf::HelloWorld(void) {
std::cout << "Hello World!" << std::endl;
}
void test_inf::PrintNum(int num) {
std::cout << "Num: " << num << std::endl;
}
// main.cpp
#include "test.h"
// 호출
int main(void) {
test_inf::HelloWorld();
test_inf::PrintNum(333);
return 0;
}
- test.h에 필요한 내용을 선언한다.
- test.cpp에 선언한 내용을 정의한다.
- main.cpp에서 정의한 함수를 호출한다.
namespace로 분리한 내용을 다시 파일 단위로 분리해 각각의 파일에서 namespace를 한 번에 관리할 수 있도록 만들었다. 각각의 파일은 선언·정의·호출을 담당하고 있다.
using
입출력에서 사용되는 std::cout은 std라는 namespace에 정의된 cout라는 의미이다. 만약 using을 사용하면 namespace를 명시하지 않고 특정 함수나 변수를 호출할 수 있다. using namespace를 이용하면 namespace 내에 있는 모든 데이터를 사용할 수 있게 된다.
#include <iostream>
int main(void) {
using std::cout;
cout << "Hello!";
return 0;
}
위 예시는 main 함수 내에서 std의 cout를 사용하겠다는 의미이다.
#include <iostream>
using namespace std;
int main(void) {
cout << "Hello!" << endl;
return 0;
}
위 예시는 전역에서 std라는 namespace의 데이터에 접근하겠다는 의미이다.
물론 변수명 간의 충돌이 없다는 확신이 있다면, using namespace를 전역적으로 사용하는 것이 편리하다. 하지만 충돌의 가능성이 조금이라도 있다면 동일한 변수명 간의 중복으로 인한 문제가 발생할 수 있음을 생각해야 한다.