본문 바로가기

대학생활

[C++] auto 타입

백준에서 문제를 풀다보면 int 타입으로는 결과물을 정확히 저장 못해서 틀리는 경우가 있다.

그런 상황을 미연에 방지하고 데이터 손실 예방은 물론 더욱 유연한 코드를 짜기 위해 'auto'라는 타입을 활용할 수 있다.

예시)

auto a = 123;
auto b = "abc";

std::cout << a << " " << b; // 123 abc

위에서 알 수 있듯이, auto는 할당할 값에 대하여 적절한 타입을 추론하여 준다.

 

그러나 다른 타입의 형태라도 초기화형태가 같은 경우는 auto 타입에서 지정된 형태로 추론되게 된다.

 

compiler에 지정된 auto 추론 형태

auto a = 123; // int
auto b = { 1, 2, 3 }; // std::initializer_list<int>

auto 추론 형태 지정해 주기

auto a = short{ 123 }; // short
auto b = std::vector<int>{ 1, 2, 3 }; // std::vector<int>

 

auto 형태를 활용한 함수 생성도 가능하다.

auto f(char const a) { return toupper(a); }
auto f = [](char const a) { return toupper(a); };

 

또한, auto타입은 const/volatile, &(참조 지정자)와 같은 추가적인 특성을 자동으로 추정해주지 않는다.

class c {
	int a = 5;
public:
	int& f() { return a; }
};

c temp;
auto a = temp.f();
a++;
std::cout << temp.f(); // 5

c temp;
auto& a = temp.f();
a++;
std::cout << temp.f(); // 6

class에서 함수 f가 참조를 반환한다고 명시되어 있지만, auto를 통해 받은 데이터는 그 참조가 아니라 그 값 자체다.

따라서 auto 그 자체로는 int&라 명시된 리턴값을 반영하지 못하기 때문에 'auto&'이라 확실히 해주는 것이 중요하다.

 

 

auto란 타입을 보고 예전엔 그냥 지나쳐 갔었는데 충분히 활용의 필요성을 느꼈다.

생각보다 어려운 개념도 사용법도 아니여서 몰랐다면 한 번 자신의 코드 습관에 변화를 줘 보는 것은 어떨까.