Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

파이썬과 C++ 네임스페이스 비교: 직접 대응이 어려운 이유

파이썬과 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) 방식과 컴파일·실행 모델의 차이를 함께 고려하는 것이 올바른 접근입니다.