타입추론이란?
타입 추론이란 표현식의 타입을 컴파일러가 스스로 알아내는 기능이다.
타입 추론과 관련된 키워드로 auto와 decltype가 있다.
1. auto 키워드
auto 키워드는 다음과 같이 다양한 상황에서 사용한다.
- 함수의 리턴 타입을 추론
- 구조적 바인딩에 사용
- 표현식의 타입을 추론
- 비타임(non-type, 타입이 아닌) 템플릿 매개변수의 타입을 추론
- decltype(auto)에서 사용
- 함수에 대한 또 다른 문법으로 사용
- 제네릭 람다 표현식에서 사용
변수를 선언할 때 타입 자리에 auto 키워드를 지정하면 그 변수의 타입은 컴파일 시간에 자동으로 추론해서 결정한다.
auto x = 123; // x는 int 타입으로 결정된다.
이 예제처럼 int 대신 auto로 쓸 때는 이점이 없지만,
이보다 복잡한 타입에 적용할 때는 편리하다.
예를 들어 복잡한 타입의 값을 리턴하는 getFoo()라는 함수가 있다고 하면
호출한 결과를 저장할 때 간단히 그 타입을 auto를 붙이면 세부 작업은 컴파일러가 처리해준다.
auto result = getFoo();
나중에 이 함수의 리턴 타입을 변경하더라도 코드에서 그 함수가 나온 모든 지점을
일일이 찾아서 고칠 필요 없이 간단히 수정할 수 있다.
하지만 auto로 표현식의 타입을 추론하면 함수에 지정된 레퍼런스나 const 한정자가 제거된다.
#include <string>
const std::string message = "Test";
const std::string& foo()
{
return message;
}
foo()를 호출해서 나온 결과를 auto 타입으로 지정한 변수에 저장하려면 다음과 같이 작성한다.
auto f1 = foo();
auto를 지정하면 레퍼런스와 const 한정자가 사라지기 때문에 f1은 string 타입이 된다.
따라서 값이 복제돼버린다.
cosnt 레퍼런스 타입으로 지정하려면 다음과 같이 auto 키워드 앞뒤에 레퍼런스 타입과 const 키워드를 붙여야 한다.
const auto& f2 = foo();
복제 방식으로 전달되지 않게 하려면 auto&나 const auto&로 지정한다.
2. decltype 키워드
decltype 키워드는 인수로 지정한 표현식의 타입을 알아낸다.
int x = 123;
decltype(x) y = 456;
이렇게 작성하면 컴파일러는 y의 타입이 x의 타입인 int라고 추론한다.
decltype은 레퍼런스나 const 지정자를 삭제하지 않는다는 점에서 auto와 다르다.
auto 예제에서 f2를 다음과 같이 decltype으로 정의하면 const string& 타입이 돼 복제 방식으로 처리하지 않는다.
decltype(foo()) f2 = foo();
decltype은 템플릿을 사용할 때 상당히 강력한 효과를 발휘한다.
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
| [C++ 1.3.2] 클래스 사용하기 (0) | 2022.08.17 |
|---|---|
| [C++ 1.3.1] 클래스 정의, 접근 수준(public, private), 생성자(생성자 이니셜라이저), 소멸자 (0) | 2022.08.17 |
| [C++ 1.2.5] 익셉션(exception(예외)), throw 구문, catch/try 구문 (0) | 2022.08.16 |
| [C++ 1.2.4] 레퍼런스, Const 레퍼런스 (0) | 2022.08.16 |
| [C++ 1.2.3] Const의 다양한 용도 (0) | 2022.08.16 |