반응형

* 네임 스페이스

 

 : 명칭 부여의 자유를 보장한다.

   네임 스페이스(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

+ Recent posts