본문 바로가기
Program Language/c++

c++ 기초(타입 추론 : auto & decltype)

by 토담이아빠 2023. 1. 19.

c++ 타입 추론

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

댓글