• 4.4.1 using namespace
  • 4.4.2 사용 시 유의사항

4.4.1 using namespace

 

using namespace는 많은 C++ 개발자들이 사용하는 키워드이다. 해당 키워드를 사용해서 코드 타이핑할 때 네임스페이스를 쓰는 시간을 절약할 수 있다.

using namespace std;

대표적으로 std를 생략해서 코드를 작성할 수 있겠다.


4.4.2 사용 시 유의사항

 

편하게 하는만큼 사용할 때 주의해야 하는 부분들이 있다. 우선 using namespace를 선언한 순간 해당 선언 부분이 속한 블럭에서는 선언 이후 계속 적용된다는 점이다.

#include <iostream>

int main()
{
	using namespace std;

	cout << "Hello " << endl;

	return 0;
}

이처럼 main 함수 안에서는 std를 안쓰고 사용할 수 있지만 해당 함수 내부에서 선언한 것을 취소할 수 있는 기능은 주어지지 않는다. 따라서 적용시킬 부분만 적용되도록 최대한 사용하는 곳과 가까이 선언하자! 전역 위치에 선언하는건 좋지 않으니 위처럼 지역적으로 묶어서 사용하자. 또한 헤더 파일에 using namespace를 선언해버리면 해당 헤더 파일을 include하는 곳에 전부 영향을 미치니 헤더와 cpp로 분리하고 cpp에 선언해주는 습관을 가지자!

 

using namespace 대신 using만 사용하여 일부 함수들에 대해서만 생략을 적용시킬 수 있다.

#include <iostream>

int main()
{
	using std::cout;
	using std::endl;

	cout << "Hello " << endl;

	return 0;
}

 

아래처럼 namespace가 존재하고 using namespace를 사용하면 어떤 namespace의 my_var 변수를 사용하는지 모호해진다. 이때는 영역 지정 연산자(::)를 사용하여 소속을 확실히 해주자!

#include <iostream>

namespace a
{
	int my_var(10);
	int my_a(123);
}

namespace b
{
	int my_var(20);
	int my_b(456);
}

int main()
{
	using std::cout;
	using std::endl;

	using namespace a;
	using namespace b;

	cout << my_var << endl; // a와 b에 둘다 있으니 모호해짐
	cout << a::my_var << endl; // 영역지정 연산자를 통해 해결 가능

	return 0;
}

 

최대한 잘게 쪼개서 작은 영역에 using namespace가 영향력을 행사하도록 작성하는 것도 하나의 방법이다.

// using문과 모호성

#include <iostream>

namespace a
{
	int my_var(10);
	int my_a(123);
}

namespace b
{
	int my_var(20);
	int my_b(456);
}


int main()
{
	using std::cout;
	using std::endl;

	{
		using namespace a;
		cout << my_var << endl;
	}

	{
		using namespace b;
		cout << my_var << endl;
	}

	return 0;
}

C++를 처음 접하면 using이라는 키워드는 namespace를 코드에서 작성하기 귀찮아서 빼기 위해 사용하는 경우가 많다.

using namespace std;

하지만 typedef와 비교가 되는 사용법이 있어서 이번 포스팅으로 정리하도록 한다.


typedef를 활용한 변수 별칭 만들기

 

typedef를 사용하는 것은 자료형에 대해 별칭을 만들기 위함이다. 예를 들어 double에 대해서 거리라는 의미를 가지도록 하기 위해 사용한다. 이렇게 사용하는 것이 추후 거리를 의미하는 모든 변수가 float 자료형으로 변경되어야 할 때 한 줄만 바꾸면 되기 때문에 유지보수를 위해서도 사용하는 편이다.

typedef double distance_t;

using을 활용한 변수 별칭 만들기

 

using을 사용하는 것도 typedef를 사용하여 별칭 만드는 것과 목적은 같다. 사용하는 방법은 아래와 같다.

using distance_t = double;

typedef와 using의 차이점

 

C/C++를 사용하지 않는 프로그래머에게 코드를 보여주었을 때 using 키워드의 경우 직관적이라 가독성이 좋다. 그리고 가장 큰 차이점은 using 키워드는 template을 지원한다는 점이다.

template<typename T>
using distance_t = T; // 템플릿 사용 가능

template<typename T>
typedef T distance_t; // 템플릿 사용 불가능

C++ 11 이상이고 template을 사용하게 되는 경우 using 키워드를 사용하는 것이 더 좋을 것이다.


Reference

+ Recent posts