ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네임스페이스
    C++ 2021. 12. 21. 16:34

     


    1. 네임스페이스 사용방법

    #include <iostream>
    
    using namespace std;
    
    int n;
    void set() {
    ::n = 10; //명시적 전역변수 표현방법
    }
    
    namespace doodle {
    	int n;
    	void set() {
    		doodle::n = 20;
    	}
    }
    
    namespace google {
    	int n;
    	void set() {
    		google::n = 30;
    	}
    }
    
    int main()
    {
    	::set();
    	doodle::set();
    	google::set();
    
    	cout << "::n : " << ::n << endl;
    	cout << "doodle::n : " << doodle::n << endl;
    	cout << "google::n : " << google::n << endl;
    }

    네임스페이스는 같은 변수명을 구분할 수 있게 해준다.

    '네임스페이스명::변수명or함수명' 형식으로 쓰인다.



    2. 네임스페이스 안에서 네임스페이스명:: 을 생략한 경우

    #include <iostream>
    using namespace std;
    
    int n;
    void set() {
    	n = 10;
    }
    
    namespace doodle {
    	int n;
    	void set() {
    		n = 20;
    	}
    }
    
    namespace google {
    	int n;
    	void set() {
    		n = 30;
    	}
    }
    
    int main()
    {
    	::set();
    	doodle::set();
    	google::set();
    
    	cout << "::n : " << ::n << endl;
    	cout << "doodle::n : " << doodle::n << endl;
    	cout << "google::n : " << google::n << endl;
    }

    네임스페이스 안에서 네임스페이스 키워드를 생략하고 변수를 사용한다면 그 네임스페이스에 해당하는 지역변수로써 작용한다.

    한마디로, doodle안의 n에 doodle::을 생략하여도 doodle::n으로 작용한다는 의미.


     


     

     

    3. 네임스페이스 재정의

    #include <iostream>
    
    using namespace std;
    
    int n;
    void set();
    
    namespace doodle {
    
    	int n;
    	void set();
    
    }
    
    namespace google {
    	int n;
    	void set();
    }
    
    int main()
    {
    	::set();
    	doodle::set();
    	google::set();
    
    	cout << "::n : " << ::n << endl;
    	cout << "doodle::n : " << doodle::n << endl;
    	cout << "google::n : " << google::n << endl;
    }
    
    void set()
    {
    	n = 10;
    }
    
    namespace doodle
    {
    	void set()
    	{
    		n = 20;
    	}
    }
    
    namespace google
    {
    	void set()
    	{
    		n = 30;
    	}
    }

     


    C언어에서 위에서 함수를 선언하고 밑에서 함수를 정의하였듯이 네임스페이스도 위에 선언만하고 밑에서 재정의가 가능하다.

     

    void ::set() {
    	n = 10;
    }
    
    void doodle::set() {
    	n = 20;
    }
    
    void google::set() {
    	n = 30;
    }

     

     

    재정의 할 때 위와 같이 간단하게 표현할 수도 있다.


     

     

     


     

    4.네임스페이스 중첩

    #include <iostream>
    using namespace std;
    
    int n;
    void set() {
    	n = 10;
    }
    
    namespace doodle
    {
    	int n;
    	void set() {
    		n = 20;
    	}
    	namespace google {
    
    		int n;
    		void set() {
    			n = 30;
    		}
    	}
    }
    
    int main()
    {
    	::set();
    	doodle::set();
    	doodle::google::set();
    
    	cout << ::n << endl;
    	cout << doodle::n << endl;
    	cout << doodle::google::n << endl;
    }

     


    네임스페이스도 for문 처럼 중첩으로 사용할 수 있다.

     


     

    5. 네임스페이스 안에 찾으려는 변수가 없을 경우

    #include <iostream>
    using namespace std;
    
    namespace doodle
    {
    	int n;
    	void set() {
    		n = 20;
    	}
    
    	namespace google {
    		// int n;
    		void set() {
    			n = 30;
    		}
    	}
    }
    
    int main()
    {
    	doodle::google::set();
    	cout << doodle::n << endl;
    }

     


    만약에 google::n이 존재하지 않는다면 상위 네임스페이스에서 n을 찾게된다.

    그리고 상위 네임스페이스에도 없으면 전역변수 n을 찾게된다.

    출력결과


    6. using

    #include <iostream>
    
    int n;
    void set() {
    	n = 10;
    }
    
    namespace doodle
    {
    	int n;
    	void set() {
    		n = 20;
    	}
    
    	namespace google {
    		int n;
    		void set() {
    			n = 30;
    		}
    	}
    }
    
    int main()
    {
    	using namespace std; // main 함수에 선언하면 main함수 안에서만 작동한다.
    	using namespace doodle;
    
    	::set();
    	doodle::set(); // set()함수가 구분이 안되기 때문에 doodle::생략 불가능
    	google::set(); // doodle::을 생략해줘도 구분이 가능하기 때문에 생략가능
    
    	cout << ::n << endl;
    	cout << doodle::n << endl;
    	cout << google::n << endl;
    }

     

    'C++' 카테고리의 다른 글

    this 포인터  (0) 2021.12.21
    클래스 = 구조체??, 접근제어지시자  (0) 2021.12.21
    7부(C++ 스타일 프로그래밍) 종합문제  (0) 2021.12.21
    C++ 스타일 함수  (0) 2021.12.21
    C++ 스타일 기본 문법  (0) 2021.12.21
Designed by Tistory.