반응형

 

네임스페이스(namespace)를 알아보자!

 

네임스페이스를 모르더라도 C++ 공부를 하면서 이미 알고 사용하고 있어

std::cout 다들 많이 써봤지? 

 

            std                                 ::                                   cout

 (네임스페이스 이름) (스코프 연산자) (사용할 변수 또는 함수등)  

 

이러한 구조로 이루어 져있어서 스코프 연산자를 사용해 접근하여 사용해

 

그래서 이게 왜필요한데;;

 

 

그건 우리가 팀프로젝트나 다른 라이브러리를 추가할때 이름이 겹칠 확률이 늘어나

이러한 이름 충돌 문제를 네임스페이스로 해결할수 있는거지!

 

네임스페이스 안에는 여러가지를 선언하여 사용할수 있지.

사용 하는걸 한번보자!

 

<기본 예시+class>

 namespace TestCode { //선언

	 int testint; //변수
	 
     void testFunc() {//함수
		printf("My Namespace");
	 }
     
	class NamespaceClass//클래스
    {
    public:
    	void static classfunc() {}
 	};
	
 }
 
  namespace TestFunc { 
  	void testFunc(){}
  }
 
int main()
{
	TestCode::NamespaceClass::classfunc();
	TestCode::testint = 1;
    
     TestCode::testFunc();
     TestFunc::testFunc();

}

처럼 사용할수 있지!

 

 

 

과연 네임 스페이스 안에 네임스페이스를 선언하여 사용할수 있을까?

 

<중첩 네임스페이스>

 namespace TestCode {
	 namespace Names {
		 int b;
	 }
 }

int main()
{
	TestCode::Names::b = 0;
	std::cout << TestCode::Names::b;
}

이처럼 사용할수 있지

 

네임스페이스를 쓸때 전부 std:: 처럼 사용하기 싫지?

그럴때 맨위에 using namespace <이름> 을 사용하면 앞에 붙이지 않아도 사용할수 있지

<using>

 namespace TestCode {
	 namespace Names {
		 int b;
	 }
 }

int main()
{
	using namespace TestCode::Names;
	b = 0;
 }

 

 

그리고 이건 조금 중요해

 

 

<네임스페이스 함수 구현>

namespace TestCode {
	 void TestFunc();
 }
 
 using namespace TestCode;
 void TestCode::TestFunc() { printf("a"); };
int main()
{
	TestFunc();
}

함수를 구현할때는 using을 써도 네임스페이스 이름을 붙여서 사용해야해 

 

 

그리고 우리가 사용하는 전역변수와 함수는 암시적으로 전역 네임스페이스에 추가되지

전역 네임스페이스를 한정할때는 :: (함수이름) 처럼 이름없이 사용하면 구분해줄수 있지!

 

<전역 네임스페이스 코드>

int a =10; 
 
int main()
{
int a =0;

  ::a //전역변수
  a //지역변수

}

이렇게 말이야

::a 를 출력하면 10 이 나오고 a 를출력하면 0이 나오는 거야!

 

 

 

 

 

'언어 > C++' 카테고리의 다른 글

c++ std::function 사용하기  (0) 2023.01.10
함수 포인터! (Function Pointer)!  (0) 2021.07.13
인라인 함수(Inline Function)  (0) 2021.06.15
bit연산! 또는 bit Flag  (0) 2021.05.05
call by reference/call by value/call by address  (0) 2021.05.03

+ Recent posts