Developer MJ Story

[C++/namespace] 함수와 변수를 구분할 수 있는 이름 공간(namespace) 본문

Software/C++

[C++/namespace] 함수와 변수를 구분할 수 있는 이름 공간(namespace)

집근처 2014. 9. 7. 10:53
반응형

프로그래밍을 하면서 가장 어려운 일중 하나가 함수와 변수의 이름을 짓는 일입니다.

그런데, 하나의 프로그램 안에서 함수, 변수 모두 이름 중복을 허용하지 않는다…..라고 한다면….

보통 하나의 프로그램을 여러 사람이 협업해서 만드는데, 이들이 개발할 때 서로 함수, 변수 명이 모두 달라야 한다면......

이렇게 개발이 가능할까요??

그래서 나온 개념이 이름 공간…….

한글로 번역하니 조금 이상하네요. 영어로 namespace입니다.

 

Namespace 사용법도 간단합니다.

Namespace의 핵심은 공간 연산자인 '::' 입니다.

공간 연산자로 다른 곳에서 선언되어 있는 namespace에 접근 가능합니다.

예제 소스를 보시면 더 이해가 빠르실 것 같습니다.

 

namespace developer

{

    std::string dev = "I'm developer";

 

    void devFunction(){

        std::cout<< "developer devFunction " << std::endl;

    }

}

 

namespace mj

{

    std::string mj = "I'm mj";

 

    void mjFunction(){

        std::cout<< "mj mjFunction "<< std::endl;

    }

}

 

int main() {

    cout<< "developer String" << developer::dev << std::endl;

    cout<< "mj String" << mj::mj << std::endl;

 

    cout<< "developer function" << std::endl;

    developer::devFunction();

    cout<< "mj function" << std::endl;

    mj::mjFunction();

    return 0;

}

 

위와 같이 두개의 namespace를 만들고 main에서 각각의 namespace에 접근하는 예제 입니다.

실행 결과는 예상 하시는 대로 아래와 같습니다.

 

developer StringI'm developer

mj StringI'm mj

developer function

developer devFunction

mj function

mj mjFunction

 

마지막으로 한 가지,

전역 변수와 같은 경우 빈 namespace에 지정됩니다.

말로 설명하기 어려우니 예제 소스를 보시면 이해가 쉬울 것 같습니다.

 

int value = 7;

 

int main() {

    int value = 1;

 

    std::cout << "local value = " << value << std::endl;

    std::cout << "global value = " << ::value << std::endl;

    return 0;

}

 

위와 같이 전역 변수에 접근하려면, 전역 변수가 선언된 namespace를 선언해 줘야 합니다.

전역 변수 같은 경우 빈 namespace를 갖게 되기 때문에 위 예제 소스와 같이 접근하면 됩니다.

 

Namespace를 매번 함수 앞에 선언하는 것은 매우 귀찮은 일이기 때문에 자주 사용하는 namespace의 경우 using namespace 를 활용할 수 있다.

Using namespace를 이용하여 std를 선언해 주면 이후 cout, cin, endl 등의 C++ standard에 선언되어 있는 함수는 'std::'를 붙여주지 않고 사용 가능합니다.

그래서 보통 헤더들을 inlucde하고 바로 usin namespace std를 선언 되어 있는 코드를 자주 볼 수 있습니다.

 

#include <stdio.h>

#include <iostream>

#include <string>

 

using namespace std;

반응형