네임스페이스는 컴파일러가 식별자(identifier - 변수, 함수 등)를 더 잘 구분하여 오류를 최소화하기 위한 기능이다. 이러한 기능은 대형 프로젝트를 구현하게 될 시 많은 사람들이 변수 또는 함수를 만들게 되는데 이때 충돌을 방지하기 위한 측면으로 자주 쓰인다.
우선 이를 알기 전에 선행 지식으로 지역변수와 전역변수에 대해서 알 필요가 있다.
#include <iostream>
int v = 0;
int main(void)
{
std::cout << v << std::endl;
int v = 1;
std::cout << v << std::endl;
{
int v = 2;
std::cout << v << std::endl;
{
int v = 3;
std::cout << v << std::endl;
}
}
std::cout << v << std::endl;
std::cout << ::v << std::endl;
return 0;
}
출력 결과
0
1
2
3
1
0
이를 보면 각 출력마다 결과가 다르게 나온다. 이는 즉, 컴파일러가 어떻게 지역을 구분했는지 알 수 있게 해준다.
'{}'는 지역을 나누는 것으로 해당 괄호 안에 변수가 선언되면 그 안에서만 효력을 가지게 된다. 맨 위의 전역으로 선언된 변수 v는 해당 페이지 에서 효력을 가지게 된다.
그리고 마지막의 ::v는 전역변수의 v를 의미한다. :: 연산자는 이름공간을 지정하기 위한 연산자로 이것이 없을 때는 현재의 지역에서 식별자(identifier)를 찾게 된다.
우리가 C++에서 출력할 때 사용하는 cout, cin 또한 std라는 네임스페이스에서 정의된 것을 알 수 있다.
우선 네임스페이스는 키워드를 사용해서 지정할 수 있고 이 안에 뭘 넣어도 '이름공간::'의 형식으로 꺼내올 수 있다.
'::' 연산자는 범위 지정 연산자(scope resolution operator)이라고 한다.
즉, 해당 이름 공간을 지정하는 역할을 하게 된다.
예를 들어 다음과 같다.
std::cout
그럼 어떻게 해서 네임스페이스를 만들 수 있을까?
#include <iostream>
namespace deulee {
int num = 3;
void Print(void)
{
std::cout << "print_deulee" << std::endl;
}
}
void Print(void)
{
std::cout << "just_print" << std::endl;
}
int main(void)
{
deulee::Print();
Print();
}
출력 결과
print_deulee
just_print
위와 같이 코드를 작성하게 되면 해당 namespace가 생성하게 되고 :: 연산자를 통해 해당 네임스페이스를 지정해서 함수를 호출할 수 있게 된다.
위와 같이 namespace를 생성하게 되면 커다란 프로젝트에서 내가 작성하고 있는 소스코드가 다른 사람이 작성하고 있는 소스코드와 충돌을 방지하기 위해서 만들어졌다고 생각하면 된다.
C++에서의 구조체 (0) | 2023.08.03 |
---|---|
new 연산자 (0) | 2023.08.03 |
C++의 새로운 입출력 - cout, endl, cin (0) | 2023.06.10 |
using 키워드 (0) | 2023.06.10 |
C++98 글을 시작하며 (0) | 2023.06.06 |