superkind
6/29/2018 - 6:35 AM

이름공간(namespace)과 using

이름공간(namespace)과 using

namespace Jack {
    double pail;
    void fetch();
    struct Well {...};
}

namespace Jill {
    double bucket(double n) {...};
    double fetch;
    int pal;
    struct Hill{...};
}
  • 이름 공간은 블록안에 놓일 수 없음
  • 이름 공간에 선언된 이름은 기본적으로 외부 링크를 가짐
  • 전역 이름 공간: 파일 수준의 선언 영역
  • 전역 공간은 항상 이름을 추가할 수 있다.
  • 전역 공간에 접근하는 방법
Jack::pail = 12.34;
Jill::Hill mole;
Jack::fetch();

using 선언

namespace Jill {
    double bucket (double n) {...}
    double fetch;
    int pal;
    struct Hill {...};
}
char fetch;

int main()
{
    using Jill::fetch; // fetch를 지역 이름 공간에 넣는다
    double fetch; // 에러, 이미 지역 fetch가 존재함
    cin >> fetch; // 값을 Jill::fetch에 저장한다
    cin >> ::fetch; // 값을 전역 fetch에 저장한다
}

using 지시자

using namespace Jack; // Jack에 속한 모든 이름을 사용할 수 있게 만든다
#include <iostream> // 이름들을 std라는 이름 공간에 넣는다
using namespace std; // 이름들을 전역적으로 사용할 수 있게 한다
  • 이름공간의 이름이 지역 이름과 충돌하면 지역버전이 앞을 가린다
  • using 지시자를 함수 안에 넣으면 함수 안에서만 사용할 수 있음
namespace Jill {
    double bucket (double n) {...}
    double fetch;
    int pal;
    struct Hill {...};
}
char fetch; // 전역 이름 공간

int main()
{
    using namespace Jill; // 그 이름 공간의 모든 이름을 불러온다
    Hill Trill; // Jill::Hill 구조체를 생성
    double water = bucket(2); // Jill::bucket(); 을 사용한다
    double fetch; // Jill::fetch를 가린다
    cin >> fetch; // 값을 지역 fetch에 저장한다
    cin >> ::fetch // 값을 전역 fetch에 저장한다
    cin >> Jill::fetch // 값을 Jill::fetch에 저장한다
}
int foom()
{
    Hill top; // 허용되지 않음
    Jill::Hill crest; // 허용됨
}

이름공간 중첩

  • 이 경우 flame 변수는 elements::fire::flame 으로 참조한다.
namespace elements
{
    namespace fire
    {
        int flame;
        ...
    }
    float water;
}
  • 이름 공간 안에 using 지시자와 using 선언을 사용할 수 있음.
using namespace elements::fire;
namespace myth
{
    using Jill::fetch;
    using namespace elements;
    using std::cout;
    using std::cin;
}
  • jill::fetch에 접근하려면
std::cin >> myth::fetch;
std::cout << Jill::fetch; // myth::fetch에 저장한 값을 출력
  • 이름공간의 alias를 만들 수 있음
namespace my_very_favorite_things { ... };
namespace mvft = my_very_favorite_things;
namespace MEF = myth::elements::fire;
using MEF::flame;

이름공간 팁

  • 외부 전역 변수를 사용하지 말고, 이름이 명명된 이름 공간에 있는 변수를 사용
  • 정적 전역 변수를 사용하지 말고, 이름이 명명되지 않은 이름 공간에 있는 변수를 사용
  • 함수, 클래스를 개발하고 있다면, 그들을 하나의 이름 공간에 넣어라.
  • using 지시자는 옛날 코드를 이름 공간 용도로 변환하는 임시 수단으로 사용
  • using 지시자를 헤더 파일에 사용하지 말것.어떠한 이름들을 사용할 수 있게 하는지 알 수 없기 때문.
  • 사용 범위 결정 연산자 또는 using 선언을 사용하여 이름을 선택적으로 들여올것
  • using 선언에 대해 전역 범위 대신 선택적으로 지역 범위를 사용