파이썬과 C++의 네임스페이스, 왜 직접 비교하기 어려운가?
파이썬과 C++의 네임스페이스(namespace)는 개념 자체가 다르기 때문에 사실상 직접 비교하기 어렵습니다. C++의 네임스페이스는 컴파일 시점에 동작하는 정적 구조인 반면, 파이썬의 모듈과 네임스페이스는 실행 시점에 객체로 관리되는 동적 구조이기 때문입니다. 예를 들어 C++에서 다음과 같은 헤더 파일을 생각해 보겠습니다.
// a.h
namespace ns {
struct A { .. };
struct B { .. };
}
여기서 특정 타입만 골라 한정자 없이 사용하고 싶다면 다음과 같이 작성할 수 있습니다.
#include "a.h"
using ns::A;
이 코드의 핵심은 이후 코드에서 A를 한정자(qualifier) 없이 그대로 쓸 수 있다는 점입니다. 즉, 매번 ns::A라고 길게 작성하지 않아도 됩니다.
파이썬의 유사 문법과 결정적인 차이
언뜻 보면 파이썬의 다음 코드가 이에 해당한다고 생각할 수 있습니다.
from a import A
그러나 여기에는 중요한 차이가 숨어 있습니다. C++에서는 using 선언을 하더라도 a.h 헤더 전체가 여전히 포함되어 컴파일되기 때문에 ns::B 역시 계속 접근할 수 있습니다. 반면 파이썬 버전에서는 A만 현재 스코프로 가져왔으므로 a.B는 보이지 않습니다. 즉, C++의 using은 '이름 별칭'에 가깝고, 파이썬의 from ... import ...는 실제로 필요한 객체만 선택적으로 가져오는 방식입니다.
'using namespace'에는 파이썬 대응물이 없다
C++의 또 다른 형태인 다음 구문은 파이썬에 정확히 대응하는 문법이 없습니다.
using namespace ns;
이 구문은 네임스페이스 ns 안의 모든 이름을 코드 전반에 걸쳐 끌어오며, C++의 네임스페이스는 여러 파일에 걸쳐 재사용(확장)될 수도 있습니다. 대표적인 예가 표준 라이브러리입니다.
#include <vector>
#include <map>
#include <algorithm>
using namespace std; // 모든 것을 가져온다
이 한 줄은 기능 면에서 대략 다음과 비슷하다고 볼 수 있습니다.
from vector import *
from map import *
from algorithm import *
동작 방식은 유사해 보이지만, 실제로는 std 네임스페이스에 속한 이름들만 가져오는 것이지 해당 헤더의 모든 내용을 가져오는 것은 아닙니다. 게다가 using namespace std;처럼 넓은 범위의 이름을 무분별하게 가져오면 이름 충돌 위험이 커지므로, 실무에서는 using ns::A;처럼 필요한 이름만 지정하거나 네임스페이스 한정자를 명시적으로 붙이는 것이 권장됩니다.
핵심 정리
결국 C++의 using 선언과 파이썬의 import는 표면적으로 비슷해 보일 뿐, 포함 범위와 동작 시점이 근본적으로 다릅니다. 따라서 두 언어의 네임스페이스를 단순히 1:1로 매핑해 이해하기보다는, 각 언어의 이름 해석(name resolution) 방식과 컴파일·실행 모델의 차이를 함께 고려하는 것이 올바른 접근입니다.