C++에 추가된 네임스페이스(namespace) 기능은 일부 자연스럽게 사용하는 부분도 있고 잘 활용되지 않는 부분도 있습니다. 제일 많이 사용하는 것이 "using namespace std" 일 것입니다. STL을 사용하거나 cout 출력을 위해서 많은 프로그래머들이 사용하고 있습니다. 하지만 C++ 네임스페이스 사용에는 장점과 단점이 있습니다. 이에 대해 자세히 알아보겠습니다.
네임스페이스란 무엇인가?
"네임스페이스"라는 이름에서 알 수 있듯이 C++ 언어에서 각 이름들을 포함하는 공간의 개념입니다. 유사한 식별자(함수, 클래스, 상수 선언 등)를 함께 그룹화하는 논리적인 방법입니다. 기존에 C언어에서 모듈화 된 라이브러리를 하나로 묶을 때, 동일 이름에서 오는 심볼 충돌을 해결할 수 있는 방법으로 나오게 되었습니다.
가장 많이 사용하는 std 네임스페이스에 대해 좀 더 살펴봅시다.
using namespace std;
위 코드의 의미는 C++의 여러 내장 루틴을 선언하는 std로 알려진 네임스페이스의 모든 식별자들을 현재 코드 범위에 허용하는 것입니다. 이 선언 이후로는 std:: 를 붙이지 않고, cout, cin, endl, vector, map 등 다양한 클래스나 함수를 바로 사용할 수 있게 되는 것입니다. 확실히 편하긴 한데, 왜 사용해야 하고, 왜 사용하지 말아야 할까요?
네임스페이스의 장점
C++와 같은 언어에서 네임스페이스의 장점은 서로 다른 코드 모듈이 충돌에 대한 걱정 없이 변수, 메서드 등에 대해 원하는 이름을 사용할 수 있다는 것입니다. 그런데 만약 네임스페이스 이름을 매 코드 라인마다 입력하면 코드가 장황해질 수 있습니다. C++ 표준 라이브러리를 많이 사용하는 경우 표준 라이브러리에서 무언가를 사용할 때마다 "std::"를 앞에 입력해야 하는 것은 매우 중복되고 번거롭습니다.
그래서 많은 프로그래밍 서적에서 "using namespace std;"이라는 것을 가르쳐줍니다. 이것의 뜻은 컴파일러에게 "다른 namespace에 속해있지 않고 정의되어 있지 않은 선언(변수/함수) 라면 그 앞에 'std::'를 넣고 선언/정의를 찾을 수 있는지 확인해봐"라고 말하는 것의 의미입니다.
그래서
std::cout << "안녕하세요!" << std::endl;
대신에 단순하게
cout << "안녕하세요!" << endl;
로 표현할 수 있는 것입니다. 따라서 "using namespace" 사용의 장점은 전체적으로 코드가 더 짧아진다는 것입니다. 가독성도 올라가겠죠.
네임스페이스의 단점
하지만 문제는 충돌 가능성을 재도입한다는 것입니다. 서로 다른 namespace 간에 충돌을 방지하기 위해 만들었는데, 다시 충돌을 발생시킨다? 예를 들어 사용자가 작성한 코드가 존재했고 동일한 이름의 변수나 함수가 std 네임스페이스에도 존재한다고 생각해 봅시다. 이후 사용자가 "using namespace std;"를 추가한 순간, 해당 변수나 함수가 의도와 다른 코드를 참조하게 될 수 있습니다. 혹은 충돌로 컴파일 에러가 발생할 수도 있고요. 이러한 종류의 이름 충돌은 발견하기 정말 어려운 버그를 유발할 수 있습니다.
결론
그래서 "using namespace std;"의 사용이나 using namespace의 사용은 좋은 습관은 아닙니다. 입문용 프로그래밍 서적에서 예제 코드에서 알려주기에 자연스럽게 사용하게 된 분들이 많습니다. 물론 실제 현업에서도 아주 가끔 사용할 것이지만, 긴 프로그램을 작성하기 시작할 때 알지도/기억하지도 못하는 모든 식별자를 전체 식별자 집합을 포함시키는 것은 좋은 선택이 아닙니다. 이후에 잠재적으로 겪게 될 수많은 충돌을 예상하기도 힘듭니다. 실제로 경험 많은 C++ 프로그래머들이 권장하지 않으며, 필요한 경우 std::를 꼭 붙여서 사용하는 데에는 이유가 있습니다.
▼ 관련된 같이 읽을 만한 글들
'개발일기 > 설계와디자인' 카테고리의 다른 글
const_iterator와 iterator의 차이점? 성능 차이는? (0) | 2021.11.09 |
---|---|
std::vector 와 std::array 중 어떤 것을 사용할지의 선택 기준 (0) | 2021.11.06 |
std::vector<T>::const_iterator 사용방법 설명 (0) | 2021.11.06 |
댓글