C++11부터 auto 키워드를 사용함으로써 컴파일러가 직접 어떤 변수의 초기화 단계에서 변수의 데이터 타입을 추론할 수 있다.

1. auto 키워드의 장점


코드가 보기 편해진다

/// 기존의 방법
// 명확하지만 보기 복잡하다
std::shared_ptr<::pplx::default_scheduler_t> s_ambientScheduler = std::make_shared<::pplx::default_scheduler_t>();

/// auto를 쓰는 방법
// 보기 훨씬 편하다
auto s_ambientScheduler = std::make_shared<::pplx::default_scheduler_t>();

이미 std::make_shared<::plx::default_scheduler_t>(); 에서 무엇을 만들 것인지 눈치를 챌 수 있다. ::pplx::default_scheduler_t 라는것의 shared pointer를 만들것인게 뻔하게 보인다.

그런데 기존의 방법에서는 내가 만들려고 하는 변수를 직접 적어줘야하는데, 그렇게 되면 std::shared_ptr<::pplx::default_scheduler_t> 같이 긴 변수가 나올 수 있다. 이게 단순히 shared pointer 하나가 아니라 복잡한 자료 구조 형태였다면, 훨씬 더 긴 코드가 나올 수도 있다.

뻔하게 데이터 타입을 알 수 있을 때, auto 키워드를 사용함으로써 1. 빠르게 코드를 작성하고 2. 편하게 읽을 수 있다.

특히나 iterator 쪽 코드가 진짜 보기 편해진다

// 코드 출처: <https://www.acodersjourney.com/c-11-auto/>

// Nested std::map이 있다고 해보자.
StudentGrades[L"Deb"][L"Physics"] = 96;
StudentGrades[L"Deb"][L"Chemistry"] = 92;
StudentGrades[L"Deb"][L"Math"] = 82;
StudentGrades[L"Vik"][L"Physics"] = 92;
StudentGrades[L"Vik"][L"Chemistry"] = 88;
StudentGrades[L"Vik"][L"Math"] = 91;

/// 기존의 iterator 방식
//
for (std::map<std::wstring, std::map<std::wstring, int>>::iterator outerMap_Iter = StudentGrades.begin(); outerMap_Iter != StudentGrades.end(); ++outerMap_Iter)
{
	// first 출력
	std::wcout << outerMap_Iter->first << std::endl;
	for (std::map<std::wstring, int>::iterator innerMap_Iter = outerMap_Iter->second.begin(); innerMap_Iter != outerMap_Iter->second.end(); ++innerMap_Iter)
	{
		// second 출력
		std::wcout << innerMap_Iter->first << " : " << innerMap_Iter->second << std::endl;
	}
	std::wcout << std::endl;
}

/// auto 키워드를 사용한 iterator 방식
//
for (auto outerMap_Iter = StudentGrades.begin(); outerMap_Iter != StudentGrades.end(); ++outerMap_Iter) 
{
  // first 출력
  std::wcout << outerMap_Iter->first << std::endl;

  for (auto innerMap_Iter = outerMap_Iter->second.begin(); innerMap_Iter != outerMap_Iter->second.end(); ++innerMap_Iter)
  {
	 // second 출력
	 std::wcout << innerMap_Iter->first << " : " << innerMap_Iter->second << std::endl;
  }
  std::wcout << std::endl;
}

/// Range-based for loop + auto 키워드를 사용한 iterator 방식
//
for (auto const &outer_iter : StudentGrades) 
{
  std::wcout << outer_iter.first << std::endl;

  for (auto const &inner_iter : outer_iter.second)
  {
	 std::wcout << inner_iter.first << " : " << inner_iter.second << std::endl;
  }
}

기존의 iterator 방식은 선언할 때 모든 정보를 다 적어줘야한다. 그렇기 때문에, 이러한 nested container가 있는 경우에는 엄청나게 길어지게 된다. 심지어 노트북 화면에 다 들어가지도 않는다. 이런 코드는 읽다가 쉽게 지치게 된다.

auto 키워드를 사용했을 때는 선언부에 모든 정보를 적지 않아도 된다. 변수 명을 outerMap_Iter로 적어주면, 눈치로 알아서 '아 이건 nested map의 바깥쪽 부분의 iterator구나' 라고 생각할 것이다. 변수명만 잘 적어주면 auto를 써서 코드를 줄일 수 있다.