상세 컨텐츠

본문 제목

타입추론

컴퓨터 언어/C++

by cepiloth 2020. 6. 22. 15:45

본문

728x90
반응형

타입 추론(Type Interfac)이란 표현식의 타입을 컴파일러가 스스로 알아내는 기능이다. 타입 추론과 관련된 키워드로 auto와 decltype이 있다.

auto 키워드


 auto 키워드는 다음과 같이 다양한 상황에서 사용한다.
함수의 리턴 타입을 추론한다.
구조적 바인딩에 사용한다.
표현식의 타입을 추론하는 데도 사용한다.
비타입(non-type, 타입이 아닌) 템플릿 매개변수의 타입을 추론하는 데 사용한다.
decltype(auto)에서 사용한다.
함수에 대한 또 다른 문법으로 사용한다.
재네릭 람다 표현식에서 사용한다.

변수를 선언할 때 타입 자리에 auto 키워드를 지정하면 그 변수의 타입은 컴파일 시간에 자동으로 추론해서 결정된다. 이러한 용도에 대한 가장 간단한 예는 다음과 같다.

auto x = 123; // x 는 int 타입으로 결정된다

 이 예제처럼 int 대신 auto로 쓸 때는 이점이 없지만, 이보다 복잡한 타입에 적용할 때는 편리하다. 예를 들어 복잡한 타입의 값을 리턴하는 getFoo()라는 함수가 있다고 하자. getFoo()를 호출한 결과를 변수에 저장할 때 그 타입을 직접 나열해도 되지만 다음과 같이 간단히 auto를 붙이면 세부 작업은 컴파일러가 처리해준다.

auto result = getFoo();


 또한 이렇게 하면 나중에 이 함수의 리턴 타입을 변경하더라도 코드에서 그 함수가 나온 모든 지점을 일일이 찾아서 고칠 필요 없이 간단히 수정할 수 있다.  하지만 auto로 표현식의 타입을 추론하면 함수에 지정된 레퍼런스나 const 한정자가 제거된다. 예를 들어 다음과 함수를 살펴 보자.

#include <string>

const std::string message = "Test";

const std::string& foo()
{
	return message;
}

auto f1 = foo();


 auto를 지정하면 레퍼런스와 const 한정저가 사라지기 때문에 f1은 string 타입이 된다. 따라서 값이 복제돼버린다. const 레퍼런스 타입으로 지정하려면 다음과 같이 auto 키워드 앞뒤에 레퍼런스 타입과 const 키워드를 붙인다.

const auto& f2 = foo();

auto를 지정하면 레퍼런스와 const 지정자가 사라져서 값이 복제된다는 점에 주의한다. 복제 방식으로 전달되지 않게 하려면 auto&나 const auto&로 지정한다.

decltype 키워드
decltype 키워드는 인수로 지정한 표현식의 타입을 알아낸다.

int x = 123;
decltype(x) y = 456;

이렇게 작성 하면 컴파일러는 y의 타입이 x의 타입인 int라고 추론한다.

decltype은 레퍼런스나 const 지정자를 삭제하지 않는다는 점에서 auto와 다르다. 여기서 다시 string을 가리키는 const 레퍼런스를 리턴하는 함수 foo()를 살펴보자. f2 다음과 같이 decltype 으로 정의하면 const string& 타입이 돼 복제 방식으로 처리하지 않는다.

decltype(foo()) f2 = foo();

얼핏 보면 decltype을 사용한다고 해서 특별히 나아질 게 없다고 생각할 수 있지만 템플릿을 사용할 때 상당히 강력한 효과를 발휘한다. 

728x90
반응형

'컴퓨터 언어 > C++' 카테고리의 다른 글

template method  (0) 2021.04.29
전방 선언 Forward Declaration  (0) 2020.09.25
Const 레퍼런스 전달 방식  (0) 2020.06.22
스마트포인터  (0) 2020.06.22
네임스페이스  (0) 2020.06.22

관련글 더보기

댓글 영역