c++ 에는 타입을 추론할 수 있는 편리한 키워드가 있습니다. 바로 auto와 decltype 키워드입니다. 이번 장에서는 이 두 키워드에 관해서 정리하겠습니다.
auto 키워드
변수를 선언할 때 타입 자리에 auto 대신 사용하면 컴파일 시간에 그 변수의 타입을 자동으로 추론합니다. 예를 들면 다음과 같습니다
auto x = 10; //x의 타입은 int로 추론된다.
사실 위 예제처럼 간단한 타입은 auto를 쓰면 별다른 이점은 없습니다. 하지만 다음과 같이 복잡하고 긴 이름을 가진 타입을 보면 어떤 이점이 있는지 바로 알아차릴 수 있을 겁니다.
std::vector<std::vector<std::vector<double>>> vecValue = Function();
위의 타입을 auto로 대체하면 다음과 같이 간단하게 쓸 수 있습니다.
auto vecValue = Function();
이렇게 하면 나중에 이 함수의 리턴타입을 변경하더라도 코드에서 그 함수가 나온 모든 지점을 일일이 찾아서 고칠 필요가 없습니다. 바로 auto 키워드가 자동으로 변경해 주기 때문입니다.
하지만 auto 키워드도 사용 시 주의 사항은 있습니다. auto 키워드로 타입을 추론할 때 참조(&)와 const 한정자는 제거된다는 것입니다. 예를 들어 함수의 리턴타입이 const std::string&이라면 참조와 const가 제거되어서 std::string타입을 리턴하게 됩니다. 이렇게 되면 의도와는 다르게 const 레퍼런스 기능이 사라지면서 리턴값이 복제가 됩니다.
#include <iostream>
using namespace std;
const std::string message = "test";
const std::string& printTest()
{
return message;
}
int main()
{
auto a = printTest(); // message값의 복사가 일어난다.(성능저하가 일어날 수도 있음)
a = "exam"; // 할당받는 변수값도 임의로 바꿀 수 있다.
cout << a << endl;
cout << message << endl;
return 0;
}
결과
exam
test
위의 경우 간단한 string 값이라서 별 문제없지만 리턴값의 용량이 큰 경우 복제로 인한 성능 저하의 원인이 되기도 합니다. 함수의 리턴타입대로 지정하려면 다음과 같이 auto에 const와 &를 붙이면 됩니다.
const auto& a = printTest();
decltype 키워드
decltype 은 인수로 지정한 표현식의 타입을 알아내는 키워드입니다. 예를 들면 다음과 같습니다.
double x = 10.0;
decltype(x) y = 9.0;
위의 예에서 decltype(x)는 y의 타입을 double로 추론합니다. decltype의 좋은 점은 auto와는 다르게 const와 레퍼런스(&)를 제거하지 않는다는 점입니다. printTest() 함수 예제에서 decltype을 써서 다시 작성하면 다음과 같습니다.
#include <iostream>
using namespace std;
const std::string message = "test";
const std::string& printTest()
{
cout << message << endl;
return message;
}
int main()
{
decltype(printTest()) a = printTest();
// a = "exam"; a값 변경 시 컴파일 에러
return 0;
}
결과
test
여기서 한 가지 더 확인할 수 있는 사실은 decltype() 안에 printTest()는 실행이 되지 않고 함수의 반환 타입만 참고한다는 것입니다. 만약 실행이 된다면 message값이 두 번 나타나겠지만 실행 결과는 한 번만 나타나기 때문입니다.
[참고]
1. 전문가를 위한 c++(개정4판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
2. 명품 c++ Programming (저자 : 황기태)
'Program Language > c++' 카테고리의 다른 글
C++ 기초(유니폼 초기화) (16) | 2023.01.27 |
---|---|
c++ 기초(클래스 정의) (9) | 2023.01.25 |
c++ 기초(레퍼런스) (1) | 2023.01.17 |
c++ 기초 (const 키워드의 사용법) (4) | 2023.01.16 |
c++ 기초(스마트 포인터) (1) | 2023.01.13 |
댓글