C++을 어렵게 하는 요소 중에는 변수를 읽는 방법이 난해하다는 점이 있고, 그 비중은 꽤 클 것이다.
변수를 읽는 법은 입문 직후가 아니라 어느 정도 C++을 했다 싶은 사람들의 발목을 잡는다. 입문자는 int*가 무엇인지 모르지만 이건 포인터를 모르는 거지 이를 읽는 방법을 모르는 것이 아닐 것이다.
예를 들어보자. 포인터로 int 타입의 값을 인자로 넘겨받아 확인하고 싶다. 참조하는 값을 변경하고 싶지 않아서 const를 붙이려고 한다. 어떻게 써야 할까?
- const int *
- int * const
- int const *
- int const * const
정답은 2번을 제외한 전부이다. 결론만을 말하자면, 1번과 3번은 완전히 동일한 타입이고 4번 역시 참조만 목적이면 사용이 가능하다.
변수를 읽는 방법은 생각보다 간단하다. 변수 이름을 적는 오른쪽부터 왼쪽으로 읽어가면 된다. 구분은 참조(&)와 포인터(*) 단위로 하고, cv-identifier(const / volatile)은 타입의 앞 또는 뒤에 자유롭게 온다.
예를 들어, const char * const * A; 같은 미친 문법이 있다. 실제로 이런 문법을 쓰지는 않지만. A의 타입을 읽으면 다음과 같다.
A는 포인터(인데, 어떤 타입의 포인터냐면) const 타입의 포인터(인데, 어떤 타입의 포인터냐면) const char 타입.
잘이해가 가지 않는가? 그러면 C++11의 using(아니면 typedef)을 사용해서 구체화해보자.
using Type = const char;
using TypePtr =Type*;
using constTypePtr =const TypePtr;
using Ty = constTypePtr*;
Ty B;
B의 타입은 const char* const *가 된다. A와 동일하게 되는 것이다.
이 예제는 일부러 많이 나누기도 했지만, 너무 복잡하고 긴 타입은 using으로 간략화 하는 편이 정신건강과 생산성을 챙기는 방법이 될 것이다.











덧글