Xeno's Study Blog (http://XenoStudy.tistory.com)
- 글쓴이 : xeno
- 출처 : 여기저기..
- 기타사항 : 틀린사항은 댓글로 달아주세여~
namespace
void function(void) {
std::cout<<"A.COM에서 정의한 함수"<<std::endl;
}
void function(void) {
std::cout<<"B.COM에서 정의한 함수"<<std::endl;
}
int main(void) {
function();
return 0;
}
A.com이라는 회사에서 정의한 함수가 첫번째에 정의되어 있고, B.com이라는 회사에서 정의한 함수가 두번째로 정의되어 있다. 문제는 함수의 이름이 같다는 것이다. 따라서 컴파일시 문제를 일으킬 것이다. 둘다 필요한 기능의 함수라서 어느 것 하나를 뺄 수 없는 상황이라고 가정한다.
다음 예제에서는 이름공간을 정의해서 문제를 해결하고 있다.
namespace A_COM {
void function(void) {
std::cout<<"A.COM에서 정의한 함수"<<std::endl;
}
}
namespace B_COM {
void function(void) {
std::cout<<"B.COM에서 정의한 함수"<<std::endl;
}
}
int main(void) {
A_COM::function();
B_COM::function();
return 0;
}
위의 예제에서는 namespace라는 키워드가 등장한다. 이는 이름공간을 구성하겠다는 의미다. 즉 "namespace A_COM"이라는 선언은 A_COM이라는 이름의 공간을 구성하겠다는 의미가 되며, 이름공간의 범위는 이어서 등장하는 중괄호를 통해서 지정된다. 조금 더 쉽게 이야기를 하면, "특정영역(공간)의 범위를 지정하고 이름을 붙여준 것"이다.
이 예제에서는 두 개의 이름공간이 등장한다. 첫번째 이름공간은 A_COM이며, 두번째 이름공간은 B_COM이다. 이름공간의 내부에는 같은 이름의 함수가 정의되어 있다. 그러나 문제되지 않는다. 왜냐하면 이름공간이 다르면 같은 이름의 변수나 함수의 선언이 허용되기 때문이다.
한 가지 주의할 것은 이름공간 내에 선언되어 있는 변수나 함수에 접근하는 방법이다.
A_COM :: function();
위 그림에서 ::연산자를 가리켜 "범위지정 연산자scope resolution operator"라 한다. 즉 이름공간의 범위를 지정할 때 사용하는 것이다. 따라서 위의 선언은 다음과 같은 의미를 지니게 된다.
"A_COM이라는 이름공간 안에 선언되어 있는 function함수를 호출한다."
이렇듯 이름공간 안에 선언되어 있는 변수나 함수에 접근하기 위해서는 범위지정 연산자를 사용해서 선언되어 있는 이름공간을 지정해 줘야 한다.
이번에 소개하는 예제는 앞의 예제와 같은 예제이다. 다만 함수의 선언과 정의를 분리시키는 방법을 보여줄 뿐이다.
namespace A_COM {
void function(void);
}
namespace B_COM {
void function(void);
}
int main(void) {
A_COM::function();
B_COM::function();
return 0;
}
namespace A_COM {
void function(void) {
std::cout<<"A.COM에서 정의한 함수"<<std::endl;
}
}
namespace B_COM {
void function(void) {
std::cout<<"B.COM에서 정의한 함수"<<std::endl;
}
}
이처럼 함수의 선언과 정의를 분리하고자 하는 경우에는 같은 이름공간을 선언하고 그 내부에 선언 및 정의해야 한다. 위의 예제에서는 하나의 이름공간 안에 하나의 선언 및 정의만을 담고 있지만 실제로는 둘 이상의 선언 및 정의를 담을 수 있고 또 그것이 일반적이다.
std::cout, std::cin, std::endl
지금까지 입력 및 출력을 하고자 하는 경우에는 std::cout과 std::cin을 사용해왔다. std::cout은 무슨 의미인가? std라는 이름공간 안에 존재하는 cout을 참조하겠다는 의미이다.
즉 헤더파일 iostream에 선언되어 있는 cout, cin 그리고 endl은 std라는 이름공간 안에 선언되어 있다는 결론을 내릴 수 있다. 그래서 cout이나 cin을 참조할 때 "std::"라는 선언을 앞에다 붙여주는 것이다. 이름충돌을 막기 위해서 c++표준에서 제공하는 다양한 함수나 변수들을 이름공간 std안에 선언 및 정의했기 때문이다.
'Program > C & C++' 카테고리의 다른 글
Open CV (0) | 2011.04.11 |
---|---|
c++콘솔 시계 (0) | 2011.03.28 |
c / c++로 문자열 스택(다중포인터) (0) | 2011.03.28 |
C++ / 기본문법 / using (0) | 2010.09.09 |
파일입출력 / printf 에서 자릿수 맞춰서 출력하기 (0) | 2010.09.09 |