이름공간 : 공간에 이름을 붙이는 행위
프로젝트를 여럿이서 진행 시 발생될 중복 문제를 예방한다.
아래와 같을 경우 컴파일 에러가 발생한다.
#include <iostream>
using namespace std;
void funtion(void) {
cout<<"A.com에서 정의한 함수" <<endl;
}
void funtion(void) {
cout<<"B.com에서 정의한 함수" <<endl;
}
int main(void)
{
funtion();
return 0;
}
// 컴파일 에러 발생
namespace 형태
namespace BestComImpl
{
//이름공간 내부
}
이름공간을 쓰는 방법
범위지정연산자 :: 를 통해 이름공간을 지정한다.
scope resolution operator
#include <iostream>
namespace BestComImpl
{
void SimpleFunc(void) {
std::cout<<"BestComImpl이 정의한 함수" <<std::endl;
}
}
// PromgComImpl이름공간 안에 SimpleFunc 함수 정의
namespace PromgComImpl
{
void SimpleFunc(void) {
std::cout<<"ProgCom이 정의한 함수" <<std::endl;
}
}
int main(void)
{
BestComImpl::SimpleFunc(); // 호출문장
PromgComImpl::SimpleFunc();
return 0;
}
이름공간 기반 함수 선언, 정의 구분
#include <iostream>
namespace BestComImpl
{
void SimpleFunc(void);
}
namespace ProgComImpl
{
void SimpleFunc(void);
}
int main(void)
{
BestComImpl::SimpleFunc(); // 호출문장
ProgComImpl::SimpleFunc();
return 0;
}
void BestComImpl::SimpleFunc(void)
{
std::cout<<"BestComImpl이 정의한 함수" <<std::endl;
}
void ProgComImpl::SimpleFunc(void)
{
std::cout<<"ProgCom이 정의한 함수" <<std::endl;
}
동일한 이름공간에 정의된 함수를 호출할 때에는 이름공간 명시팔 필요 없다.
#include <iostream>
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)
{
std::cout<<"BestComImpl이 정의한 함수" <<std::endl;
PrettyFunc(); //동일이름공간
ProgComImpl::SimpleFunc(); //다른이름공간
}
void BestComImpl::PrettyFunc(void)
{
std::cout<<"So Pretty" <<std::endl;
}
void ProgComImpl::SimpleFunc(void)
{
std::cout<<"ProgCom이 정의한 함수" <<std::endl;
}
이름공간 중첩 : 다른 이름공간 안에 이름공간이 삽입 가능하다.
namespace Parent
{
int num=2;
namespace SubOne
{
int num=3;
}
namespace SubTwo
{
int num=4;
}
}
// 선언된 이름공간이 달라 이름충돌 문제가 발생하지 않는다.
각 변수 num에 접근 방법
std::cout<<Parent::num<<std::endl;
std::cout<<Parent::SubOne::num<<std::endl;
std::cout<<Parent::SubTwo::num<<std::endl;
문제 01-4 : 파일의 분할
C++을 제대로 공부하려면 헤더파일의 의미와 정의방법, 헤더파일에 삽입할 내용과 소스파일에 삽입할 내용을 구분하는 방법, 둘 이상의 헤더파일과 소스파일을 만들어서 하나의 실행파일로 컴파일하는 방법을 알아야 한다. (C언어 기본서 참조)
실습으로 아래 코드를 3개의 파일로 분할해서 컴파일해본다.
헤더파일 : main함수를 제외한 나머지 두 함수의 선언 넣기. SimpleFunc.h라고 저장
소스파일1 : main함수를 제외한 나머지 두 함수의 정의 넣기. SimpleFunc.cpp로 저장
소스파일2 : main 함수만 삽입. SimpleMain.cpp 로 저장
#include <iostream>
namespace BestComImpl
{
void SimpleFunc(void);
}
namespace ProgComImpl
{
void SimpleFunc(void);
}
int main(void)
{
BestComImpl::SimpleFunc(); // 호출문장
ProgComImpl::SimpleFunc();
return 0;
}
void BestComImpl::SimpleFunc(void)
{
std::cout<<"BestComImpl이 정의한 함수" <<std::endl;
}
void ProgComImpl::SimpleFunc(void)
{
std::cout<<"ProgCom이 정의한 함수" <<std::endl;
}
헤더파일 (.h)
// 헤더 가드의 시작
//#ifndef ADD_H
//#define ADD_H
namespace BestComImpl
{
void SimpleFunc(void);
}
namespace ProgComImpl
{
void SimpleFunc(void);
}
// 헤더 가드의 끝
//#endif
소스파일1
#include <iostream>
#include "SimpleFunc.h" // 헤더파일 포함
void BestComImpl::SimpleFunc(void)
{
std::cout<<"BestComImpl이 정의한 함수" <<std::endl;
}
void ProgComImpl::SimpleFunc(void)
{
std::cout<<"ProgCom이 정의한 함수" <<std::endl;
}
소스파일2
//#include <iostream>
#include "SimpleFunc.h" // 헤더파일 포함
int main(void)
{
BestComImpl::SimpleFunc(); // 호출문장
ProgComImpl::SimpleFunc();
return 0;
}
std::cout, std::cin, std::endl
그간 namespace를 썼던 예시.
이름공간std에 선언된 cout, 이름공간std에 선언된 cin, 이름공간std에 선언된 endl을 뜻한다.
헤더파일 <iostream>에 선언되어 있는 cout, cin, endl은 이름공간 std 안에 선언되어 있었던 것이다.
이름충돌을 막기 위해 C++ 표준 다양한 요소들은 이름공간 std 안에 선언되어 있다.
std::cout
// std는 이름공간.
namespace std
{
cout .....
cin .....
endl.....
}
using 을 사용한 이용공간 명시
키워드 using을 사용해서 범위지정 없이 호출하는 방법.
지역변수 선언처럼 선언 지역을 벗어나면 효력을 잃게 된다.
프로그램 전체 영역에 효력을 미치려면 전역변수처럼 함수 밖에 선언한다.
형식
using A_COM::function;
// A_COM 이름공간 안의 function 함수를 사용하겠다
예시
#include <iostream>
using namespace std;
namespace A_COM
{
void funtion(void) {
cout<<"A.com에서 정의한 함수" <<endl;
}
}
using namespace A_COM;
int main(void)
{
funtion();
return 0;
}
#include <iostream>
using namespace std;
namespace A_COM
{
int i;
void funtion(void) {
cout<<"A.com에서 정의한 함수" <<endl;
}
}
// 한 줄에 선언
using namespace A_COM;
// using A_COM::function;
// using A_COM::i;
int main(void)
{
i=10;
funtion();
return 0;
}
#include <iostream>
// 한번에 선언
// using namespace std;
// namespace의 목적 : 이름충돌 방지인데
// 목적과 다르게 이름충돌이 발생할 수도 있어
// 아래 방식을 추천한다
// 각각 선언
using std::cout;
using std::cin;
using std::endl;
int main(void)
{
cout<<"Hello World!"<<endl;
return 0;
}
이름 공간에 별칭 붙이기
namespace ABC = AAA::BBB::CCC;
범위 지정 연산자 기반, 전역 변수 접근
int val = 100;
int main(void)
{
int val = 100;
::val += 1;
// 예시를 위한 예시이지만 실제로는 변수명을 다르게 할 것
return 0;
}
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
[윤성우 열혈 c++] OOP 단계별 프로젝트 01단계 (0) | 2021.08.19 |
---|---|
02-1 챕터 02의 시작에 앞서 (0) | 2021.08.19 |
01-4 인라인 함수 (0) | 2021.08.18 |
01-3 매개변수의 디폴트 값 (0) | 2021.08.18 |
01-2 함수 오버로딩 (0) | 2021.08.18 |