C++ Chapter 4.3 : using문과 모호성

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


using 쓰임새

  • using namespace std
    • std 네임스페이스 안에 있는 모든 것들을 std:: 안붙이고 그냥 사용할 수 있게 된다.
  • using std::cout
    • 오로지 cout 만 이제 std:: 생략 가능
  • using std::endl;
    • 오로지 endl 만 이제 std:: 생략 가능


using의 모호성

namespace a
{
	int my_var = 123;
	char aa = 'a';
}

namespace b
{
	int my_var = 123;
	char bb = 'b';
}

int main()
{
	using namespace std;

	using namespace a;
	using namespace b;

	cout << my_var << endl; // 에러 ! ! !
	
	cout << aa << endl; // 에러 X 
	cout << bb << endl; // 에러 X 
}
  • cout « my_var « endl;
    • 여기서의 my_var 이
    • a 의 my_var 인지
    • b 의 my_var 인지
    • 알 수가 없기 떄문에 에러 ! !
      • a 네임스페이스 와
      • b 네임스페이스
      • 둘 다 동명의 int my_var 변수를 갖고 있기 때문
    cout << a::my_var << endl;
    cout << b::my_var << endl;
    
  • 위와 같이 a:: b:: 를 붙여 구분할 수 밖에 없는데
    • 이러면 using namespace a, b; 쓰는 이유가 없다……
  • aa와 bb는 각각 a, b 네임스페이스에 있는게 명확히 구분히 되기 때문에 네임스페이스:: 안붙여도 에러 X
{
	using namespace a;
	cout << my_var << endl;  // 에러 X 
}

{
	using namespace b;
	cout << my_var << endl;  // 에러 X 
}
  • 이렇게 a 의 my_var 쓰는 범위 따로, b의 my_var 쓰는 범위를 {} 로 따로 분리해주면
  • using 원래 목적을 살려 a::, b:: 생략 가능
    • 첫번째 my_var 는 a의 my_var인게명확
    • 두번째 my_var는 b의 my_var인게 명확
using namespace b;
{
	using namespace a;
	cout << my_var << endl; // 에러 ! ! !
}
cout << my_var << endl; // 에러 X 
  • 첫번째 my_var이 a의 my_var인지 b의 my_var인지 알 수가 없으므로 에러
  • { } 범위에 더 큰 범위인 using namespace b; 의 영향도 미치기 때문


using의 위험성

  • 전역으로 선언하는 using 은 지양하는 것이 좋다.
    • 헤더 파일같이 많이 include 되는 파일에 using 문을 전역으로 넣어버리면 에러 생길 가능성이 높아진다.
      • using 의 모호성 때문에 동일한 이름의 변수끼리 같은 범위의 using namespace 안에 들어가서 판단이 어려워서 생기는 에러가 발생할 확률이 높아져서 !


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기