auto 타입 추론
C++ 11, auto 기본 설명
auto 키워드는 c++ 11 이후에 새롭게 태어났다.
auto 키워드?
주로 타입 추론 , 데이터 타입 추론 , 자동 데이터 추론 , 초기화 값에 따라 알아서 데이터 타입을 정해주는 키워드 라고 불린다.
•
auto 키워드는 선언한 변수나 람다식의 타입을 컴파일러에게 추론하도록 맡긴다.
`auto는 초기화 값에 다라 알아서 데이터 타입을 정해주는 키워드`
auto를 사용하면 아래 예제처럼 변수를 선언할 수 있다
auto a1 = 10; // int 타입
auto a2 = 10.0f; // float 타입
auto a3 = "c"; // char 타입
auto a4 = "emptyHead"; // string 타입
auto a5 = {10, 20, 30}; // int 배열 타입
C++
복사
→ 이런식으로 따로 타입을 정해주지 않아도 알아서 변수의 타입을 정해주는 키워드
•
auto 키워드는 컴파일러에 의해서 타입이 추론(타입 예상)이 되므로, auto로 선언한 변수 위에 마우스를 가져다 대면 추론한 타입이 나온다.
auto에 const, const& 한정자가 붙을 때
auto를 그냥 사용할 수 있지만, 한정자와 함께 사용함으로써 효율을 더 높일 수 있다.
1. auto와 &, * 함께 사용하기
&, * 특성은 무엇인가?
→ 복사가 되지않고, 주소를 가리키거나 참조를 한다. 복사가 아닌 것.
이것을 명확하게 표기하기 위해서
auto&
auto*
C++
복사
이렇게 받아올 수 있다. &로 예를들면
vector<int> v = {1, 2, 3, 4, 5};
C++
복사
라는 벡터가 있고, 이 벡터의 모든 값들을 x 2 해야한다고 할 때,
for문을 이용해서 아래와 같이 사용할 수 있다.
for (auto it = v.begin(); it != v.end(); ++it) {
*it *= 2;
}
C++
복사
이런식으로 auto를 이용해서 vector<int>::iterator 타입을 대신해서 사용할 수 있지만,
&와 range based for 문을 이용하면 훨씬 있어보인다(?)
for (auto& elem : v) {
elem *= 2;
}
C++
복사
더 깔끔해졌다.
누가봐도 명확히 * 타입이거나, & 타입인 경우, auto의 타입 추론에 의해서 *, & 로 받아오긴 한다.
하지만 명확하게 표현하기 위해서 누가봐도 명확한 경우에도, 써주는 것을 추천한다.
2. auto와 const 함께 사용하기
const auto a = 10; // const int 타입
const auto b = "emptyHead"; // const std::string 타입
const auto c = 'c';
const auto d = 11.0f;
C++
복사
3. auto와 const& 함께 사용하기
const& auto a = 20; // const int& 타입
const& auto b = "emptyHead"; // const std::string& 타입
vector<[인자의 메모리 크기가 큰 클래스 등]> v;
for (const auto& elem : v) {
// vector의 인자로 들어가 있는 클래스, 변수의 값을 바꿀거는 아니고,
// 값을 이용해서 출력하거나 할때, 복사는 비용이 너무 크니까 const & 이용하는것을 추천
C++
복사
const만 이용해서 대입을 하다보면, 복사 비용이 들기 때문에, 상대적으로 복사 비용이 많이 드는 변수, 클래스 등은 const& 를 이용해서 사용할 수 있다.