namespace
이름공간이란 코드에 이름을 붙여주기 위한 장치라고 생각하면 좋다.
예를 들어 두 개의 팀이 협업을 할 때 서로의 팀에서 변수나 함수명이 겹치는 것을 방지하기 위해서 사용할 수 있다.
예를 들어 팀 A와 팀 B의 코드를 구분하기 위해 두 개의 네임스페이스를 코드로 작성해보겠다.
namespace TeamA
{
int a;
int b;
int sum(int a, int b)
{
return a + b;
}
}
namespace TeamB
{
int a;
int b;
int c;
int sum(int a, int b, int c)
{
return a + b + c;
}
}
위와 같이 네임스페이스를 선언하면 같은 변수라도 구분해서 사용하는 것이 가능하다.
네임스페이스로 구분한 변수나 함수를 사용하기 위해서는 :: 연산자를 사용한다.
네임스페이스의 이름 뒤에 :: 연산자를 붙이고 사용할 변수나 함수명을 작성하면 된다.
이를 코드로 작성해보면 다음과 같다.
std::cin >> TeamA::a;
std::cin >> TeamA::b;
std::cout << TeamA::sum(TeamA::a, TeamA::b) << std::endl;
std::cin >> TeamB::a;
std::cin >> TeamB::b;
std::cin >> TeamB::c;
std::cout << TeamB::sum(TeamB::a, TeamB::b, TeamB::c) << std::endl;
최종적으로는 아래 코드와 같이 완성할 수 있을 것이다.
#include <iostream>
namespace TeamA
{
int a;
int b;
int sum(int a, int b)
{
return a + b;
}
}
namespace TeamB
{
int a;
int b;
int c;
int sum(int a, int b, int c)
{
return a + b + c;
}
}
int main()
{
std::cin >> TeamA::a;
std::cin >> TeamA::b;
std::cout << TeamA::sum(TeamA::a, TeamA::b) << std::endl;
std::cin >> TeamB::a;
std::cin >> TeamB::b;
std::cin >> TeamB::c;
std::cout << TeamB::sum(TeamB::a, TeamB::b, TeamB::c) << std::endl;
return 0;
}
이름공간에서의 함수 선언과 정의 구분
네임스페이스 기반에서 함수를 선언할 때에도 선언과 정의를 구분할 수 있다.
네임스페이스 안쪽에서 함수의 선언을 진행하고 네임스페이스 바깥쪽에서 정의를 진행하면 된다.
정의를 할 때에는 함수명 앞쪽에 네임스페이스의 이름을 :: 연산자를 통해 명시해주면 된다.
이를 코드로 확인해보면 다음과 같다.
namespace TeamA
{
int sum(int a, int b);
}
int TeamA::sum(int a, int b)
{
return a + b;
}
이 때 같은 네임스페이스에서 정의된 변수나 함수 등은 네임스페이스 명시없이 사용이 가능하다.
이를 코드로 확인해보면 다음과 같다.
#include <iostream>
namespace TeamA
{
int a = 10;
int b = 20;
int sum();
void print();
}
int main()
{
std::cout << TeamA::sum() << std::endl;
return 0;
}
int TeamA::sum()
{
print();
return a + b;
}
void TeamA::print()
{
std::cout << " TeamA Sum함수 " << std::endl;
}
TeamA::sum() 을 정의할 때 변수 a, b와 print() 함수를 네임스페이스 명시 없이 사용하는 것을 볼 수 있다.
이름공간의 분리
네임스페이스는 둘 이상의 영역에 나눠서 선언하는 것도 가능하다.
namespace TeamA
{
int a = 10;
int b = 20;
}
namespace TeamA
{
int sum();
void print();
}
공간이 분리되었더라도 네임스페이스의 이름이 같다면 동일공간으로 간주한다.
이름공간의 중첩
네임스페이스를 중첩하여 사용하는 것 또한 가능하다.
namespace TeamA
{
namespace var
{
int a = 10;
int b = 20;
}
namespace func
{
int sum();
void print();
}
}
중첩된 공간에 접근하는 방법도 간단하다.
가장 바깥쪽 네임스페이스부터 ::연산자를 통해 접근해주면 된다.
따라서 sum 함수를 실행시키려고 한다면 다음과 같이 작성할 수 있을 것이다.
TeamA::func::sum();
그러나 중첩을 통해 변수와 함수를 분리함에 따라 함수를 선언할 때 변수의 이름공간을 명시해줄 필요가 생겼다.
따라서 전체적인 코드는 다음과 같이 바뀔 것이다.
#include <iostream>
namespace TeamA
{
namespace var
{
int a = 10;
int b = 20;
}
namespace func
{
int sum();
void print();
}
}
int main()
{
std::cout << TeamA::func::sum() << std::endl;
return 0;
}
int TeamA::func::sum()
{
print();
return TeamA::var::a + TeamA::var::b;
}
void TeamA::func::print()
{
std::cout << " TeamA Sum함수 " << std::endl;
}
'C++ > C++ 문법' 카테고리의 다른 글
[C++] C++에서 C언어 헤더파일 호출 (0) | 2024.03.09 |
---|---|
[C++] 인라인 함수 (inline function) (0) | 2024.03.01 |
[C++] 디폴트 매개변수 (Default Value, Default Parameter) (0) | 2024.02.09 |
[C++] 함수 오버로딩 (0) | 2024.02.09 |
[C++] 지역변수 선언에 있어서 C언어와의 차이 (0) | 2024.01.31 |