본문 바로가기
SWE/C++ OOP

[C++11] auto 데이터 타입 정리

by S나라라2 2021. 4. 23.
반응형

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

 

 

 

반응형