본문 바로가기
C │ C++ │ C#/C++

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

by Pokaa 2023. 8. 19.
728x90
728x90
SMALL
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 인지
    ο 알 수가 없기 떄문에 에러 ! !
        ■  네임스페이스 와
        ■  네임스페이스
        ■ 둘 다 동명의 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 안에 들어가서 판단이 어려워서 생기는 에러가 발생할 확률이 높아져서 !
728x90
300x250
LIST