namespace는 학급과 비슷하다고 생각 하면 됩니다.
예를 들어 학교 동급생들 중에 자신과 같은 이름을 가진 사람이 몇몇있을 때. 헷갈리지 마라고 '몇반 누구가' 라는 식으로 구분 할 수 있도록 이름 앞에 반을 붙여 말하는 것처럼, namespace도 같은 맥락에서 나온 기능 입니다.
namespace의 역할?
쉽게말해, 코딩을 할 때 같은 이름의 함수나 변수를 한 곳에 선언을 하지 못하는데 namespace안에 (묶어)선언해서 바깥쪽과 구분되도록 하는 기능입니다. 일단 namespace에 선언하는 것을 해봅시다.
#include <iostream>
namespace A{
void fnc(){
std::cout<<"A의 fnc()가 호출되었습니다."<<std::endl;
}
}
int main(){
return 0;
}
선언시 주의할 점은 main함수 안에는 namespace가 만들어지지 않는다는 것을 주의합시다.
위와 같이 namespace 이름{함수, 변수 등등 선언}을 틀로 사용합니다.
그럼 A안에 fnc()를 어떻게 호출하는지 확인해 봅시다.
main부분을 아래와 같이 채운 후, 실행 시켜 봅시다.
int main() {
A::fnc();
return 0;
}
정상적으로 A안의 fnc()함수가 호출이 된 것을 확인할 수 있습니다.
선언한 namespace의 멤버에 접근 할 때, ::(접근연산자)를 사용하여 접근합니다. 이로써 같은이름의 함수도 namespace를 이용하여 사용할 수 있게 됩니다.
namespace는 여러명이 코딩을 하여 서로의 소스를 이용할 때 서로 함수명을 겹쳐 코딩을 했을 경우에 유용하게 사용됩니다.
namespace는 using이라는 지시문을 사용하여 편하게 사용할 수 있습니다.
매번 namespace안의 함수에 접근할 때 접근지정자(::)를 사용하는 것이 번거러울 경우, using을 사용합니다.
#include <iostream>
namespace A {
void fnc() {
std::cout << "A의 fnc()가 호출되었습니다." << std::endl;
}
}
using namespace A;
int main() {
fnc();
return 0;
}
using 지시문은 무조건 사용하고자하는 namespace가 위에 선언 되어있어야 하므로(위에서 아래로 컴파일 하니까) namespace선언부 아래에 사용하며 main밖에 씁니다.
using 지시문에 의해 namespace A를 접근연산자 없이 A안의 함수를 호출 할 수 있게 됩니다.
안 그래도 전 포스트에 입출력 할 때 std::cout, std::cin을 이용 할 때 마다 접근연산자를 사용해서 많이 귀찮고 불편했을 겁니다.
iostream안의 입출력 함수들은 모두 namespace std로 묶여 있습니다. 그러면 우리는 앞으로 코딩을 하기전에 iostream을 사용 한다면
#include <iostream>
using namespace std;
int main(){
}
이렇게 치고 하면 편하게 코딩을 할 수 있겠죠?
정리.
- namespace는 같은 이름의 함수, 변수 등등을 구분하여 사용하기 위해 나온 기능.
- namespace선언
- namespace 이름 {
함수, 변수 등등 선언
} - 선언은 main함수 밖에 가능.
- namespace 이름 {
- main함수에서 호출.
- namespace 이름::함수(변수 등등).
- using 지시문
- 많이 사용하는 namespace를 접근연산자없이 안에 편하게 접근하도록 하는 기능.
- using namespace 이름;
- using지시문 사용시 위쪽에 using 지시문에 포함되는 namespace가 선언 되어있어야 한다.
+ iostream안의 입출력 함수들은 namespace std 안에 묶여있으니 using namespace std;를 애용하자!
'코딩 > C++' 카테고리의 다른 글
디폴트(default) 매개변수 [c++] (0) | 2018.03.06 |
---|---|
함수의 오버로딩 [c++] (0) | 2018.03.05 |
입출력을 해보자! [c++] (0) | 2018.03.03 |