본문 바로가기

C++

[C++] namespace

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