1. namespace의 필요성
- 프로그램을 개발하다 보면 수백개의 파일로 구성될 수 있고 동시에 여러명의 개발자가 같이 작업할 수 있다.
- 그 과정에서 함수나 구조체에 대한 이름충돌이 발생할 수 있다.
다음과 같은 스크립트가 있다고 하면 main에서 호출한 move함수는 무엇을 호출하는지 몰라 에러가 나온다.
해결방법으로 함수의 이름을 모두 다르게 하는 것도 방법이겠지만 그렇게 바꾸다 보면 헷갈리는 경우도 생긴다.
이럴 경우 namespace를 사용하여
위와 같은 형태로 바꿀 수 있다.
namespace로 묶여있지 않은 move함수는 global namespace라고 부른다.
namespace로 묶여있는 함수는 위와 같이 호출 할 수 있다.
namespace로 묶여있지 않는 move는 평소와 같이 호출하면 된다.
2. namespace의 장점
- 다양한 요소(함수, 구조체 등)를 연관된 요소끼리 묶어 놓을 수 있다.
- 기능별로 다른 공간을 쓰므로 이름 충돌을 막을 수 있다.
3. namespace의 요소에 접근하는 방법
3-1. 한정된 이름(qualified name)을 사용한 접근
- Enemy::move()
3-2. using 선언(declaration)을 사용한 접근
- using Enemy::move();
- using이 선언된 내부에선 move함수는 Enemy 이름 없이 사용
- Enemy함수 안에 move외에 attack이란 함수가 있다면 attack은 사용불가(using을 이용하여 move만 선언했기 때문에)
3-3. using 지시어(directive)를 사용한 접근
- using namespace Enemy;
- Enemy namespace내의 모든 함수를 Enemy이름 없이 사용
* using 선언 및 지시어는 함수 내부나 외부에서 선언 가능하지만 global namespace와 이름이 겹치는 함수가 있다면 이름충돌이 발생할 수 있다.
* global namespace에 접근하려면 함수 앞에 ::(콜론 두개)를 적어주면 된다. -> ex. ::move();
4. std namespace
- C++ 표준의 모든 요소는 std 이름 공간 안에 있다.
- using 지시어를 사용하게 되면 이름충돌이 발생할 수 있다.
- ex) count라는 변수를 자주 사용하는데 std 이름 안에 count라는 함수가 있다. 이럴경우 ::count로 쓰면 되긴한다.
5. C++ header files
- C++의 표준 헤더 파일은 확장자를 사용하지 않는다. ( .h )
- C언어에서 사용하던 헤더파일을 사용해도는 되지만 가능하면 새로운 헤더파일을 사용하자
- <stdio.h> 와 <cstdio>의 차이는 std namespace를 붙여서 사용할 수 있느냐는 차이점
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 변수(2) (0) | 2019.10.05 |
---|---|
[C++] 변수(1) (0) | 2019.10.05 |
[C++] iomanipulator (0) | 2019.10.05 |
[C++] C++ 표준 입출력 (2) | 2019.10.04 |
[C++] CL 컴파일러 사용하기 (0) | 2019.10.03 |