1.1.2 네임 스페이스
네임스페이스(namespace)는 코드 내에서 이름이 같은 변수명이나 함수명이 서로 충돌하는 문제를 해결하기 위해 고안되었다.
예를들어 foo() 함수를 만들어놓고, 나중에 외부 라이브러리를 사용해야만 하는 상황이 되어서 이용하려고 봤더니 외부 라이브러리에도 foo () 함수가 있는 것이다. 이런경우 컴파일러 입장에서 어느 foo() 함수를 사용해야 할 지 알아낼 방법이 없다.
그렇다고 라이브러리 함수명을 foo()에서 다른것으로 바꾸자니, 라이브러리에서 foo()참조부분을 모두 고쳐야 해서. 여간 까다로운것 이 아니다.
반대로 내가 작성한 foo()함수를 고치는것 또한 같은 문제에 빠지게 된다.
네임스페이스는 이런 문제상황을 쉽게 해결해준다.
특정 코드 영역에서 참조하는 이름을 어느 이름 집합에서 찾아야 하는지 범위를 제한하기 때문이다.
트겆ㅇ 함수를 특정 네임스페이스에 종속시키려면 다음과 같이 네임스페이스 블록으로 둘러쌓으면 된다.
namespace mycode {
void foo() {
std::cout << "foo() called in the mycode namespace" << std::endl;
}
}
foo() 함수를 mycode라는 네임스페이스에 둠으로, 다른 함수와 충돌하는 것 을 막을 수 있다.
호출할 때 에는 함수 이름앞에 네임스페이스와 :: 를 붙인다.
:: 를 스코프 설정 연산자 라고 한다.
'mycode' 네임스페이스 블록 안에 속한 코드에서는 명시적인 mycode:: 스코프 지정 없이 같은 네임스페이스 에 있는 코드를 불러다 쓸 수 있다.
이러한 암묵적인 네임스페이스 적용은 코드의 가독성을 높여준다.
using 지시자를 사용하면, 스코프 설정 연산자를 붙이지 않아도, 네임스페이스에 속한 이름을 불러다 사용할 수 있다.
#include "namespaces.h"
using namespace mycode;
int main()
{
foo();
return 0;
}
using 지시자를 여러개 선언하면 복수 네임스페이스를 한꺼번에 네임스페이스 지정 없이 사용할 수 있다.
그러나, 어느 이름이 어느 네임스페이스에 선언된 것 인지 알기가 힘들어서. 네임스페이스의 의미가 퇴색될 수 있다.
Hello,World예제 에서도 cout, endl은 네임스페이스 std에 이용된것 이기 때문에, using을 사용하면 개별 스코프 설정 연산자를 통해 std::를 붙이지 않아도 사용할 수 있다.
using지시자는, 일부 항목만 특정해서 지정할 수 도 있다.
using std::cout;
cout << "Hello, World!" << std::endl;
위와같이 이용된다.
'전문가를 위한 C++정리' 카테고리의 다른 글
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.6 데이터 타입 (0) | 2024.01.04 |
---|---|
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.5 연산자 (0) | 2024.01.04 |
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.4 리터럴 (0) | 2024.01.04 |
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.3 변수 (0) | 2024.01.03 |
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.1 C++ 맛보기 (0) | 2024.01.03 |