[C++ : 네임스페이스(namespace)]
알고리즘 공부를 위해 C만 하다가 C++을 배울 때, 모든 게 낯설었지만 가장 눈에띠었던 것은 전역변수로 using namespace std;
를 선언하는 것이었다.
이게 도대체 무엇인가?
네임스페이스(namespace)란?
- 말 그대로 이름을 저장하는 공간.
- 위키백과 : 개체를 구분할 수 있는 범위를 나타내는 말로 일반적으로 하나의 이름 공간에서는 하나의 이름이 단 하나의 개체만을 가리키게 된다.
- C++에서 네임스페이스란 내부 식별자에 사용될 수 있는 유효 범위를 제공하는 선언적 영역을 의미한다.
namespace whatever
{
int blah(int x)
{
return (0);
}
}
이런 식으로 whatever
이라는 이름의 공간 안에 함수를 정의해서 이름을 저장할 수 있다.
using namespace std;
여기서 표준라이브러리인 <iosream.h>에 있는 cout, cin, endl은 std라는 표준 네임스페이스에 포함되어 있는데, 이를 통해 std라는 이름공간안에 있는 함수들을 간편하게 사용할 수 있게 된다.
using?
네임스페이스 내에 있는 함수를 호출할 경우, 네임스페이스 명과 범위 지정연산자(::)를 추가로 적어야한다.
using namespace whatever;
하지만, using을 이용하면 네임스페이스와 범위지정연산자 없이 함수 호출이 가능해진다.
그래서 using namespace std;
를 통해
<iostream.h>안에 std
라고 정의된 namespace
를 사용함으로 std::cout
으로 쓸 것을 cout
으로만 사용해지는 것이 가능해진다.
왜 사용하는가?
코드 중 클래스 이름이나 함수의 이름이 같을 경우 등, 선언이 겹친는 것을 방지하여 함수 호출 시 문제가 생기지 않도록 한다.
똑같이 Add라는 이름의 함수가 협업에서 사용된다면 충돌이 잦을 수 있으므로 namespace를 이용하여 구분짓는다.
프로젝트하면서 내 함수는 내 라이브러리를 만들어놓고 호출시키는데 헤더의 하위호환 같이 느꼈다. 일반적으로 헤더파일 내에서 정의되고 언제 새로운 이름을 추가할 수 있도록 개방되어 있다고 한다.
꼭 선언을 해야하는가?
아니다. 선언은 필수적인 존재가 아닌 며, std::cout
과 같이 namespace
+ ::(범위 지정 연산자)
로 사용하여 동작시킬 수 있다.
📚 참고한 서적 및 사이트
'공부 > C\C++' 카테고리의 다른 글
[C/C++] char *와 char []의 차이와 bus error (0) | 2021.03.31 |
---|---|
[C] 가변인자, 가변인자 함수 (0) | 2021.03.18 |
[C/C++] int와 long, unsigned int와 unsigned long의 차이와 혼동으로 인한 문제점 (0) | 2021.03.18 |
[C/C++] 구조체와 연결리스트 (0) | 2021.03.16 |
[C/C++] cin과 scanf의 차이 (0) | 2021.03.06 |