ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 001. namespace
    Programming/C++ 2023. 3. 28. 23:23

    namespace(네임스페이스)란,

    더보기

    네임스페이스는 내부 식별자(형식, 함수, 변수 등의 이름)에 범위를 제공하는 선언적 영역입니다. 네임스페이스는 코드를 논리 그룹으로 구성하고 특히 코드베이스에 여러 라이브러리가 포함된 경우 발생할 수 있는 이름 충돌을 방지하는 데 사용됩니다. 네임스페이스 범위에 있는 모든 식별자는 한정 없이 서로에게 표시됩니다.네임스페이스 외부의 식별자는 각 식별자에 대해 정규화된 이름을 사용하거나, std::vector<std::string> vec;단일 식별자에 대한 using Declaration(또는 네임스페이스using namespace std;(using std::string)의 모든 식별자에 대한 using 지시문을 사용하여 멤버에 액세스할 수 있습니다. 헤더 파일의 코드는 항상 정규화된 네임스페이스 이름을 사용해야 합니다.

    https://learn.microsoft.com/ko-kr/cpp/cpp/namespaces-cpp?view=msvc-170

     

    네임스페이스 (C++)

    자세한 정보: 네임스페이스(C++)

    learn.microsoft.com

    설명이 너무 어렵고 길다.

     

    여러 식별자(변수, 함수 등)를 이름을 가진 그룹으로 묶어서 이름 충돌을 방지하는데 사용되는 기능이다.

     

    예를들어,  학교에 신짱구가 두명이 있는데 '짱구야' 라고 하면 둘다 '왜?' 라고 대답할 것이다.. 너무 답답해서 짱구들의 신상을 털어서 알아보니 짱구가 한명은 1학년이고 다른 짱구는 2학년인 것이다. 그래서 1학년 짱구야, 2학년 짱구야 이렇게 불렀더니 헷갈릴 일도 없고 너무 좋았다. namespace가 이런 역할을 한다. 이를 억지로 코드화해보면,

    // namespace 선언
    namespace 1학년 {
    	int 짱구 = 1;
    }
    namespace 2학년 {
    	int 짱구 = 2;
    }
    
    // namespace에 포함된 짱구 호출
    int main() {
        printf("%d\n", 1학년::짱구); // 1 출력
        printf("%d\n", 2학년::짱구); // 2 출력
        return 1;
    }

     

    대충 이런 모습이다.


    :: (범위 확인 연산자, Scope resolution operator)

    더보기

    범위 확인 연산 :: 자는 다양한 범위에서 사용되는 식별자를 식별하고 명확하게 식별하는 데 사용됩니다. 범위에 대한 자세한 내용은 범위를 참조하세요.

    https://learn.microsoft.com/ko-kr/cpp/cpp/scope-resolution-operator?view=msvc-170

     

    범위 확인 연산자: '::'

    표준 C++에서 범위 확인 연산자 '::'이(가) 작동하는 방식을 알아봅니다.

    learn.microsoft.com

    그냥 한 네임스페이스 안에 있는 친구들에게 접근하기 위한 연산자이다.

    A라는 네임스페이스에 있는 abc 변수를 사용하고 싶을 땐

    A::abc;

    이렇게 접근하자.


    using 선언

    ? 뭐라는지 모르겠다...

    일단 namespace에서 using을 사용하면 namespace의 이름을 쓰지 않고도 하위 식별자들을 참조할 수 있다.

    namespace a {
        int abc = 15;
    }
    using namespace a; // using 선언
    
    int main(){
        printf("%d\n", abc); // 15 출력, a::abc 이렇게 길게 안써도 된다.
    
        return 1;
    }

    쉽죠?

    using을 쓸 경우 using선언 되었던 namespace 하위 식별자들은 namespace 없이 그저 전역으로 선언된 변수와 같다고 생각하면 된다.


    namespace 예제

    #include <iostream>
    
    namespace spc1 {
        int add(int a, int b){
            return a+b;
        }
    }
    namespace spc2 {
        int add(int a, int b){
            return a+b+a+b;
        }
    }
    namespace spc3 {
        int add(int a, int b){
            return a+b+a+b+a+b;
        }
    }
    using namespace spc3; // using Declaration으로 네임스페이스의 모든 식별자를 범위로 가져오기
    
    int main(){
        std::cout << spc1::add(3,4) << std::endl;
        std::cout << spc2::add(3,4) << std::endl;
        std::cout << add(3,4) << std::endl;
    
        return 1;
    }
    7
    14
    21

     

    그런데 std::cout, std::endl이 뭐죠?

    cout은 c언어에서 printf와 같은 역할이고 endl은 c언어에서 '\n' 개행문자와 같다.

    그런데 cout, cin, endl과 같은 C++언어에서의 표준 라이브러리 식별자들은 모두 std 라는 namespace 안에 정의 되어있다.

    따라서,

    C: printf("%d\n", a);

    C++: std::cout << a << std::endl; 

    위 두 코드는 같은 내용을 출력한다.

     

    또한, std 네임스페이스는 iostream이라는 헤더파일에 정의되어있다.

     

     

    더보기

    + 더 알아보기

     

    네임스페이스의 중첩

Designed by Tistory.