언어/C++

[C++] namespace

O_oz 2023. 10. 23. 10:40
반응형

namespace (이름 공간)은 이름 충돌을 방지하기 위해 사용한다

 

이름 충돌이란?

클래스나 상수, 변수와 함수의 이름이  겹치는 것이고 이렇게 겹칠 때, 겹치는 것들을 구분하기 위해서 namespace가 도입되었다

 

구체적인 예를 들면

A와 B가 프로젝트를 나눠서 개발한다고 가정했을 때, 나중에 각자의 코드를 merge하니 겹치는 함수가 발생했다

// A.cpp

void f()
{
    ···
}
// B.cpp

void f()
{
    ···
}

이럴 경우 각자가 만든 코드라는 것을 명시해주도록 코드를 namespace로 감싼다

 

// A.cpp

namespace A {
    void f()
    {
        ···
    }
}
// B.cpp

namespace B {
    void f()
    {
        ···
    }
}

이렇게 각자의 코드를 namespace로 감싸주면

 

// main.cpp

#include "A.h"
#include "B.h"

int main(void)
{
    A :: f();
    B :: f();
    
    return 0;
}

위와 같이 각각의 f() 함수를 사용할 수 있게된다

 

추가적으로

std :: cout << "HELLO" << std :: endl;

위 처럼 cin과 cout 코드를 작성할 때 앞에 std :: 같은 namespace prefix를 사용하는 것이 귀찮다고 느꼈을 수도 있다

 

그럴땐 using 지시어를 사용하면 된다

using std :: cout;

cout << "HELLO" << std :: endl;

1번 라인은 std 라는 namespace 안의 cout 객체만 namespace prefix를 생략할 수 있다는 의미여서 3번 라인을 보면 cout만  namespace prefix만 생략된 것을 확인할 수 있다

 

std 이름 공간 안의 모든 객체들의 이름 공간 접두어를 생략하고 싶으면?

using namespace std;

cout << "HELLO" << endl;

using 지시어를 위와 같이 사용해주면 된다

반응형

'언어 > C++' 카테고리의 다른 글

소수 구하는 알고리즘  (0) 2024.09.12
c++ 자료형  (0) 2024.09.09
[MFC] 다이얼로그 2  (1) 2023.10.29
[MFC] 다이얼로그 1  (0) 2023.10.28
[C++] 클래스  (1) 2023.10.23