본문 바로가기

개발공부/C++

Namespace

#include <iostream>

int main() {
  std::cout << "Hello, World!!" << std::endl;
  return 0;
}

:: 은 '(네임스페이스의 이름) :: (함수이름)' 이라는 뜻이다.

쉽게 설명하면 서울 사는 철수와 부산 사는 철수는 다른 사람이다.

그래서 같은 철수를 부르지 않도록 미리 어디사는 철수 인지를 적어주는것이다.

// header1.h 의 내용
namespace header1 {
int foo();
void bar();
}
// header2.h 의 내용
namespace header2 {
int foo();
void bar();
}

위와 같이 작성하고 헤더파일로 저장하면 다른 곳에서도 namespace를 사용할 수 있다.

#include "header1.h"

namespace header1 {
int func() {
  foo();  // 알아서 header1::foo() 가 실행된다.
}
}  // namespace header1
#include "header1.h"
#include "header2.h"

int func() {
  header1::foo();  // header1 이란 이름 공간에 있는 foo 를 호출
}
#include "header1.h"
#include "header2.h"

namespace header1 {
int func() {
  foo();           // 알아서 header1::foo() 가 실행된다.
  header2::foo();  // header2::foo() 가 실행된다.
}
}  // namespace header1

이렇게 사용하다보면 코드가 길어지니까 귀찮아진다. 그래서 using이라는 키워드를 써준다.

#include "header1.h"
#include "header2.h"

using namespace header1;
int main() {
  foo();  // header1 에 있는 함수를 호출
  bar();  // header1 에 있는 함수를 호출
}

다른 네임스페이스안에서도 명시적으로 선언만해주면 사용이 가능하다.

#include "header1.h"
#include "header2.h"

using namespace header1;
int main() {
  header2::foo();  // header2 에 있는 함수를 호출
  foo();           // header1 에 있는 함수를 호출
}

그래서 위 예제에서도 쓰기가 귀찮으면 아래와 같이 바꿀 수 있다.

#include <iostream>

using namespace std;
int main() {
  cout << "Hello, World!!" << endl;
  return 0;
}

하지만 using 키워드를 적어놓고 그 안에 또 같은 이름을 가진 철수(함수)가 있으면 곤란해지므로 명시적인 것을 권장한다.

'개발공부 > C++' 카테고리의 다른 글

포인터 복습  (0) 2019.10.10
상수에 대한 참조자  (0) 2019.10.10
래퍼런스의 도입  (0) 2019.10.10
std::cin  (0) 2019.10.10
c++공부를 시작합니다.  (0) 2019.10.10