본문 바로가기
프로그래밍 언어/C++

[C++] 네임스페이스(namespace) 활용

by 까망 하르방 2024. 12. 18.
반응형

:: 』 기호는 Scope Operator로 "범위지정 연산자" 라고 한다.

(네임스페이스 지정할 때 사용하는 연산자)

#include <iostream>

namespace A
{
    void Print()
    {
        printf("a...\n");
    }
}

namespace B
{
    void Print();
}

int main()
{
    A::Print();
    B::Print();
}

void B::Print() // 선언부와 정의부 구분
{
    printf("b...\n");
}

 

여러 사람이 작업을 하다보면 변수나 클래스명이 같을 수 있다.

namespace로 영역을 구분할 수 있다.

→ 관련 코드 (함수, 구조체 전역 변수 등)을 묶어서 관리하는데 사용

 

동일한 영역에서 정의된 함수 호출할 때는

네임스페이스를 명시할 필요가 없다.

 

 

네임스페이스 중첩

#include <iostream>

namespace A
{
    void Print()
    {
        printf("a...\n");
    }

    namespace SubA
    {
        void Print()
        {
            printf("Sub a...\n");
        }
    }
}

int main()
{
    A::SubA::Print(); // Sub a...
}

 

 

using 키워드 활용

해당 네임스페이스를 참조할 때마다

키워드를 명시하는 것이 부담스러울 수 있다.

using 키워드로 선언된 영역 명시하는 수고를 덜 수 있다.

#include <iostream>

namespace A
{
    void Print()
    {
        printf("a...\n");
    }
    namespace SubA
    {
        void Print()
        {
            printf("Sub a...\n");
        }
    }
}

int main()
{
    using namespace A::SubA;

    Print(); // Sub a...
}

 

선언된 영역에서 유효한 것이기 때문에

전체 영역에 적용하려면 전역 위치(함수 밖)에서 사용하면 된다.

이름 충돌될 확률이 높아지기에 상황에 따라 대처해야 한다.

 

 

namespace 별칭

using 대신에 네임스페이스 별칭으로

길거나 중첩된 네임스페이스를 간소화할 수 있다.

#include <iostream>

namespace A
{
    void Print()
    {
        printf("a...\n");
    }
    namespace SubA
    {
        void Print()
        {
            printf("Sub a...\n");
        }
    }
}

int main()
{
    namespace AA = A::SubA;

    AA::Print(); // Sub a...
}

 

 

지역변수와 전역변수 구분

『 :: 』 로 전역변수와 지역변수를 구분할 수 있다.

#include <iostream>

using namespace std;

int val = 10; // 전역 변수

int main()
{
    int val = 20; // 지역 변수

    cout << val << endl; // 20 (지역)
    cout << ::val << endl; // 10 (전역)
}

 

 

참고로 C언어에서는

동일한 이름의 함수는 2개 이상 만들 수 없다.

그렇기에 함수 이름을 변경해주어야 한다.

반응형

댓글