네임스페이스namespace란?
C++이 지원하는 각종 요소들(변수, 함수, 클래스 등)을 한 범주로 묶어주기 위한 문법
네임스페이스 형식
네임스페이스 블록 내부에 선언하는 변수나 함수들은 모두 명시한 namespace의 이름에 속하게된다.
namespace 이름
{
//네임스페이스 시작
변수
함수
...
//네임스페이스 끝
}
네임스페이스 선언 예제
아래 예제는 person 네임스페이스에 변수 age, name과 함수 printInfo가 속하게 되는 것이다.
namespace person{
int age = 20;
std::string name = "domin";
void printInfo(){
std::cout << age << "," << name << std::endl
}
}
네임스페이스에 소속되어있는 식별자 사용
사용하고 싶은 네임스페이스의 식별자 앞에 범위지정 연산자(::)를 이용해 네임스페이스를 기술한다. (person::식별자)
int _tmain(int argc, _TCHAR * argv[]){
person::printInfo(); //person 네임스페이스의 printInfo()함수를 호출한다는 의미
std::cout << person::age <<std::endl; //cout, endl도 std 네임스페이스의 식별자라는 것을 알 수 있다.
}
_tmain 함수는 소속되어있는 네임스페이스가 없나?
_tmain() 함수는 전역 네임스페이스에 속한다. 전역에는 네임스페이스를 지정하지 않는다.
네임스페이스 사용하면 좋은 점
- 코드의 소속을 나누면 규모가 큰 프로그램을 만들기 좋다.
- 코드에서 식별자에 붙이는 이름이 모든 코드에서 중복될 확률이 많은데 이런 경우 네임스페이스를 잘 활용한다면 이름이 겹치는 문제를 해결할 수 있다.
using 선언
- 네임스페이스에 속해있는 식별자들을 사용하기 위해 "네임스페이스명::" 을 항상 써줘야하는 번거로움을 없애준다.
- using 선언으로 네임스페이스를 생략해서 식별자를 사용하자.
using 사용법
using namespace 네임스페이스이름;
using 사용예제
using namespace std;
using namespace person;
//main
cout << "hello" << endl;
cout << printInfo() << endl;
네임스페이스에서 특정 식별자만 using 사용
using std::endl;
using std::cout;
//main
cout << "hello" << endl;
네임스페이스 중첩
네임스페이스 안에 또 다른 네임스페이스가 속할 수 있다.
- 식별자 앞에 별도로 범위 지정 연산자를 붙이지 않는다면 정해진 순서에 따라 식별자를 검색한다. (식별자 검색 순서는 정해져있다.)
using namespace std;
namespace TEST
{
int nData = 100;
namespace DEV
{
int nData = 200;
namespace WIN
{
int nData = 300;
}
}
}
//main
cout << TEST::nData << endl;
cout << TEST::DEV::nData << endl;
cout << TEST::DEV::WIN::nData << endl;
네임스페이스와 다중 정의
- 각각 다른 네임스페이스에 동일한 함수를 정의할 수 있다.
- 그러나 동일한 함수를 정의한 네임스페이스를 동시에 using 연산자를 사용할 수 는 없다. 같은 함수가 선언된 각각의 네임스페이스에 using 연산을 하고 네임스페이스 지정없이 함수를 호출하면 어떤 네임스페이스를 호출했는지 알수 없기 때문에 모호성이 발생한다. 이때는 오류가 발생한다. 따라서 네임스페이스를 지정해서 함수를 사용하여야한다.
void TestFunc(void){print('a')}
namespace TEST{
void TestFunc(){print('b')}
}
namespace MYDATA{
void TestFunc(){print('c')}
}
//using namespace TEST; //선언불가 (다른 네임스페이스와 중복되는 식별자 다중정의 때문)
//using namespace MYDATA; //선언불가(다른 네임스페이스와 중복되는 식별자 다중정의 때문)
int main(){
TestFunc(); //=>a //묵시적 전역
::TestFunc(); //=>a //명시적 전역
TEST::TestFunc(); //=>b
MYDATA::TestFunc(); //=>c
}
'◼️C++' 카테고리의 다른 글
[C++] 객체지향 프로그래밍 개요 (0) | 2023.09.17 |
---|---|
[C++] 식별자 검색 순서 (0) | 2023.09.07 |
[C++] 인라인 함수 (0) | 2023.09.05 |
[C++] 함수다중정의(오버로딩), 템플릿 함수 (0) | 2023.09.05 |
[C++] 디폴트 매개변수 (0) | 2023.09.05 |