-
[C++] 네임스페이스C++/이것이 C++이다 2021. 2. 12. 00:05
네임스페이스란 C++의 각종 요소 (클래스, 함수, 변수)를 일정 [구역]으로 묶어주는 문법입니다.
네임스페이스를 이용하게 되면 자칫 중복될 수 있는 클래스, 함수, 변수의 이름들을
소속 네임스페이스라는 한단계 더 높은 그룹화가 가능해지므로
규모의 프로젝트에서의 협업이 한층 더 용이해질 수 있습니다.
1. 네임스페이스
더보기네임스페이스란 클래스, 함수, 변수에 소속을 지정해주는 문법입니다.
#include <iostream> namespace Sample{ int sample_data = 10; void function(){ std::cout << "Sample Function\n"; } } void main(){ std::cout << Sample::sample_data << "\n"; Sample::function(); }
10 Sample Function
위와 같은 방식으로, namespace블록 안에 정의한 함수, 변수가 해당 네임스페이스의 소속이 됩니다.
호출이나 참조시에는 :: 연산자를 이용합니다.
cout과 cin에서, 혹은 다른 C++템플릿 혹은 함수에서 봤을 std또한 네임스페이스 입니다.
2. using namespace
더보기네임스페이스는 중복될 수 있는 이름들에 대한 소속을 지정, 그룹화를 통해 팀업을 용이하게 하는 용도로 사용할 수 있습니다.
하지만, 그렇게 구성한 네임스페이스가 반대로 코드의 가독성을 해칠 수 있습니다.
using namespace 지시문은 그러한 가독성에 대한 보완점이 될 수 있습니다.
해당 지시문에 선언된 네임스페이스는 묵시적으로 선언된 것으로 취급합니다.
Example (using namespace std)
#include <iostream> using namespace std; void main(){ cout << "Hello World!\n"; }
Hello World!
하지만 가독성을 이유로 남용할 경우, 네임스페이스를 안 쓰는 것 만 못하는 경우가 생길 수 있습니다.
언제나 적절한 타협점을 잘 찾을 수 있도록 합시다.
3. 네임스페이스의 중첩
더보기상술했듯이, 네임스페이스는 '소속'을 나타내는 문법입니다.
하지만, '소속'이 한개여야만 한다는 규칙은 없습니다.
네임스페이스는 계단식으로 중첩이 가능합니다.
Example (네임스페이스의 중첩)
#include <iostream> namespace Sample1{ int sample_data = 10; namespace Sample2{ int sample_data = 20; void function(){ std::cout << "Sample2 Function\n"; } } namespace Sample3{ void function(){ std::cout << "Sample3 Function\n"; } } } void main(){ std::cout << Sample1::sample_data << "\n"; std::cout << Sample1::Sample2::sample_data << "\n"; Sample1::Sample2::function(); Sample1::Sample3::function(); }
10 20 Sample2 Function Sample3 Function
중첩된 네임스페이스는 그 자체로 설계의도를 담을 수 있다고 합니다.
하지만, 이 역시 소스코드의 가독성과 과도한 분할로 인한 개발 오버헤드가 발생할 수 있습니다.
적정 선에 대한 내용을 차후 다른 글에서 다룰 수 있으면 좋겠습니다.
4. 다중정의와 네임스페이스
더보기앞선 글 (함수 기본)에서 함수 오버로딩에 대한 이야기를 해 보았습니다.
매개변수의 타입, 개수 등에 차별을 둔, 같은 이름의 함수를 작성할 수 있다는 내용이었습니다.
이번 문단의 다중 정의는 함수 다중 정의와는 다릅니다.
본 항목의 핵심은, 네임스페이스가 다르다면 같은 함수가 있을 수 있다는 것 입니다.
Example (다중정의와 네임스페이스)
#include <iostream> void function(){ std::cout << "Function\n"; } namespace Sample{ void function(){ std::cout <<"Sample Function\n"; } } void main(){ function(); ::function(); // Line 15 Sample::function(); }
Function Function Sample Function
Line 15라고 된 주석이 있는 Line을 보면, :: 연산자 앞에 아무런 네임스페이스가 존재하지 않음을 볼 수 있습니다.
이것은 전역 네임스페이스라고 하며, 구조적으로 C++의 모든 함수, 변수는 전역 네임스페이스에 속한 것이 됩니다.
네임스페이스가 존재하지 않는 클래스, 함수, 변수가 없음에 유의합시다.
C++을 이용하면서 자주 사용하게 되는 네임스페이스로는 std가 있습니다.
그 외에 어떤 네임스페이스가 자주 사용되는지는 아직 잘 알지 못하지만
이것에 관한 글도 언젠간 쓸 수 있게 되기를 바랍니다.
다음 글은 '클래스' 가 될 것 같습니다.
짧지 않은 글 읽어주셔서 감사합니다.
'C++ > 이것이 C++이다' 카테고리의 다른 글
[C++] 클래스 기본 문법 1 (0) 2021.02.27 [C++] 클래스를 살펴보기 전에 (0) 2021.02.27 [C++] 함수 기본 (0) 2021.02.12 [C++] C와 C++ (0) 2021.01.29 [C++] 이 카테고리에서는 (0) 2021.01.29