자바스크립트의 var와같은 자료형을 정하지않고 쓸수있다.
단 C++에서는 한번정해진 자료형은 변경은 불가능하다.
따라서 선언과 동시에 초기화가 되어야된다.
또한 자료형은 컴파일 타임에 정해지게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | int main() { // 상수대입가능, 해당 상수의 자료형으로 정해진다. auto a = 1; // 변수대입가능, 해당 변수의 자료형으로 정해진다. int i = 5; auto b = i; // 주소값 대입가능, 해당 변수의 포인터자료형으로 정해진다. auto c = &i; int* p = &i; auto d= p; // 레퍼런스 대입가능, 레퍼런스는 auto뒤에 &를 붙여야 한다. auto& e = i; return 0; } | cs |
위처럼 단순대입으로 사용할 일은 거의 없을것이다.
아마도 유용하게 사용될때가 STL을 사용할 때 일것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <vector> int main() { std::vector<int> vecTmp; vecTmp.push_back(1); vecTmp.push_back(2); vecTmp.push_back(3); vecTmp.push_back(4); vecTmp.push_back(5); // 반복자를 사용 모든요소 출력 for (std::vector<int>::iterator iter = vecTmp.begin(); iter != vecTmp.end(); ++iter) { printf("%d \n", *iter); } } | cs |
위의 코드에서처럼 반복자(iterator)를 하나 쓸려면 적어야 할게 많다.
그래서 일반적으로 typedef를 많이 사용 했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <vector> typedef std::vector<int> VEC_INT; typedef VEC_INT::iterator VEC_INT_ITER; int main() { VEC_INT vecTmp; vecTmp.push_back(1); vecTmp.push_back(2); vecTmp.push_back(3); vecTmp.push_back(4); vecTmp.push_back(5); // 반복자를 사용 모든요소 출력 for (VEC_INT_ITER iter = vecTmp.begin(); iter != vecTmp.end(); ++iter) { printf("%d \n", *iter); } } | cs |
아까보단 일이 줄어들었지만 typedef를 작성하는것도 불편한점은 존재한다.
auto를 이용한다면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <vector> int main() { std::vector<int> vecTmp; vecTmp.push_back(1); vecTmp.push_back(2); vecTmp.push_back(3); vecTmp.push_back(4); vecTmp.push_back(5); // 반복자를 사용 모든요소 출력, auto 사용 for (auto iter = vecTmp.begin(); iter != vecTmp.end(); ++iter) { printf("%d \n", *iter); } } | cs |
std::vector<int>::iterator 대신에 auto를 쓰는것만으로 해결이 된다.
STL을 자주사용하는 사람들에겐 아주 유용하게 쓰일것으로 보인다.
auto를 쓰면 자료형을 알기가 어렵지 않냐고 할수 있지만 visual studio에서 해당변수의 실제 자료형을 친절히 알려주기 때문에 큰문제는 없다.
MSDN