namespace(이름공간) 이란?
이름 공간은 특정 영역에 이름을 붙여주는 문법적 요소이다.
따라서 같은 명칭을 가진 함수여도, 서로 다른 namespace에 존재하면 이름이 충돌되지 않는다.
* namespace 사용 이유 참고 : https://bourne.tistory.com/18
C++을 공부하게 되면 제일 처음 보게 되는 namespace가 있다.
"Hello World!" 를 출력했을 때 사용하는 'std'가 바로 namespace 명칭이다.
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }
프로젝트 외부 종속성 폴더의 iostream파일을 살펴보면
namespace std{ } 안에 cout, cin 등이 정의되어 있는 것을 볼 수 있다.
따라서 범위지정 연산자(scope resolution operator)인 '::'를 사용하여, std::cout (std 안에 있는 cout) 으로 cout을 사용한다.
하지만 매번 입출력때마다 std::를 붙이는 것이 번거로우므로, using 지시어를 사용하여 이를 생략할 수 있다.
using namespace std;를 사용하면 std 네임스페이스를 우선적으로 참조하게 되어 아래와 같이 간단하게 작성이 가능하다.
* using namespace를 선언하게 되면 작성하기에는 편리하지만,
이름 충돌이 발생할 확률은 높아지므로 상황에 따라 사용하도록 한다.
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
namespace 사용 예
#include <iostream> using namespace std; void Func() { cout << "ACom" << endl; } void Func() { cout << "BCom" << endl; } int main() { Func(); return 0; }
위와 같은 경우, 두 개의 Func() 함수는 명칭과 매개변수 형태가 모두 동일하기 때문에 오류가 발생한다.
하지만 서로 다른 namespace에 정의되어 있으면 충돌이 발생하지 않는다.
#include <iostream> using namespace std; namespace ACom { void Func() { cout << "ACom" << endl; } } namespace BCom { void Func() { cout << "BCom" << endl; } } int main() { ACom::Func(); BCom::Func(); return 0; }
사용할 때 어느 이름공간에 있는 함수인지, 범위지정 연산자로 가리키면 된다.
namespace 기반의 함수 선언과 정의 구분
namespace 기반에서 함수의 선언과 정의를 구분할 때는 아래와 같이 사용한다.
#include <iostream> using namespace std; namespace ACom { void Func(); } namespace BCom { void Func(); } int main() { ACom::Func(); BCom::Func(); return 0; } void ACom::Func() { cout << "ACom" << endl; } void BCom::Func() { cout << "BCom" << endl; }
'C++' 카테고리의 다른 글
[C++] 매개변수 디폴트 값 (0) | 2019.03.04 |
---|---|
[C++] 함수 오버로딩 (0) | 2019.03.04 |
[C++] 입력 (0) | 2019.02.28 |
[C++] Hello World! 출력 (0) | 2019.02.12 |
[C++] 프로젝트 생성 (0) | 2019.02.11 |