C++11부터 도입된 auto는 자동 타입 추론(automatic type deduction)을 위해 사용되는 키워드입니다. 타입 추론(type inference)이란 프로그래밍 언어에서 표현식의 데이터 타입을 컴파일러가 자동으로 판단하는 기능을 의미하며, 일부 강한 정적 타입(strongly statically typed) 언어에서 제공되는 특징입니다.
예를 들어, 벡터(vector)를 순회하는 반복자(iterator)를 생성하고 싶다면 auto 키워드 하나로 간편하게 해결할 수 있습니다. 복잡한 반복자 타입 이름을 직접 작성할 필요가 없어지는 것이죠.
auto 사용 예제
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> arr(10);
for(auto it = arr.begin(); it != arr.end(); it++) {
cin >> *it;
}
return 0;
}
위 프로그램에서 it의 타입은 컴파일러에 의해 std::vector<int>::iterator로 자동 결정됩니다. 개발자는 길고 복잡한 타입 이름을 일일이 기억하거나 입력할 필요 없이 코드를 작성할 수 있습니다.
decltype이란 무엇인가?
decltype은 지정된 표현식의 타입을 반환하는 타입 지정자입니다. auto가 변수에 할당되는 값(value)을 기준으로 타입을 추론하는 것과 달리, decltype은 인자로 전달된 표현식(expression) 자체에서 타입을 추론한다는 점이 큰 차이입니다.
또한 decltype이 반환한 타입은 다른 변수를 선언하는 데 그대로 활용할 수 있습니다. 예를 들어, 앞서 살펴본 코드를 decltype을 사용해 다음과 같이 작성할 수 있습니다.
decltype 사용 예제
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> arr(10);
for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) {
cin >> *it;
}
return 0;
}
위 예제에서 decltype(arr.begin())은 arr.begin() 표현식의 타입, 즉 std::vector<int>::iterator를 그대로 도출하여 반복자 it의 타입으로 사용합니다.
auto와 decltype의 미묘한 차이점
주목할 점은 decltype이 나타내는 타입이 auto가 추론한 타입과 항상 동일하지 않다는 사실입니다. 두 키워드의 타입 추론 규칙에는 참조(reference), const 한정자(const qualifier) 처리 방식 등에서 미묘한 차이들이 존재합니다. 이러한 차이점에 대해 더 깊이 이해하고 싶다면 Thomas Becker가 작성한 C++ 타입 추론에 관한 상세 설명 문서(auto_and_decltype)를 참고하는 것을 권장합니다.
정리
- auto: 초기화 값에서 타입을 추론하며, 긴 타입 이름을 간결하게 표현할 때 유용합니다.
- decltype: 표현식 자체에서 타입을 추론하며, 이미 존재하는 표현식의 타입을 재사용할 때 유용합니다.
- 두 키워드는 추론 규칙이 다르므로 상황에 맞게 적절히 선택해야 합니다.