A sentimental robot

Namespace 본문

C++

Namespace

GOD03219 2018. 9. 12. 19:51

namespace는 논리적인 이름 공간을 만들어주는 방법으로 변수나 함수, 클래스 이름의 충돌을 방지하기 위해서 서로 다른 공간으로 캡슐화를 시켜준다.

 

예를 들면, 한 개의 소스파일 내에서 , var이라는 이름을 가진 두 가지 변수를 사용한다고 하자. 

이름이 같아서 컴파일 에러가 나는 상황이지만 namespace를 사용하면 된다!

 

형식은 namespace 이름공간 명칭{  } 이다. {  }안에 변수, 함수, 클래스를 정의한다.

 

namespace f1{

 

int var=5;

 

}

 

namespace f2{

 

float var = 10.5;

 

}

 

불러오고 싶은 네임스페이스의 변수 앞에 네임스페이스 이름을 함께 기술해야 한다.

 

void main(){

cout << f1::var << endl;

cout << f2::var <<endl;

 

}

 

만일, 네임스페이스의 이름을 기술하지 않으면, 해당 변수이름을 전역 이름 공간에서 찾는다. 하지만 전역 이름 공간에 없다면 컴파일 에러가 발생한다.

 

서로 다른 소스 코드에서 동일한 네임스페이스를 선언하면 논리적으로 하나의 네임스페이스에 묶인다.(소스파일의 이름은 상관없다.)

 

int var = 10;

 

void main(){

 

cout << var<< endl;

 

 

 

}

 

위의 코드 처럼 특별히 명시하지 않은 선언은 전역 네임스페이스를 사용하는 것이다.

이 전역 네임스페이스는 c++의 기본요소로 묵시적으로 사용되고 있다.

 

전역 네임스페이스를 특별히 명시하고자 한다면 :: 를 사용하면 전역 네임스페이스를 의미한다.

cout << ::var << endl;

 

네임스페이스 이름을 일일히 기술하는 불편을 해소하기 위해 C++에서는 using 키워드를 제공한다.

namespace theName{

int var=1;

}

using namespace theName;

void main(){

cout << var << endl;

}

 

using 을 사용하여 ::theName을 생략할 수 있다.

 

C++은 표준 템플릿 라이브러리(Standard Template Library)를 제공하는데  그 안의 많은 전역함수들과 클래스의 이름이 다른 개발자들이 많든 이름들과 충돌할 수 있기 때문에 std라는 네임스페이스로 캡슐화해 제공한다.

 

그래서 표준 템플릿 라이브러리를 사용할 때는 표준 함수나 클래스 이름 앞에 std::를 기술하거나 using namespace std;를 선언한다.

 

std 네임스페이스 안에는 입출력에 사용되는 cout, cin, endl, string, list, vector, map 등 여러 유용한 함수가 포함되어 있다.

 

[Reference : 거꾸로 읽는 C++ / 유동근]

'C++ ' 카테고리의 다른 글

복사생성자  (0) 2018.09.17
C++ passing reference to pointer  (0) 2018.09.12
소멸자  (0) 2018.09.12
This  (0) 2018.09.12
동적메모리로 할당하기 new  (0) 2018.09.12