본문 바로가기

C++ 일기

17. 네임스페이스 (namespace)

이번에 다룰 내용은 간략하게만 다루고 넘어가고자 한다.

네임스페이스는 프로그램 구현이나 알고리즘에 직접적인 코드 부분이 아닌,

협업 혹은 서로 다른 개체들의 구획을 위한. 즉, 편의성과 가독성을 위한 부분이기 때문이다.

 

A회사와 B회사가 있다고 가정해보자.

A사와 B사는 서로 같은 프로그램을 만들기 위해 협업중이다.

프로그램 구동중에, 어떠한 함수. 예를 들면, 어떤 글자를 출력해주는 Print라는 함수라고 생각해보자.

프로그램을 구동하면서 Print를 호출했는데,

A사도 Print라는 이름의 함수를, B사도 Print라는 이름의 함수를 사용했던 것이다.

프로그램은 이럴 때 에러를 출력한다. 어떤 Print를 호출할지 정하지 않았기 때문이다.

이러한 현상을 막기 위해 필요한 것이 namespace다. 

위 처럼 협업에 있어서나, 헤더파일을 서로 공유할 때,

기존 사용자의 프로그램에 지장을 주지 않으려면 따로 구분을 지어주어서 컴퓨터에게 확실히 알려주어야 한다.

namespace를 사용하면, 서로 다른 공간에 있는 것으로 취급되어 정상적으로 함수가 호출된다.

namespace의 사용은 다음과 같다.

#include<iostream>

namespace A
{
   void Print() { std::cout << "A Print" << std::endl; }
}

namespace B
{
   void Print() { std::cout << "B Print" << std::endl; }
}

int main()
{
   A::Print();
   B::Print();
   
   // 출력값 : A Print  B Print
}

물론 네임스페이스만 만들었다고 그냥 구분을 지어주는 것은 아니다.

어떤 네임스페이스에 있는지는 알려줘야 제대로 찾아가서 해당 함수를 호출해준다.

이 때 필요한 것이 범위지정연산자, :: 이다.

 

:: 는 우리가 무엇을 입력받거나 출력할 때 자주 쓰는 std를 사용할 때 자주 나왔었다.

그러면 우리는 이제 std::가 어떤 의미인지 알았다.

std::를 사용한다는 것은, std네임스페이스에 접근하여 std네임스페이스에 있는 기능을 사용하겠다고 말해주는 것이다.

 

접근하고자 하는 네임스페이스의 이름 뒤에 범위지정연산자를 붙이면 해당 네임스페이스에 접근하게 되어

그 네임스페이스의 기능이나 변수들이 참조가 된다.

참조가 된 기능 혹은 변수들을 사용하는 것은 기존과 같다.

 

네임스페이스는 안에 변수, 함수 뿐만 아니라 네임스페이스도 담을 수 있다. 

이럴 때 접근하기 위해서는 물론 범위지정연산자를 두번 붙여주어야겠다.

A안에 B라는 네임스페이스가 있다면, A::B:: 이런식으로 말이다.