이중 반복문처럼 이름공간도 중첩이 가능하여 계층적으로 구성할 수 있다.
2행의 num은 Parent::num으로 표현이 되고
Parent 이름공간안의 num으로 읽을 수 있다.
4행의 num은 Parent::SubOne::num이 되고
Parent 이름공간안의 SubOne 이름공간안의 num으로 읽을 수 있다
8행의 num은 Parent::SubTwo::num이 되고
Parent 이름공간안의 SubTwo 이름공간안의 num으로 읽을 수 있다
여기까지 왔다면 앞에서 본 std::cout이나 std::cin, std::endl들도 유추가 가능하다
std::cout은 이름공간 std안에 선언된 cout
std::cin은 이름공간 std안의 cin
std::endl은 이름공간 std안의 endl로
모두 std라는 이름공간 안에 선언되어 있는것을 알 수 있다
따라서
namespace std{
cout
cin
endl
}
의 형태가 갖춰져 있을것을 유추 할 수 있다.
결과적으로
<iostream> 헤더파일에 선언되어있는 cout, cin 그리고 endl은 이름공간 std안에 선언되어있으며
C++ 표준에서 제공하는 다양한 요소들은 이름공간 std안에 선언되어 있다
using을 이용한 이름공간의 명시
이제 cout, cin 그리고 endl을 참조할 때마다 std::을 앞에 붙여야 하는 이유를 알게 되었다.
더불어 그 일이 여간 귀찮지 않다는 생각도 든다.
using선언은 추가적인 선언 하나만으로 이러한 불편을 해소하게 해준다.
14행의 using키워드로 인해
15행처럼 이제 HybFunc라는 함수를 선언할때 이름공간을 호출하지 않아도 사용할 수 있게 되었다.
즉, using은 using 이름공간::함수이름; 라는 선언은
그 이름공간에 정의된 함수를 호출할 때에는, 이름 공간을 지정하지 않고 호출하겠다라는 명시이자
그 이름공간 내에서 그 함수를 찾으라는 선언이다
이때, 범위지정 연산자 뒤에는 함수도 올 수 있고 변수도 올 수 있다.
이러한 using 키워드의 효력은 지역변수와 마찬가지로 선언된 이후부터 효력을 발휘하며,
선언된 지역을 벗어나면, 선언의 효력을 잃게 된다.
따라서 프로그램 전체영역에 효력을 미치게 하려면 전역변수와 마찬가지로 함수 밖에 선언 해줘야 한다.
이렇게 std::이라는 선언을 번거롭게 하나하나 해주지 않아도 된다.
만약, 위 처럼 일일이 using선언을 하는것이 귀찮거나, 꼭 그렇게 해야만 하는 상황이 아니라면
다음의 선언을 통해 '이름공간 std에 선언된 모든 것에 대해 이름공간 지정의 생략'을 명령할 수 있다.
using namespace std;
이는 이름공간 std에 선언된 모든 것에 접근할 때에는 이름공간의 지정을 생략하겠다는 선언이다.
그러나 이렇게 빈번한 using namespace의 선언은 이름의 충돌을 막기위한
이름공간의 선언을 의미 없게 만들 수 있다. 따라서 제한적으로 사용할 필요가 있다.
참조자 (0) | 2020.10.05 |
---|---|
이름공간의 별칭 지정과 전역변수의 접근 (0) | 2020.10.04 |
이름공간 기반의 함수 선언과 정의의 분리 (0) | 2020.10.04 |
이름공간(namespace) (0) | 2020.10.04 |
인라인(inline) 함수 (0) | 2020.10.04 |