어떤 정의된 객체에 대해 어디소속인지 지정해주는것.
코드의 크기가 늘어남에 따라 중복된 이름을 가진 함수들이 많아졌고 이를 구분할 필요성이 있어졌다
흔히쓰는 std::cout은 std라는 네임스페이스에 정의되어있는 cout을 의미한다.
헤더파일에 확장자가.h인 파일을 만들어서 이름공간을 정의할 수도 있다.
예시
// header1.h
namespace header1 {
int foo();
void bar();
}
// header2.h
namespace header2 {
int foo();
void bar();
}
함수 foo와 bar를 정의 해보겠다.
둘다 '소스 파일' 디렉토리에 cpp 파일을 만들어줬다.
// header1.cpp
#include "header1.h"
#include <iostream>
int header1::foo() {
std::cout << "foo1" << std::endl;
return 0;
}
void header1::bar() {
std::cout << "bar1" << std::endl;
}
// header2.h
namespace header2 {
int foo();
void bar();
}
// header2.cpp
#include "header2.h"
#include <iostream>
int header2::foo() {
std::cout << "foo2" << std::endl;
return 0;
}
void header2::bar() {
std::cout << "bar2" << std::endl;
}
그리고 대망의 메인함수
#include "header1.h"
#include "header2.h"
int main() {
header1::foo();
header1::bar();
header2::foo();
header2::bar();
return 0;
}
출력결과는 다음과 같다.
using namespace를 사용하면 이렇게도 가능하다.
#include "header1.h"
using namespace header1;
int main() {
foo();
bar();
return 0;
}
출력결과
예상대로 bar()와 foo()는 header1이라는 이름의 네임스페이스에서 함수를 가져온다
[결론]
그동안 원리를 잘 모르고 cpp 파일 맨위에 적던
#include <iostream>이 무엇인지,
편한 표준입출력을 위해 적어왔던 using namespace std,
그리고 std::cout , std:cin 등이 왜 이러한식으로 쓰이는지
어떠한 원리로 헤더파일을 불러오고 이름공간을 사용하는것인지 알게 되었다,
참고로 using namespace std;과같이 어떠한 이름공간을 사용하겠다고 선언하는것은 권장되는 방법은 아니라고 한다.
그 이유는 c++ 표준라이브러리가 매우 거대하므로 std에 이름이 겹치는 함수를 만들게 되면 오류가 발생할 수 있고,
이 오류는 잡기 어렵다고 한다. 그리고 c++ 버전이 바뀔때마다 std에 새로운 함수들이 추가되고 있기 때문이라고 한다.
그래서 권장되는 방식은 std::cout 처럼 이름공간을 명시하는 방법이다.
다음에는 표준라이브러리가 뭔지 정확히 알아봐야겠다.
'언어 > C++' 카테고리의 다른 글
[C++] 범위 기반 for 루프문 (0) | 2024.01.14 |
---|---|
[C++] STL : map (0) | 2024.01.14 |
[C++] const의 위치에 따른 포인터의 의미 (0) | 2023.12.10 |
[C/C++] 메모리 동적할당 (0) | 2023.12.10 |