네임스페이스

식별자가 정의되는 공간을 말합니다.

 - 식별자는 변수, 함수, 구조체, 클래스, 공용체, 열거체 등의 이름을 이야기합니다.

네임스페이스를 이용하면 같은 이름의 식별자를 여러번 정의하고 구분해서 사용할 수 있습니다.



네임스페이스의 필요성

간단한 프로그램이 아닌 상용 프로그램을 개발하기 위해서는 여러 개발자들이 모여서 공동으로 작업을 하게 되는데 같은 모듈 내에서 사용되는 변수, 함수, 구조체 등의 식별자를 정의하다 보면 이름이 겹치는 경우가 종종 발생하게 됩니다.

이런 문제점들을 해결하기 위해 프로그램에서 사용되는 식별자를 구조적으로 관리할 수 있는 방법을 제공하는 것이 바로 네임스페이스입니다.



네임스페이스의 정의

네임스페이스를 정의하는 것은 간단합니다.


namespace 네임스페이스 이름 {

  변수 정의.....

  함수 정의.....

  ......

}






네임스페이스의 사용

위의 예제에서는 변수 a와 함수 Run()을 인식하지 못해 컴파일러가 에러를 일으킵니다.

그럼 네임스페이스를 사용해보도록 하겠습니다.

네임스페이스 안에 정의된 식별자를 사용할 때에는 네임스페이스 이름과 함께 사용해야 합니다.

 - 네임스페이스::식별자 의 형식으로 사용됩니다.


이때 사용되는 :: 연산자를 영역 지정 연산자라고 합니다. :: 연산자는 '~에 속해있는' 이라는 의미로 보시면 되겠습니다.



nSpace로 선언된 네임스페이스를 nSpace::a, nSpace::Run() 으로 호출한 것을 보실 수 있습니다.



using 문

매번 네임스페이스를 지정하기 불편할 수 있습니다. 이런 불편함을 해소하기 위한 방법입니다.

using 네임스페이스 이름::식별자

라고 적어주시면 네임스페이스에 정의된 특정 식별자에 대해서만 네임스페이스 이름을 생략할 수 있게 됩니다.






:: 연산자로 전역 범위에 접근하기

네임스페이스 안에 정의된 식별자를 using 문을 이용해 네임스페이스를 생략하고 사용하는 경우에 같은 이름을 갖는 전역 범위의 식별자가 있으면 어떻게 될까요?

이 경우에도 네임스페이스를 생략하지 말고 명시적으로 밝혀주어야 합니다.

전역범위로 접근하려면 네임스페이스에 이름 없이 :: 연산자를 지정하고 변수 이름이나 함수 이름을 사용합니다.



::a : 전역 변수 a의 10을 출력

a : 지역 변수 a의 20을 출력

nSpace::a : 네임스페이스 nSpace의 변수 a의 30을 출력



네임스페이스의 범위

네임스페이스와 소스 파일과의 관계는 서로 독립적입니다.

여러 소스 파일에 걸쳐서 네임스페이스를 정의하는 일이 가능합니다. 이 때에는 네임스페이스의 이름을 당연히 같게 해야겠죠?

 - 네임스페이스를 다시 정의하는 것은 재정의가 아니라 확장하는 것입니다.

 - 컴파일러가 같은 이름의 네임스페이스를 알아서 합쳐줍니다.


nSpace,h


선언부 입니다.

변수는 네임스페이스 안에 전역 변수의 extern 선언이 필요합니다.

 - 그렇지 않으면 다른 곳에서 참조가 안되는 상황이 생길 수 있습니다.

 - 여러 소스 파일에서 전역 변수를 공유해서 사용하려면 전역변수를 프로그램 전체에서 한 번만 정의해야 합니다.

 - 분할 컴파일을 이용해 프로젝트를 구현할 때 보통 다른 소스파일과 공유할 정보를 헤더파일에 넣고 소스 파일에서 헤더파일을 포함해서 사용하는데, 전역 변수의 정의를 헤더파일에 넣으면 헤더파일을 포함하는 소스 파일마다 전역 변수가 재정의되는 문제가 발생할 수 있습니다.

 - 요래서 extern을 선언해야 겹치지 않습니다.

 - 전역변수의 정의는 프로그램 전체에서 단 하나의 소스파일에 작성하고 여러 소스 파일에서 전역 변수를 참조해서 사용할 수 있도록 헤더 파일에 전역변수의 extern 선언을 넣어줍니다. (정의는 하지 않습니다.)

 - 전역 변수의 extern 선언은 데이터 형이나 이름 같은 전역 변수에 대한 정보를 제공할 뿐 실제로 메모리를 할당하지는 않습니다.


nSpace.cpp


정의부 입니다.

네임스페이스 안에서 선언한 함수는 소스 파일에서 정의해야 합니다.

extern 선언한 전역변수도 소스파일에서 정의합니다.


main.cpp



네임스페이스의 헤더파일을 include 해주고 사용하시면 됩니다.

통상 네임스페이스이름::식별자 의 형태로 사용되어야 하지만

네임스페이스 이름을 생략하고 싶으시면 using namespace 문을 이용해 사용할 네임스페이스를 선언합니다.

 - 현재 예제에서는 using 선언을 했기 때문에 변수 a와 Run함수의 네임스페이스 선언이 생략된 것을 볼 수 있습니다.

'Programming Language > C/C++' 카테고리의 다른 글

C++ 템플릿  (0) 2014.10.10
C 헤더파일 중복검사  (0) 2014.10.10
C++ 인라인 함수  (0) 2014.10.10
C 배열과 포인터  (0) 2014.10.10
C 포인터  (0) 2014.10.10
Posted by 긍정왕오킹