개발/C++

[C++]using namespace std

ash_ 2022. 1. 10. 16:25

학교에서 C++로 코딩을 처음 배울때,

#include <iostream>
using namespace std;

이 두 문장은 뜻도 모르고 외우라던 교수님의 말씀에, 그뒤로 C++ 코드를 작성할 땐 항상 이렇게 썼었다.

그런데 이제 제대로 C++을 공부하려다보니 다들 using namespace 를 안쓰고 std:: 으로 쓰는걸 보고 이제서야 namespace 가 뭔지 공부하게 되었다.....

namespace (이름공간)

using namespace std; 를 쓰지 않고 표준 함수를 사용하려면

#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
    return (0);
}

이처럼 쓰려는 함수 앞에 std:: 을 붙여야 한다.

 

std는 C++ 표준 라이브러리의 모든 함수와 객체 등이 정의된 이름공간(namespace)이다.

 

namespace란 말 그대로 정의된 객체의 소속을 지정해주는 것과 동일하다.

 

코드의 크기가 늘어남에 따라 중복된 이름을 가진 함수들이 많아지고, C++에서는 이를 구분하기 위해 같은 이름이라도 소속된 namespace가 다르면 다른 함수로 취급하게 되었다. 따라서 만약 std::cout 에서 std:: 가 빠지게 되면, 컴파일러는 어느 namespace에 소속된 cout인지 찾지 못한다.

 

이런 namespace는 사용자가 추가할 수도 있다. 만약 'header1.h' 에 있는 함수 foo 가 header1 이라는 namespace에 소속되어있다면,

#include "header1.h"

int func() {
    header1::foo();
}

라고 사용할 수 있다.

 

만약 '나는 앞으로 header1이란 namespace에 있는 foo만 쓸거다' 라고 선언할 경우,

#include "header1.h"

using header1::foo;
int main() {
    foo();
}

위의 코드처럼 선언할 수 있다.

 

뿐만아니라 모든 코드에서 'header1' namespace 안에 정의된 모든 것들을 header1:: 없이 사용하고 싶다면

#include "header1.h"

using namespace header1;
int main() {
    foo();
}

처럼 선언하여 사용할 수 있다.

 

따라서 using namespace std; 는 std namespace 안의 모든 것들을 전체 영역에서 사용하겠다고 선언한 것이다.

 

주의사항

하지만 이같은 선언은 권장되지 않는데, 만약 std 안의 함수와 이름이 겹치는 함수를 만들게 된다면 오류가 발생하기 때문이다. C++ 표준 라이브러리는 매우 거대하므로, 정말 많은 함수들이 존재하고 있고 매번 수많은 함수들이 새롭게 추가되기 때문에 자칫 잘못하다가 이름을 겹치게 사용한다면, 이를 고치느라 많은 시간과 비용이 발생할 것이다.

 

따라서 권장하는 방식은 std namespace의 함수를 사용할 때마다 앞에 std:: 를 직접 명시해주는 것이다.

 


참고자료- https://modoocode.com/136

'개발 > C++' 카테고리의 다른 글

[C++] Google C++ Style Guide  (1) 2022.01.10