본문 바로가기
  • 기록
알고리즘

[C++] namespace

by juserh 2022. 1. 18.

알고리즘 공부를 c++로 하면서 문제 코드를 작성할 때마다

using namespace std;

를 꼭 붙였다. 그러다 문득 내가 그게 정확히 어떤 의미인지도 모르고 적고 있다는 사실을 깨달았고 찾아보았다.

 

https://docs.microsoft.com/ko-kr/cpp/cpp/namespaces-cpp?view=msvc-170

 

네임스페이스 (C++)

자세한 정보: 네임스페이스(C++)

docs.microsoft.com

 

네임스페이스

내부 식별자(형식, 함수, 변수 등의 이름)에 범위를 제공하는 선언적 영역
코드를 논리 그룹으로 구성하고 특히 코드베이스에 여러 라이브러리가 포함된 경우 발생할 수 있는 이름 충돌을 방지하는데 사용된다

 

namespace A{
	void print(){
    	std::cout << "It is A" << std::endl;
    }
}
namespace B{
	void print(){
    	std:cout << "It is B" << std::endl;
    }
}

네임스페이스 A와 B 안에는 다른 내용을 출력하는 print()함수가 선언되어 있는데 이를 내부 식별자 간의 충돌없이 사용하려면,

int main(){
    A::print();
    B::print();
    
    return 0;
}

네임스페이스를 사용하여 이렇게 코드 영역을 선언해주어야 한다.

 

std클래스의 cin, cout은 문제를 풀 때 워낙 자주 사용되기 때문에 이를 매번 std::cin, std::cout으로 적는게 귀찮아서 네임스페이스로 내부 식별자 영역 정의를 생략하고 싶을 때, using 지시문을 사용한다.

using namespace std; 로 std 내부 함수들을 사용할 때 std::부분을 적지않고도 사용할 수 있게 된다는!

 

위 코드에서 A::를 생략하고 싶다면,

using namespace A;
int main(){
    print(); //A의 print()
    B::print(); //B의 print()
    
    return 0;
}

 

그런데...사실 웬만하면 using 지시문을 사용하지 않는 것이 좋다고 한다. 예상치 못하게 변수명이나 함수명이 겹치는 경우가 발생할 수 있다고.....그렇다고 한다.