바람이 머문 언덕

네임스페이스와 using 본문

컴퓨터 IT/C++ 언어

네임스페이스와 using

알 수 없는 사용자 2010. 1. 15. 14:02
반응형

C++ 에서는 I/O 스트림이라는 입출력 기능을 제공 하는데 C++ iostream은 cin과 cout라는 오브젝트가 포함되어 있어서
C에서 보다 좀 더 쉽게 입출력을 할 수 있다.

#include <iostream>

int main(int argc, _TCHAR* argv[])
{
    int i=9;
    char a[125] = " 입니다.";
    std::cout<<"i="<<i<<a<<'\n';
    std::cout<<"입력한 숫자를 입력 하세요.\n";
    std::cin>>i;
    std::cout<<"입력한 숫자는 "<<i<<"입니다.\n";
    system("PAUSE");
   return 0;
}

cout와 cin 오브젝트 앞에 보면 std::이라는 네임스페이스가 있는게 보이는데 두 오브젝트를 같은 네임스페이스에
포함시켜서 사용하고 있다.

구조체나 클래스처럼 네임스페임이스도 변수, 함수 등을 구룹화해주는 기능으로 여러 사람이 프로젝트를 진행하다보면
변수나 함수가 같은 이름으로  선언되어 있있는게 있어서 호출시 켐파일러가 어떤 것을 호출하는지 몰라서 에러를 일어키는
경우가 있는데 이를 경우 네임 스페이스를 사용해서 충돌을 막을 수 잇다.


아래 간단한 예를 들었다.
class 처럼 네임스페이스 안에다 함수를 정의 해주어도 되고 네임스페이스 안에 프로트 타입만  선언해 주었고
함수 정의 부분은 밖에서 해주어도 되는데 이 분분은 클래스와 같다.


네임스페이스는 아래 예처럼 이미 정의 된 네임스페이스를 열고 함수를 적어 주면 그 네임스페이스에 멤버로 함수가 포함된다.



class를 페임 스페이스에 포함하는 예)
=================================================================================================
namespace N
{   
    class NString
   {
      public:
        int state;
        char* cbuf;
        NString(void);
        NString(char *buf);
        ~NString(void);
   };
}

N::NString::NString(void) 
{
    cbuf = null;
    state =1;
}

   N::NString::NString(char *buf)
{
    cbuf = new char[strlen(buf)+1];
    strcpy(cbuf, buf);
    state =1;
}

N::NString::~NString(void)
{
    if(cbuf && state == 1)
   {
      delete cbuf;
   }
   state--;
}



====================================================================================================

 아래처럼 네임스페이스 이름이 길거나 아님 다른 이유로 네임스페이스 이름을 다른 것을 사용하고 싶을 때  별명을 정의해 줄 수 있다.


#include "NString.h"
#include <iostream>

using namespace std;
int main(int argc, _TCHAR* argv[])
{
    namespace n=N;                              // 네임 스페이스이 별명 선언 예
    n::NString b="입니다.";                       // 네임스페이스 N을 별명n으로 사용
    int i=9;
    cout<<"i="<<i<<b.cbuf<<'\n';
    cout<<"입력한 숫자를 입력 하세요.\n";
    cin>>i;
    cout<<"입력한 숫자는 "<<i<<b.cbuf<<'\n';
    system("PAUSE");
   return 0;


}

네임스페이스가 지정 된 변수나 함수를 사용하다 보면 일일이 네임스페이스를 적어 주는게 귀찮아 질때가 있다. 
그 때 using을 이용하여 네이스페이스 없이 사용 할 수 있는데  네임스페이스를 사용하는 목적이 동일한 이름이 있을
경우 에러를 방지하기 위해서 사용하는 만큼 동일한 이름이 없어야 한다.

#include <iostream>
using namespace std;          // 네임스페이스  std에 포함 된 멤머 전체              

int main(int argc, _TCHAR* argv[])
{
    using  std::cout;              // 네임스페이스  std에 포함 된 멤머 중 std::cout;만 
    int i=9;                        
    char a[125] = " 입니다.";
    cout<<"i="<<i<<a<<'\n';   // 네임스페이스를 생략하고 적을 수 잇다
    cout<<"입력한 숫자를 입력 하세요.\n";
    cin>>i;
    cout<<"입력한 숫자는 "<<i<<"입니다.\n";
    system("PAUSE");
   return 0;
}