C++

namespace

Nin 2020. 12. 16. 12:14
class A
{
public:
   int Number;
};

class B
{
public:
   int Number;
};

변수의 이름 규칙에서 같은 이름의 변수명은 사용할 수 없다.

그치만 위의 코드에서 Number라는 같은 이름을 사용하는데

에러가 발생하지 않는다. 쉽게 설명하면 컴파일러는 

ANumber 와 BNumber 이런식으로 본다고 할 수 있다.

코드상으로 본다면

A::Number 와 B::Number 이렇게 해석된다.

:: 이것을 스페이스 구분이라고 한다

int main()
{
   ::printf_S("")
}

사실 printf_s도 풀네임은 위와 같다.쓰든 안쓰든 문법상 오류는 없다.

::A::Number

class A의 Number의 풀네임은 위와 같다. 

위의 코드들에서 가장 앞에 붙는 생략가능한 ::은 무엇을 의미하는걸까?

전역이라는 의미이다.말로 풀어보면

전역안에 선언되있는 A, A안에 선언되있는 Number 이렇게 된다. 

 

namespace MYSPACE
{
   class A
   {
   public:
      int Number;
   };
}

namespace의 기능은 단순하다.내가 하나의 공간을 만드는 기능이다.

::MYSPACE::A::Number

풀네임이 이렇게 변경된다.함수에도 적용된다.

이렇게 공간에 이름을 붙이고 나누는 이유는 무엇일까?

A프로그래머가 Player의 기능인 Damage라는 함수를 만들었다 가정하고

B프로그래머가 Monster의 기능인 Damage라는 함수를 만들었다고 가정하면

이름이 같다.만약 namespace로 공간을 나눴다면 이름충돌 문제를 해결해 준다.

 

using namespace

using namespace MYSPACE;

이렇게 코드를 추가하면 MYSPACE의 공간이름은 생략이 가능해진다.

A::Number 이렇게만 적어도 MYSPACE 안에 있는 A의 안에 있는 Number

이렇게 해석되는 것이다.

단점은 간단하다.

namespace TEST1
{
   void Func()
   {
   
   }
}

namespace TEST2
{
   void Func()
   {
   
   }
}

using namespace TEST1;
using namespace TEST2;

int main()
{
   Func();
}

이렇게 코드를 작성하면 Func 함수는 실행할 수 없다. 

TEST1에 있는 Func인지 TEST2에 있는 Func인지 알 수 없기 때문이다.