C++0x 미리보기 11, auto의 새로운 용법

류광, 2009/05/08 20:00
타이핑과 삽질을 줄이는 auto(의 새로운 용법)를 소개합니다.
  • 제안의 명칭: Deducing the type of variable from its initializer expression
  • 제안자: J. Ja:rvi, B. Stroustrup, G. Dos Reis
  • 관련 문서: N1984

아마도 C++0x에서 가장 인기 있는 기능이 auto일 것입니다. auto를 잘 말해주는 예로, 현재(C++03)는

for (vector<string>::const_iterator it = v.begin(); it!=v.end(); ++it)

라고 써야 하는 것을 C++0x에서는

for (auto it = v.begin(); it!=v.end(); ++it)

라고 쓸 수 있습니다. (물론 이런 루프라면 범위 기반 for를 사용하는 게 더 낫겠지만요.)

그런데 이 예는 “타이핑 줄이기”에 해당합니다. 즉, 답을 알긴 알지만(STL을 적극적으로 사용하는 프로그래머라면 v.begin()의 반환 형식을 이미 외우고 있겠지요) 적기가 귀찮을 뿐인 상황입니다. auto는 이런 단순한 타이핑 줄이기보다는, 답 자체를 알아내거나 표현하는 게 힘든 상황에서 더욱 빛을 발합니다. 예를 하나 들자면(http://www.research.att.com/~bs/C++0xFAQ.html#auto에서 인용):

template<typename T, typename U>
void f(const vector<t>& vt, const vector<u>& vu)
{
	// ...
	auto tmp = vt[i]*vu[i];
	// ...
}

auto가 없다고 할 때, 임의의 형식의 두 값을 곱한 결과의 형식을 표현하려면 템플릿 메타프로그래밍이 필요합니다. 이를테면:

	typename ProductType<T,U>::type tmp = vt[i]*vu[i];

두 형식의 곱의 가장 자연스러운 형식을 돌려주는 ProductType<T,U>라는 메타 함수를 만드는 게 아주 어려운 일은 아니겠지만, 코드에서 하고자 하는 일의 간단함에 비하면(그냥 두 수의 곱을 구하는 것일 뿐인데!) 좀 과하지 않을까요. Boost에 이미 있을 수도 있습니다만...

심지어, T와 U가 명시적으로 드러나 있다고 해도 쉽지가 않습니다. 다음에서 ???는 무엇이 되어야 할까요?

void f(const vector<int>& a, vector<float>& b)
{
	// ...
	??? tmp = vt[i]*vu[i];
	// ...

int와 float을 곱한 결과를 최대한 정확하게 보존하되 메모리를 너무 낭비하지는 않은 형식이 무엇인지를 알려면 C++ 표준도 봐야 하고 구체적인 컴파일러의 문서화도 봐야 할 것입니다. 그러나 auto가 지원된다면 고민할 필요가 없습니다.

auto의 유용함은 이 정도로 하고, 몇 가지 세부적인 사항들을 이야기하자면:

  • *나 &, const도 통상적인 방식대로 적용할 수 있습니다:
auto* p = new SomeLengthyName(); // p의 형식은 SomeLengthyName*
int f();
const auto& x = f(); // x의 형식은 const int&
  • short, long, unsigned, singed 등과 함께 사용할 수 있습니다. 물론 뜻이 통하는 경우에만 해당합니다. 예를 들어 long auto s = string("foo");는 안 됩니다(long string이라는 것은 없으므로).
  • auto의 기존 용법, 즉 주어진 변수가 자동 변수(지역 변수)임을 명시하는 용법은 폐기됩니다:
void f()
{
	auto int i = 0; // C++0x에서는 오류

	//...
}
  • N1984에 제안된 표준 문구를 보면 “A member shall not be declared with auto, extern or register storage class.”라고 되어 있으나, 이것이 멤버 선언에 auto라는 키워드를 사용하면 안 된다는 뜻은 아닌 것으로 보입니다. 단지 이것은 클래스의 멤버를 선언할 때 특정한 저장 부류를 지정할 수 없다는 뜻일 뿐이라고 봐야 할 것입니다.
  • 이렇게 편리한 것이 이제야 도입되었다는 게 이상할 수도 있겠는데, http://www.stroustrup.com/C++11FAQ.html#auto를 보면 BS는 이런 기능을 벌써 1984년에 구현했었지만 C와의 호환성 때문에 포기할 수밖에 없었다고 합니다. 호환성 문제가 된 것은 C의 "암묵적 int" 규칙(형식이 지정되지 않으면 int로 간주한다는)이었는데, C99에 와서야 그 규칙이 사라졌습니다.

다음 회에서는 auto의 형제라 할 수 있는 decltype을 다루겠습니다.

top
TAG ,
트랙백 0 : 의견 # + 8

Trackback Address :: http://occamsrazr.net/tt/trackback/216

comments powered by Disqus

(2013년 11월 10일자로 블로그에도 DISQUS 시스템을 도입했습니다. 기존 의견의 수정, 삭제, 댓글 추가는 여전히 가능합니다.)

  1. 샘이 2009/05/08 21:57 PERMALINKMODIFY/DELETE REPLY

    다른건 몰라도 이 기능은 축복이네요.




  2. all2one 2009/05/08 22:10 PERMALINKMODIFY/DELETE REPLY

    잘 정리하셨네요. 잘 읽고갑니다. ^^




  3. 류광 2009/05/10 23:33 PERMALINKMODIFY/DELETE REPLY

    꾸준히 올리겠습니다~



  4. 초보 2009/05/16 21:08 PERMALINKMODIFY/DELETE REPLY

    C++ 에 드디어 타입추론 기능이 들어가는군요.
    (java에 이 기능이 없는 것에 상심하여 scala 에 한쪽발을 담근 1인...)



  5. 임수서룬뫼 2009/05/23 11:13 PERMALINKMODIFY/DELETE REPLY

    우왓. 최강이닷.




  6. 개똥이 2009/05/28 16:56 PERMALINKMODIFY/DELETE REPLY

    흠 괜찮은데요... 하지만 후배 프로그래머들이 이렇게 편한것들을 계속 공부하게 되면 점점 파워 프로그래머들이 줄어들지 않을지 않을까요??? 편한만큼 새로운 문제에 대한 대처도 느려질것 같네요...




  7. 류광 2009/05/30 19:19 PERMALINKMODIFY/DELETE REPLY

    비율은 줄겠지요...



  8. 최익필 2009/06/14 15:18 PERMALINKMODIFY/DELETE REPLY

    BOOST_AUTO 를 써서 그런지, 무척 기대 됩니다. ^^