본문 바로가기

Programming/CPP11&14

[C++11] auto 키워드

반응형

기존 auto 키워드는 기억 클래스 지정자(storage-class specifier)였습니다.

기존 auto는 그 의미가 없기 때문에 거의 사용되지 않았습니다.

// 같은 의미입니다.
auto int x = 0;
int x = 0;

스크립트 언어들과 달리 C++은 타입을 중요하게 여깁니다.

C#에서는 var라는 키워드를 통해서 명시적 타입없이 변수를 만들 수 있습니다.

var x = 0; 과 같이 선언이 가능합니다.

C#에서의 var는 동적 타입 언어와 달리 컴파일 시간에 타입을 결정합니다.

C++11에서 auto는 기억 클래스 지정자가 아닌 동적으로  타입을 정할 수 있게 변경되었습니다.

C++에서 STL을 사용하면 타입명 자체가 길어지는 경우가 생깁니다.

std::vector< std::vector<int> >::iterator it = ptWord.begin();

위와 같은 코드를 C++11의 auto 키워드를 사용하면 다음과 같이 줄일 수 있습니다.

auto it = ptWord.begin();

auto는 코드가 짧아지고 가독성이 좋아지는 장점이 있습니다.

auto가 유용하게 쓰일 부분은 위에서 보이는 것과 같이 STL입니다.

STL은 사용은 편리하지만 소스 코드의 가독성이 많이 떨어지는데

위와 같이 줄일 수 있기 때문에 가독성 문제도 많이 해결이 될 것으로 보입니다.

다만 기존과 같이 auto int x = 0; 이런 형태는 이제 C++에서는 사용이 불가능합니다.

VS 2010에서는 다음과 같은 에러를 출력합니다.

error C3530: 'auto' cannot be combined with any other type-specifier

auto 키워드의 다른 장점은 C#과 같이 러닝 타임이 아닌 컴파일 타임에 타입을 결정하는 것입니다.

컴파일 타임에 처리하기 때문에 auto 키워드를 사용해서 선언해도 성능의 저하가 없습니다.

auto로 변수를 선언할 시에 초기화를 하지 않으면 다음과 같은 에러가 납니다.

error C3531: 'a': a symbol whose type contains 'auto' must have an initializer

초기화할 때 타입이 정해지기 때문입니다.

auto는 const나 *(포인터), &(레퍼런스) 타입으로도 생성이 가능합니다.

const auto* pX = &x;

이런 식으로도 선언이 가능합니다.

마지막으로 auto 키워드를 기존 C 형식으로 기억 클래스 지정자로 사용하는 방법입니다.

프로젝트 속성(Alt + F7)로 들어가셔서 좌측에서 C++의 Command Line을 선택해서 다음과 같이 써줍니다.

기존의 auto가 큰 의미가 없는 키워드이기 때문에 /Zc:auto 옵션은 사용하지 않는 것이 좋습니다.

반응형