* 네임 스페이스
: 명칭 부여의 자유를 보장한다.
네임 스페이스(Name Space)는 말 뜻 그대로 명칭들이 기억되는 영역이며 명칭의 소속 공간이라고 할 수 있다.
1. 필요 이유
짧고 간단한 프로그램에서 명칭을 작성하는 것은 그리 어려운 일이 아니다. 그러나 프로그램이 복잡해지고 규모가 커질수록 더 많은 명칭이 필요해져서 고유한 이름을 붙이는 일이 점점 더 어려워지고 있다.
게다가 팀 단위로 작업할 때는 혼자서 명칭을 다 만드는 것이 아니며 외부 라이브러리를 가져다 쓰는 일도 흔해져서 우연히 명칭이 충돌하는 일이 잦아졌다.
예) Count라는 변수를 쓰고 싶은데 팀의 다른 개발자가 이미 이 명칭을 전역 변수로 쓰고 있다거나 외부 라이브러리에서 다른 의미로 사용중이라면 이 이름을 쓸 수 없다.
2. 형식
namespace 이름
{
여기에 변수나 함수를 선언한다.
}
3. 적용 사례
1) 문제점 발생
예 제 : namespace1
#include <Turboc.h>
int i;
double i;
void func()
{
i=123; // 어떤 i 인지 중복문제 발생
}
void main()
{
func();
}
2) 해결안
예 제 : namespace2 |
#include <Turboc.h>
namespace A {
double i;
}
namespace B {
int i;
}
void func()
{
A::i=12.345;
B::i=123;
}
void main()
{
func();
}
3) 네임 스페이스의 종류 - 전역(디폴트), 지정이냐
=>네임 스페이스를 별도로 정의하지 않아도 항상 존재하는 네임 스페이스가 있는데 이를 전역 네임 스페이스라고 한다. 이른바 디폴트 네임 스페이스라고 볼 수 있는데 흔히 전역 변수를 선언하는 영역,그러니까 함수의 바깥쪽이 바로 이 영역이다.
예 제 : namespace3
#include <Turboc.h>
int i; // 전역 네임 스페이스 소속
namespace A {
int i; // A 소속
}
void func()
{
int i;
i=1; // 지역 변수 i
::i=2; // 전역 네임 스페이스의 i
A::i=3; // A 네임 스페이스의 i
}
void main()
{
func();
}
2. 네임 스페이스 사용 (좀더 간편한 방식)
=> 네임 스페이스는 명칭의 선언 영역을 분리하여 명칭의 충돌을 방지한다. 그래서 네임 스페이스안에 명칭을 선언하면 이름을 붙일 때 충돌을 걱정하지 않고 자유롭게 이름을 붙일 수 있다.
=>이렇게 작성된 명칭을 사용하려면 매번 소속을 밝히고 참조해야 하므로 무척 번거롭다. 다음과 같이 선언된 네임 스페이스가 있다고 하자.
1) using 지시자 - 전체 다 가져오기 : using 지시자
using namespace 다음에 네임 스페이스를 지정하는 방식이다. 지정한 네임 스페이스의 모든 명칭을 이 선언이 있는 영역으로 가져와 소속 지정없이 명칭을 바로 사용할 수 있도록 한다.
예 제 : usingdirective
#include <Turboc.h>
namespace MYNS {
int value;
double score;
void func() { printf("I am func\n"); }
}
using namespace MYNS; // 네임 스페이스의 모든 명칭을 이 선언으로 가져온다.
void main()
{
value=3;
score=1.2345;
func();
}
2) 변수 하나만 가져오기 : using 선언
예 제 : usingdecl
#include <Turboc.h>
namespace MYNS {
int value;
double score;
void func() { printf("I am func\n"); }
}
void main()
{
using MYNS::value; // using 선언
value=3;
MYNS::score=1.2345;
MYNS::func();
}
void subfunc()
{
MYNS::value=3;
}
3) 사용에 대한 추천
가급적이면 using 지시자로 네임 스페이스의 전체 명칭을 가져 오는 것보다 using 선언으로 꼭 필요한 것만 가져오는 것이 더 좋다.
3. 별명의 사용
네임 스페이스는 우연한 충돌을 방지하기 위해 보통 긴 이름을 주는데 이름이 너무 길면 입력하기에 번거롭고 코드도 지저분해진다. 이럴 경우 namespace 키워드 다음에 A=B; 형태로 긴 이름 대신 짧은 별명을 정의할 수 있다. 별명은 동일한 대상에 대한 다른 이름이므로 이후 B라는 이름 대신 A를 대신 사용하면 된다. 다음 예를 보자.
namespace VeryVeryLongNameSpaceName {
struct Person { };
}
void main()
{
namespace A=VeryVeryLongNameSpaceName;
A::Person P;
}
'프로그래밍 > MFC' 카테고리의 다른 글
클래스 계층 구조 (0) | 2009.02.11 |
---|---|
SDI 함수 호출순서(생성시) (0) | 2009.02.11 |
Dialog의 생성 순서 (0) | 2009.02.11 |
메세지맵 Class :: CCmdTarget (0) | 2009.02.11 |
DB 사용하기.. (0) | 2009.02.11 |