Develop/C++
[C ++] Namespace 와 using
J-rain
2023. 2. 2. 20:17
namespace
네임스페이스는 C++가 지원하는 각종 요소들(변수, 함수, 클래스 등)을 한 범주로 묶어주기 위한 문법이다.
namespace 이름
{
// 네임스페이스의 시작
.......
// 네임스페이스의 끝
}
#include <iostream>
namespace Test
{
int data = 100;
void TestFunc(void)
{
std::cout << "Test::TestFunc()" << std::endl;
}
}
int main(void)
{
Test::TestFunc();
std::cout << Test::data << std::endl;
return 0;
}
실행결과
- 네임스페이스가 존재할 경우 식별자 앞에 범위 지정 연산자(::)를 이용해 네임스페이스를 기술할 수 있다.
- TestFunc() 함수가 Test 네임스페이스 소속이듯 cout은 std라는 네임스페이스 소속이다. 참고로 main()함수는 '전역 네임스페이스(Global namespace)'에 속한다.
이렇듯 TestFunc(), cout, main() 등은 각자 속한 네임스페이스가 모두 다르다.
using
네임스페이스를 문법에 따라 생략해야 하는데, 이 때 사용하는 예약어가 using이다.
using namespace 네임스페이스이름;
#include <iostream>
// std 네임스페이스를 using 예약어로 선언
using namespace std;
namespace Test
{
int Data = 100;
void TestFunc(void)
{
// cout에 대해서 범위를 지정하지 않아도 상관없다.
cout << "Test::TestFunc()" << endl;
}
}
// Test 네임스페이스에 using 선언을 한다.
using namespace Test;
int main(void)
{
// TestFunc()나 data 에도 범위 지정을 할 필요가 없다.
TestFunc();
cout << Data << endl;
return 0;
}
실행결과
네임스페이스의 중첩
서울시 강남구 대치동 XXX로 XX길
이와 같은 주소를 네임스페이스로 표현하자면 다음과 같다.
서울시::강남구::대치동::XXX로::XX길
네임스페이스도 이렇다. 네임스페이스 안에 또 다른 네임스페이스가 속할 수 있다.
#include<iostream>
using namespace std;
namespace Test1
{
int Data = 100;
namespace Test2
{
int Data = 200;
namespace Test3
{
int Data = 300;
}
}
}
int main(void)
{
cout << Test1::Data << endl;
cout << Test1::Test2::Data << endl;
cout << Test1::Test2::Test3::Data << endl;
return 0;
}
실행결과
- 6,9,12번 행에 선언된 int Data 변수는 이름은 같아도 전혀 다른 세 개의 전역 변수이다.
- 따라서 접근할 때는 19~21번 행처럼 정확히 네임스페이스를 명시해야 한다.
ps. 식별자 앞에 별도로 범위 지정 연산자를 붙이지 않는다면 정해진 순서에 따라 다양한 범위를 대상으로 식별자 선언을 검색한다. 자세한내용 => https://j-ra1n.tistory.com/entry/%EC%8B%9D%EB%B3%84%EC%9E%90-%EA%B2%80%EC%83%89-%EC%88%9C%EC%84%9C