-
Notifications
You must be signed in to change notification settings - Fork 0
[CPP] 제 4장. Namespace (이름공간)
garynoh edited this page Sep 11, 2017
·
4 revisions
삼성, Apple, Google 이 같은 프로젝트를 하고 있는데, 각자 개발한 모듈을 합치려 한다. 이 때, 각자 만든 모듈에 있는 함수 이름이나 변수 이름이 겹치는 바람에 누구 하나는 이름을 바꿔야하는 문제가 발생한다. (시간이 빠듯한 회사에서 이렇게 한 번 더 작업을 하게 되면 발생하는 손실이란...) 이 점을 극복하기 위해서 namespace 라는 개념을 도입하게 되었다.
프로젝트에 사용되는 함수나 변수들을 한번에 관리하는 것이 아니라, 독립적인 공간에서 관리할 수 있도록 하고, 그 공간을 namespace 라고 부른다. 예를 들어, 같은 아파트라고 해도 철수가 여러 명 있을 수 있다. K 아파트에 가서 "철수야!" 라고 하면 철수가 여러 명이 나올 것을 대비하여, 철수들을 독립적인 공간인 아파트 호수로 관리하고 철수를 부를 때 "202호 철수야!" 라고 부르면 충돌을 방지할 수 있다. 사용 예제는 아래와 같다.
#include <iostream>
#include <string>
using namespace std;
//201호
namespace Number201{
string name = "철수";
}
//202호
namespace Number202{
string name = "철수";
}
int main(int argc, const char * argv[]) {
//202호 철수야!
cout << Number202::name << "야!";
return 0;
}
- ❓ '::' 은 무엇일까? :: 은 범위지정 연산자(scope resolution operator)라고 불리며 namespace 를 지정할 때 사용하는 연산자이다.
- 일반적으로 함수의 선언부는 헤더 파일에 정의를 하고 사용을 한다. namespace 안에서 정의된 함수를 사용할 때는, namespace 를 마련하고, 그 안에 함수를 선언하는 방식을 사용한다.
- namespace 는 중첩시킬 수 있다.
- using 에 대한 느낌이 import 랑 비슷한 것 같다. import 도
import java.util.Scanner ...
이런 식으로 쓰는데, using 도using Room202::doSomething
과 같이 정의를 한 다음 그 함수 또는 변수를 사용하기 때문이다. 이런게 귀찮다면import java.util.*
로 한 번에 사용할 수 있도록 한 것처럼,using namespace Room202
를 쓸 수 있다.
⚠️ using namespace 를 남발하면 이름충돌의 가능성이 그만큼 커진다. 아래 예시의 경우, 둘 중 하나만 했을 때 발생하지 않았던 충돌문제가 발생하게 된다.
using namespace Number201; (❌)
using namespace Number202;
//202호 철수야!
cout << name << "야!";
- namespace 도 별칭을 만들어 줄 수 있다.
namespace ABC = AAA::BBB::CCC;
- namespace 의 또 다른 기능 : 지역변수로 인해 전역변수가 쓸모가 없어지는 상황에서 전역변수에 접근할 수 있다. 예를 들어,
#include <iostream>
using namespace std;
int num = 1;
int main(int argc, const char * argv[]) {
int num = 100;
cout << num*2 << "\n"; //200
cout << ::num*2 << "\n"; //2
return 0;
}
열혈C++ 프로그래밍 (윤성우)