"the only way to be truly satisfied is to do what you believe is great work."

[C++] 이름공간(Namespace)

어떤 정의된 객체에 대해 어디소속인지 지정해주는것.

코드의 크기가 늘어남에 따라 중복된 이름을 가진 함수들이 많아졌고 이를 구분할 필요성이 있어졌다

흔히쓰는 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