[C++] 01 - 5 : 이름공간(namespace)에 대한 소개

2023. 3. 13. 20:45Chlln's Code/C++

이름공간의 기본원리

NameSp1.cpp

#include <iostream>
using namespace std;

namespace BestComImpl {
	void SimpleFunc(void) {
		cout << "BestCom이 정의한 함수" << endl;
	}
}

namespace ProgComImpl {
	void SimpleFunc(void) {
		cout << "ProgCom이 정의한 함수" << endl;
	}
}

int main(void) {
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();

	return 0;
}
  • 4~8행 : BestComImpl이라는 이름의 공간을 마련하였다.
    그리고 그 안에 함수 SimpleFunc를 정의하였다.
    따라서 이 함수는 'BestComImpl::SimpleFunc'이라고 지칭하게 된다.
  • 10~14행 : ProgComImpl이라는 이름의 공간을 마련하였다.
    그리고 그 안에 함수 SimpleFunc를 정의하였다.
    따라서 이 함수는 'ProgComImpl::SimpleFunc'이라고 지칭하게 된다.
  • 17행 : 이름공간 BestComImpl 내에 정의된 함수 SimpleFunc의 호출문장이다.
  • 18행 : 이름공간 ProgComImpl 내에 정의된 함수 SimpleFunc의 호출문장이다.

출력 결과

BestCom이 정의한 함수
ProgCom이 정의한 함수

이름공간 기반의 함수 선언과 정의의 구분

NameSp2.cpp

#include <iostream>
using namespace std;

namespace BestComImpl {
	void SimpleFunc(void);
}

namespace ProgComImpl {
	void SimpleFunc(void);
}

int main(void) {
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();

	return 0;
}

void BestComImpl::SimpleFunc(void) {
	cout << "BestCom이 정의한 함수" << endl;
}

void ProgComImpl::SimpleFunc(void) {
	cout << "ProgCom이 정의한 함수" << endl;
}
  • 5~7행 : 이름공간 안에서 함수의 선언만 삽입되었다.
  • 9~11행 : 마찬가지로 이름공간 안에서 함수의 선언만 삽입되었다.
  • 20행 : 이름공간 BestComImpl에 선언된 함수 SimpleFunc의 정의부분이다.
    이렇듯 ::연산자는 함수의 호출 이외에도 다양하게 사용된다.
  • 24행 : 마찬가지로 이름공간 ProgComImpl에 선언된 함수 SimpleFunc의 정의부분이다.

출력 결과

BestCom이 정의한 함수
ProgCom이 정의한 함수

NameSp3.cpp

#include <iostream>
using namespace std;

namespace BestComImpl {
	void SimpleFunc(void);
}

namespace BestComImpl {
	void PrettyFunc(void);
}

namespace ProgComImpl {
	void SimpleFunc(void);
}

int main(void) {
	BestComImpl::SimpleFunc();

	return 0;
}

void BestComImpl::SimpleFunc(void) {
	cout << "BestCom이 정의한 함수" << endl;
	PrettyFunc();	// 동일 이름공간
	ProgComImpl::SimpleFunc();	// 다른 이름공간
}

void BestComImpl::PrettyFunc(void) {
	cout << "So Pretty!!" << endl;
}

void ProgComImpl::SimpleFunc(void) {
	cout << "ProgCom이 정의한 함수" << endl;
}
  • 5, 9행 : 이름공간은 둘 이상의 영역으로 나뉘어서 선언할 수도 있다.
    물론 이 둘은 동일공간으로 간주된다.
  • 25행 : 23행에 정의된 함수와 동일한 이름공간에 정의된 함수이다.
    따라서 이렇게 직접호출이 가능하다.
  • 26행 : 함수의 호출 위치가 어떻게 되건, 이름공간 ProgComImpl에 정의된 함수 SimpleFunc를 호출하는 방법에는 차이가 없다.

출력 결과

BestCom이 정의한 함수
So Pretty!!
ProgCom이 정의한 함수

using을 이용한 이름공간의 명시

UsingDcl1.cpp

#include <iostream>
using namespace std;

namespace Hybrid {
	void HybFunc(void) {
    	cout << "So simple function!" << endl
        	<< "In namespace Hybrid!" << endl;
    }
}

int main(void) {
	using Hybrid::HybFunc;
    HybFunc();
    
    return 0;
}
  • 13행 : 키워드 using을 이용해서 '이름공간 Hybrid에 정의된 HybFunc를 호출할 때에는, 이름공간을 지정하지 않고 호출하겠다!'는 것을 명시(선언)하고 있다.
  • 14행 : 13행의 using 선언을 통해서 이름공간의 지정 없이 HybFunc 함수를 호출하고 있다.

출력 결과

So simple function!
In namespace Hybrid!

UsingDcl2.cpp

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main(void) {
	int num = 20;
	cout << "Hello World!" << endl
		<< "Hello " << "World!" << endl
		<< num << ' ' << 'A'
		<< ' ' << 3.14 << endl

		return 0;
}
  • 3~5행 : using 선언을 함수 밖에 전역의 형태로 삽입하였다.
    따라서 이제부터는 cin, cout, endl의 사용에 있어서 이름공간의 지정이 불필요하다.
  • 9~12행 : using 선언을 통해서 코드의 구성이 한결 간단해졌음을 알 수 있다.

출력 결과

Hello World!
Hello World!
20 A 3.14

UsingDcl3.cpp

#include <iostream>
using namespace std;

int main(void) {
	int num = 20;
	cout << "Hello World!" << endl
		<< "Hello " << "World!" << endl
		<< num << ' ' << 'A'
		<< ' ' << 3.14 << endl;

	return 0;
}

출력 결과

Hello World!
Hello World!
20 A 3.14

이름공간의 별칭 지정

NameAlias.cpp

#include <iostream>
using namespace std;

namespace AAA {
	namespace BBB {
		namespace CCC {
			int num1, num2;
		}
	}
}

int main(void) {
	AAA::BBB::CCC::num1 = 20;
	AAA::BBB::CCC::num2 = 30;

	namespace ABC = AAA::BBB::CCC;
	cout << ABC::num1 << endl
		<< ABC::num2 << endl;

	return 0;
}
  • 14, 15행 : 별칭이 선언되기 이전의 변수 num1과 num2의 접근을 보이고 있다.
  • 17행 : AAA::BBB::CCC에 ABC라는 별칭을 붙여주고 있다.
  • 18, 19행 : 별칭의 선언 이후의 접근을 보이고 있다.

출력 결과

20
30