728x90
728x90
이름공간 : 공간에 이름을 붙이는 행위

프로젝트를 여럿이서 진행 시 발생될 중복 문제를 예방한다.
아래와 같을 경우 컴파일 에러가 발생한다.

#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;
}

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v