위 포스팅 내용은 윤성우의 열혈 C++ 책을 참고하였습니다.
C를 배우고 갓 C++을 입문하신 분들은 처음 C++소스코드를 접할 때
std::cout<< , std::cin>> 등의 입출력문과 <iostream> 헤더파일 말고도 다양한 새로운 문법들을 마주하게 되는데요
namespace도 그 중 하나입니다.
처음볼 때는 생소할 수 있지만, 몇 번만 반복해서 보다보면 금방 익숙해지는 개념입니다.
namespace란 이름 그대로 '공간에 이름을 붙여논다' 라고 이해하면 쉽습니다.
Q. 그렇다면 namespace는 왜 필요한 걸까요?
친구랑 만나기로 약속했다고 가정해봅시다.
A: 토요일 두 시에 스타벅스에서 만나자~~
B: 어디 스타벅스?
A: 신촌 거기 있잖아?
B: 거기가 어디야?
위는 고구마 백개먹은 것 같은 대화입니다.
A와 B가 어디 스타벅스인지 서로 정확하게 의사소통 전달이 안 되는 원인은
1.신촌에 스타벅스가 여러개 있다.
2. "위 구역에 존재하는 유일한 스타벅스" 를 지칭하지 않았다.
위와 같은 이유 때문입니다.
따라서 위 상황에서 A는 4번출구 방향 스타벅스 라고 스타벅스에 namespace를 부여해 주어야 합니다.
namespace를 사용하는 방법은 위와 같습니다.
namespace 뒤에 원하는 이름을 붙여주고 괄호 안에 내용을 작성해주시면 됩니다.
예시를 보시면 Exit() 라는 똑같은 함수가 선언되었는데 에러가 나지 않는 모습을 확인할 수 있습니다.
그 이유는 다른 namespace 안에 소속되어 있기 때문입니다.
어느 namespace안에 있는 함수인지 지칭할 때는 바로 연산자 :: 를 활용하여
NAMESPACE명 :: 함수명( );
라고 명명해주면 됩니다.
Q. namespace 안에 namespace를 중복해도 써도 되나요?
생각해보면 4번출구와 8번출구에 있는 스타벅스는 한 둘이 아닐 것입니다. (합정에도 있고,, 홍대에도 있고..)
그렇기 때문에 우리는 정확한 위치를 명시하기 위해서는 더 많은 namespace가 필요한데요
따라서 저는 4번출구와 8번출구를 신촌이라는 namespace로 감싸주었습니다.
물론 신촌이라는 namespace는 서울, 서울이라는 namespace는 한국으로 더 많이 중복해서 감쌀 수 있겠죠?
내부의 변수나 함수에 접근하려면 아까와 같이 ::연산자를 사용하면 됩니다.
KOREA :: SEOUL :: SHINCHON :: EXIT8 :: Exit();
이것이 좀 길다면 이름공간에 대한 별칭을 지어줘도 됩니다.
namespace 신촌팔출=KOREA :: SEOUL :: SHINCHON :: EXIT8;
그러면 호출할 때 신촌팔출::Exit(); 로 축약을 할 수 있습니다.
사실 우리는 C++에서 입출력을 했다면 이전부터 namespace를 쓰고 있었을 것입니다.
std::cout , std::cin 에서 std가 바로 namespace이기 때문입니다.
헤더파일인 <iostream>에 선언된 std라는 namespace에서 우리가 그동안 입출력 함수를 불러와 쓰고 있었던 것입니다.
Q.근데 사실 맨날 std::를 붙이기 좀 귀찮은 것 같아요...
아마 많은 분들이 그간 std:: 를 붙이는데 많이 귀찮으셨을 거라 생각됩니다...(사실 저도..)
std namespace를 using이란 키워드를 이용하여 헤더 밑(전역부분) 에 선언을 하면
앞으로 일일히 std::를 붙이지 않아도 됩니다.
하지만 만약 이것도 세줄이나 된다! 하시는 분들은 더 생략할 수도 있습니다.
위의 예시처럼 아예 std전체를 using으로 선언해버리면 됩니다.
아주 편해보이지만 , 첫 번째 예시보다는 이름이 충돌할 가능성이 높아지기 때문에 무조건 좋다고만 할 수는 없습니다.
오늘은 namespace에 대하여 알아봤습니다.
여기까지 읽어주셔서 감사합니다.
'Programming Language > C++' 카테고리의 다른 글
[C++이론] C++에서의 함수오버로딩 (0) | 2020.07.17 |
---|---|
[C++이론] C++에서의 입출력방식 (2) | 2020.07.17 |