프로그래밍을 하다보면 자주 쓰는 변수, 함수명이 있고 다른 사람들과 협업하다보면
이름이 겹치는 경우가 발생한다.
서로간 이름을 뭘로 할지 매번 합의할 수도 없는 노릇이기 때문에
이름이 같아도 아무런 문제가 발생하지 않도록 사용하는 것이 바로 namespace이다.
#include <iostream>
namespace BestComImpl
{
void SimpleFunc(void);
}
namespace ProgComImpl
{
void SimpleFunc(void);
}
int main()
{
BestComImpl::SimpleFunc();
ProgComImpl::SimpleFunc();
return 0;
}
void BestComImpl::SimpleFunc(void)
{
std::cout << "BestCom에서 정의한 함수" << std::endl;
}
void ProgComImpl::SimpleFunc(void)
{
std::cout << "ProgCom에서 정의한 함수" << std::endl;
}
BestComImpl과 ProgComImpl 총 두 개의 namespace가 있고 여기에는 이름과 파라미터가 같은 함수 2개가 있다.
namespace안에는 해당 함수가 선언만 되어 있을 뿐, 정의는 아랫줄에 위치한 것을 볼 수 있다.
보시다시피 두 함수는 이름과 파라미터가 동일하다.
때문에 완전히 같은 함수처럼 보인다.
그러나 범위연산자인 :: 의 왼쪽을 보면 네임스페이스가 다르게 되어 있는 것을 알 수 있다.
여기서 네임스페이스의 용도가 명확해진다.
변수나 함수 등을 하나로 묶어줌으로써, 변수명이나 함수명이 겹칠 리스크를 크게 줄여준다.
그럼 네임스페이스의 이름이 겹칠 수도 있지 않은가? 라고 생각할 수 있다.
그러나 네임스페이스는 그 안에 또 다른 네임스페이스를 품을 수 있다.
#include <iostream>
namespace AAA
{
int num = 2;
namespace BBB
{
int num = 3;
}
namespace CCC
{
int num = 4;
}
}
int main()
{
std::cout << AAA::num << std::endl;
std::cout << AAA::BBB::num << std::endl;
std::cout << AAA::CCC::num << std::endl;
return 0;
}
AAA안에 각각 BBB, CCC 네임스페이스가 존재하고 그 안에는 전부 num 이라는 이름을 가진 변수가 선언되었다.
그러나 main함수에서 출력할 때, 참조하는 네임스페이가 다르기 때문에 같은 이름의 변수를 가져와도, C++은 그것들을 ㅁ두 구분해 낸다.
때문에 네임스페이스만 잘 구성해놓아도 변수명이 겹치는 사례를 피할 수 있다.
2. 범위연산자 ::
여기까지 읽었으면 ::의 역할이 무엇인지 알았을 것이다.
그렇다면 로그를 표현할 때 쓰는 문법을 보자
std::cout를 사용하지 않는가?
이제 우린 이것이 어떤 표현인지 알게 되었다.
즉, std라는 네임스페이스 안의 cout를 실행하라는 의미이다.
즉, 우린 한 번도 본적없고 보이지 않지만, C++에서는 기본적으로 적용되어 있는 네임스페이스들이 있고
std는 그 네임스페이스들중 하나이며, std 안의 cout는 로그를 출력하는 함수라는 사실을 알 수 있다.
그렇다면 <<는 무엇일까?
이 또한 추후에 다루어 보도록 하겠다.
범위연산자 ::
'Language > C++' 카테고리의 다른 글
C++ 공부정리 - using (0) | 2023.03.22 |
---|---|
C++ 공부정리 - 오버로딩과 기본 값 (0) | 2023.03.22 |
C++ 공부정리 - 시작 (0) | 2023.03.21 |