c++11 부터 std에 추가된 auto keyword
c++ 에서 사용되는 데이터 타입으로는 int, bool, string, double, .. 이 있을 수 있다.
이 모든 것을 대신할 수 있는게 auto keyword이다.
보통 개발자가 변수의 자료형을 선택하는데, auto keyword는 컴파일러가 자료형을 선택한다. ( 개발자 입장에서는 값에 따라 자동으로 타입이 결정되므로 편할 수 있다.)
-
기본 사용법
using namespace std;
auto value1 = 1;
auto value2 = "haha";
auto value3 = 3.14;
다른 데이터 타입과 마찬가지고 '자료형 변수이름 = 값' 으로 사용하면 된다.
위에서 value1은 integer, value2은 string, value3은 double형으로 자동으로 컴파일 될 것이다.
(sizeof(value1)으로 변수 사이즈를 출력해서 유추해볼 수 있음)
-
주의점 1. auto 변수는 선언과 동시에 초기화를 해줘야 한다.
auto a; // error
auto는 초기화 되는 값에 근거하여 자료형을 결정하기 때문에 초기화를 꼭 해줘야 한다.
-
주의점 2. auto 변수는 초기화 이후에 타입 변경이 불가능하다.
auto 변수는 초기화 후에 값을 변경할 수는 있지만, 데이터 타입은 불가능하다.
auto value = 3;
value = 20; // 가능
value = "babo"; // 불가능 (int->string)
-
auto 사용의 장점
auto keyword의 가장 큰 장점은 iterator로 사용될 때이다.
using namespace std;
map<string, string> mapOfStrs;
mapOfStrs.insert(pair<string,string>("first","1"));
mapOfStrs.insert(pair<string,string>("second","2"));
mapOfStrs.insert(pair<string,string>("thirds","3"));
// 보통 iterator 사용법 - itertator의 타입을 지정해줘야 한다.
map<string,string>::iterator it1 = mapOfStrs.begin();
while(it1 != mapOfStrs.end())
{
cout << it1->first << "::" << it1->second <<endl;
it1++;
}
// auto를 사용할 경우 - 변수 타입을 지정해줄 필요가 없다.
auto it2 = mapOfStrs.begin();
while(it2 != mapOfStrs.end())
{
cout << it2->first << "::" << it2->second << endl;
it2++;
}
iterator를 사용할 때는 iterator의 변수 타입을 일일이 선언해줘야한다.
위처럼 map<string,string>를 직접 적어줘야 했지만 auto를 사용하면 적어줄 필요가 없다.
컴파일러가 자동으로 it2의 자료형을 map<string,string>::iterator로 컴파일해주기 때문이다.
-
함수의 return값으로 auto 사용 - 타입 선언
auto를 함수의 return값으로 사용할 수 있다. 다만 특별한 방법으로 타입을 선언해줘야 한다.
// 옳은 방법
auto sum(int x, int y) -> int
{
return x + y;
}
// 틀린 방법
auto sum(int x, int y)
{
return x + y;
}
그리고 auto를 return 하는 함수의 값을 auto로 받을 수 있다.
auto value = sum(5,5);
-
함수의 return값으로 auto 사용 - ramda 함수
auto sum = [](int a, int b)
{
return a+b;
};
auto value = sum(1,2);
-
참조(&), 포인터(*), 정적(const) 모두 가능
auto keyword도 다른 타입과 마찬가지로 참조자(&)를 붙여 사용할 수 있다.
using namespace std;
int number = 77;
auto& value = number;
cout << number << " , " << value << endl; // 77,77
// value가 가리키는 number의 값 변경
value = 10;
cout << number << " , " << value << endl; // 10, 10