[C++ 언어-막코딩] 21장 namespace 원리
[C++ 언어-막코딩] 21장 namespace 원리
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php
오늘은 내용은 namespace에 대해 알아보는 시간입니다. nameespace를 "using namespace std;"라는 명령을 그냥 사용하여 "std::cout"을 "cout"으로 표준 입출력을 사용할 수 있게 사용하겠다는 이름 정의정도로만 이해 했을 거에요. namespace은 이름공간으로 변수와 함수들을 묶어 놓은 형태로 하나의 하나의 묶음 영역으로 소속을 나타내는데 사용합니다. 그럼 이 namespace를 사용하여 그 의미를 살펴 볼까요.
1. namesapce란?
namespace는 변수, 함수들을 하나의 소속으로 묶어 높은 형태를 가리킵니다. 형태는 다음과 같습니다.
namespace 소속이름 {
변수;
함수;
}
보면 클래스와 비슷해 보일 거에요.
예)
namespace AAA {
int a;
int output(int b){
return a+b;
}
}
AAA라는 소속이름을 정의하고 그 안에 변수와 함수를 선언 했네요. 이 namespace로 선언 되었을 때 사용은 다음과 같습니다.
using namespace AAA;
이렇게 namespac AAA를 사용하겠다고 선언을 해야 합니다. 그리고 접근은 다음과 같이 접근을 할 수 있게 됩니다.
AAA::a;
AAA::output(3);
or
a;
output(3);
이렇게 "AAA::" 명칭을 붙여줘도 되고 안 붙여줘도 사용 할 수 있습니다.
주의할 것은 여러분들이 직접 만든 namesapce 소속에 선언된 변수가 main()함수 안에 중복 선언 되었을 경우에는 해당 main()함수 영역의 우선권이 있습니다. 그러면 원치 않은 결과가 발생 할 수 있기 때문에 여러분들이 직접 만든 형태는 해당 소속이름을 붙여주셔서 코딩하시길 바래요.
int main(){
int a=100;
cout<<AAA::a<<endl;
cout<<a<<endl;
return 0;
}
이렇게 출력하게 되면 a값은 AAA 소속이름에 선언 된 a값과 그냥 생략한 a값은 다릅니다. 소속이름으로 선언된 a값은 소속이름에서 선언된 값으로 출력 되지만 생략을 할 경우는 main()함수 안에 선언된 a값 100이 출력 됩니다. 이 부분은 전역변수와 지역변수의 개념으로 이해 하시면 될 듯 해요. 해당 영역에 선언 된 변수가 우선권을 갖는다고 생각 하면 될 거에요.
2. 코딩
이제 namespace를 실제 테스트를 해볼까요.
[전체소스]
#include <iostream>
namespace AAA{
int a=10;
int output(int b){
return a+b;
}
}
using namespace std;
using namespace AAA;
int main(int argc, char** argv) {
int a=300;
cout<<AAA::a<<endl;
cout<<a<<endl;
cout<<AAA::output(10)<<endl;
cout<<output(20)<<endl;
return 0;
}
각각 변수와 함수를 namespace로 선언 한뒤에 그 결과를 콘솔창에 출력해보면 다음과 같습니다.
[결과]
결과를 보시면 output()함수앞에 "AAA::" 생략해도 상관 없지만 a변수의 경우는 결과 값이 전혀 달라 집니다.
대충 이런 느낌으로 이해하시면 됩니다.
int a=10;
int main(){
int a=100;
cout<<a<<endl;
return 0;
}
이렇게 a가 전역변수로 선언 되었지만 main()함수 내 지역변수로 선언 된 a가 우선권으로 결과는 100이 출력 됩니다. 마찬가지로 namespace의 소속의 a보다 main()함수 내 변수가 우선권을 갖는 다는 점만 기억해 두세요.
마무리
오늘은 namespace의 사용 방법에 대해 알아 보았습니다. 이 표현은 잘 사용하지 않습니다. 클래스와 비슷하기 때문에 클래스로 표현하는 경우가 많기 때문입니다. 방금 위에서 실습한 내용에서 중복 사용 시 우선권의 부분도 고려해야 하기 때문에 클래스의 경우는 접근 제한을 두어 이런 문제에 대해 애초 발생하지 않습니다. 저도 예전에 배우기는 했던 건데 여러가지 코딩을 하면서 namespace라는 표현을 일부러 사용한 케이스가 없네요. 대개 클래스로 표현하여 써서 그런가 암튼 이런게 있다는 정도만 개념을 잡아 두시기 바랍니다.
안녕하세요 codingman님
랜덤 보팅!!
소소하게 보팅하고 가요
Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.
Thank you