본문 바로가기
개발/C++

이름 공간(namespace)

by 남생이야 2024. 6. 15.

 

 이름 공간 (namespace)

 이름 공간은 프로젝트 규모가 커질 때 동일한 이름의 클래스나 함수 등의 존재로 충돌을 방지하기 위한 해결책이다. 

서로 다른 파일에 같은 이름의 classA가 존재할 때, 이를 구분하기 위한 선언 영역을 namespace 키워드를 통해 구분 지을 수 있다. 

 

 이름 공간 기능

 - 이름 충돌 방지

 - 코드 조직화

 - 가독성 향상

 

 1. 선언 영역 (delcarative region)

 - 선언할 수 있는 영역을 말한다. 

 - 전역 변수는 모든 함수의 바깥에서 선언할 수 있으며 이 전역 변수의 선언 영역은 선언된 파일이다.

 - 변수를 함수안에서 선언하면 선언 영역은 그 함수 블록이다.

 

2. 잠재 사용 범위(potential scope)

 - 실제로 프로그램이 해당 변수를 볼 수 있는 범위를 말한다.

-  전역 변수와 함수 내에 선언된 지역 변수의 이름이 같을 때 지역 변수가 전역 변수의 이름을 가린다. 

 

namespace Tes
{
	double pail;
    void fetch();
    struct sol {...};
}

namespace sil
{
	double pail;
    void sol();
    struct fetch{.. };
}

 

  •  이름 공간은 기본적으로 외부 링크를 가진다. 
  • 사용자 정의 이름 공간 외에 전역 이름 공간(global namespace)라는 파일 수준의 선언 영역에 해당하는 공간이 존재하며 전역 변수가 전역 이름 공간의 일부로 볼 수 있다. 
  • 하나의 이름 공간에 속한 이름(변수명, 함수명 등)과 다른 이름 공간에 이름과 충돌하지 않는다. 
  • 이름 공간은 항상 열려 있기 때문에 새로운 이름을 추가할 수 있다. 
  • 이름 공간에 접근 방법은 :: (사용 범위 결정 연산자)를 이용하여  접근할 수 있다.

 

Tes::pail = 10.23; // 변수 사용
Tes::fetch();	// 함수 사용
Tes::sol tesSol;  // 구조체 변수 선언
sil::pail = 10.23; // sil 이름 공간의 fetch 변수 사용

 

using 선언

 특정 이름 공간의 변수나 함수, 클래스를 사용하기 위해서 현재 범위로 가져오는 방법이다. 

 

#include <iostream>

namespace MyNamespace {
    int myVar = 42;
    void myFunction() {
        std::cout << "Hello from MyNamespace!" << std::endl;
    }
}

int main() {
    using MyNamespace::myVar;
    using MyNamespace::myFunction;

    std::cout << myVar << std::endl;  // myVar를 직접 사용
    myFunction();  // myFunction을 직접 사용

    return 0;
}

 

특정 요소만 현재 범위로 가져오기 때문에, 이름 충돌의 위험이 줄어드는 장점이 있다. 

 

using 지시자 

  using 지시자는 특정 이름 공간 내의 모든 요소를 현재 범위로 가져오는 방법이다. 현재 범위 내에서 특정 이름공간 지정자  없이 직접 사용할 수 있다.

 using 키워드를 와 namespace 이름 공간 명을 작성하여 현재 범위로 특정 이름 공간을 범위 지정 연산자를 사용할 필요 없이 사용할 수 있다.

#include <iostream>

namespace MyNamespace {
    int myVar = 42;
    void myFunction() {
        std::cout << "Hello from MyNamespace!" << std::endl;
    }
}

int main() {
    using namespace MyNamespace;

    std::cout << myVar << std::endl;  // MyNamespace::myVar를 직접 사용
    myFunction();  // MyNamespace::myFunction을 직접 사용

    return 0;
}

 

 코드 작성이 편하다는 장점이 있지만 이름 충돌이 발생할 수 있는 위험이 증가한다. 

 

이름 공간 중첩

이름 공간 안에 다른 이름공간을 정의할 수 있다. 

namespace elements
{
	namespace fire
    {
    	int flame;
        ...
    }
    
    float anthoer; 
}

flame 변수를 참조하기 위해선 elements::fire::flame 으로 참조할 수 있다.  

 

'개발 > C++' 카테고리의 다른 글

가상 기초 클래스( virtual based class)  (0) 2024.06.28
인라인(Inline) 함수  (2) 2024.06.11
동적 캐스팅(dynamic_cast)  (0) 2024.06.07
매크로(Macro)  (0) 2024.06.07
가상 함수  (2) 2024.06.03