숏컷 코드
cpp
namespace myapp {
void init() { }
int version = 1;
}
myapp::init(); // 완전한 이름(qualified name)
using myapp::init; // 특정 이름만 가져오기
init(); // 이제 init() 직접 사용 가능문법
네임스페이스가 필요한 이유 — 이름 충돌 방지
대형 프로젝트에서는 여러 라이브러리가 같은 이름의 함수를 정의할 수 있습니다. 네임스페이스는 이름을 논리적 그룹으로 묶어 충돌을 방지합니다.
cpp
namespace graphics { void draw(); }
namespace audio { void draw(); } // 같은 이름, 다른 네임스페이스
graphics::draw(); // 정확히 어떤 draw인지 명확
audio::draw();using namespace std를 헤더에서 쓰면 안 되는 이유
using namespace std는 std 안의 모든 이름을 현재 스코프로 가져옵니다. .cpp 파일 함수 안에서는 영향이 제한적이지만, 헤더에 넣으면 이 헤더를 포함하는 모든 파일로 전파되어 이름 충돌을 유발합니다.
cpp
// ❌ 헤더에 using namespace std — 포함하는 모든 파일 오염
// my_lib.h
using namespace std;
// 이 헤더를 include한 모든 파일에서 std 이름이 전역으로 노출
// ✅ .cpp 파일 함수 안에서는 허용 (영향 범위 제한)
void my_func() {
using namespace std;
cout << "hello\n"; // 이 함수 안에서만 적용
}
// ✅ 필요한 이름만 선언으로 가져오기
using std::cout;
using std::string;중첩 네임스페이스와 익명 네임스페이스
C++17부터 :: 로 중첩 네임스페이스를 한 줄에 선언할 수 있습니다. 익명 네임스페이스는 파일 내부에서만 접근 가능한 static과 같은 효과를 줍니다.
cpp
// C++17 중첩 네임스페이스
namespace myapp::core::utils {
void helper() { }
}
// 익명 네임스페이스 — 파일 내부 한정
namespace {
void internal_helper() { } // 다른 .cpp에서 접근 불가
int internal_state = 0;
}체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 특정 이름 한 번만 사용 | ns::name (완전한 이름) |
| 특정 이름 자주 사용 | using ns::name |
| .cpp 함수 안에서 편의상 | using namespace ns (스코프 제한) |
| 헤더 파일 | using namespace 금지, ns:: 사용 |
| 파일 내부 전용 함수/변수 | 익명 네임스페이스 namespace { } |
주의할 점
using namespace std를 헤더 파일에 넣으면 해당 헤더를 include하는 모든 파일에 이름 오염이 전파됩니다.
cpp
// ❌ 헤더에 전역 using namespace
// utils.h
#include <algorithm>
using namespace std; // max, min, find 등이 전역으로 노출
// main.cpp
#include "utils.h"
// 이제 std::max가 전역에 있어 다른 max 함수와 충돌 가능
// ✅ 헤더에서는 항상 std:: 접두사 사용
// utils.h
std::string format(const std::string& s);참고 링크
1 sources