프로그래밍 언어/C & C++ 정리

모던 C++ 함수형 프로그래밍 auto

뽀또치즈맛 2023. 12. 16. 09:10

 

 

auto 키워드
auto 키워드로 데이터 타입을 자동으로 정의하기 위해서는 일단,
모던 C++ 이전에 auto 키워드는 변수가 자동 지속 기간(automatic storage duration)을
가져야 함을 명시적으로 나타내기 위해 사용했다는 것을 알아두자.

 

++

 이전의 C++과 비교하면 모던 C++에서는 어떤 것이 달라졌는지,

사실 많은 변화가 있었음은 알지만

그럼에도 불구하고 필자는 해당 기능들을 잘 알지 못한다.

때문에 게시글과 같이 성장하고자 

매일 C++에 관련된 포스팅을 하고자 함을 기반으로 작성된 게시글이기에

필자의 학습을 초점에 맞춰 작성되기 때문에,

독자 위주의 게시글 이라기 보다는

필자의 독서 기록용 게시글임을 인지해주고 읽어주길 바란다.

++

 

 

 자동 지속 기간(automatic storage duration)은 어떤 변수가 해당 변수를 정의한 지점에서

생성되고 코드 블록을 빠져나가면 파괴되는 것을 말한다.

예를 들어, 지역 변수는 함수의 시작 부분에서 정의될 때 만들어지고,

코드의 흐름이 이 함수를 빠져 나가면 파괴된다.

사실 이것은 기본 동작에 해당하므로 굳이 auto를 사용할 필요도 없다.

따라서 모던 C++에서는 더 이상 자동 지속 기간을 지정하는 의미로 auto 키워드를 사용하지 않으며,

새로운 의미를 가진다.

 

C++11 부터는 auto 키워드가 초기화에 선언된 변수의

실제 타입을 추론하기 위해서 사용된다.

C++14부터는 auto 키워드를 함수에 적용해 후행 반환 타입(trailing return type)을 사용할 수 있다.

 

해당 코드를 통해 모던 C++의 auto을 구현해보자

 

#include <iostream>
#include <typeinfo>



int main(void)
{
	std::cout << "[auto.cpp]" << std::endl;

	// 여러 개의 auto 타입 변수를 생성한다
	auto a = 1;
	auto b = 1.0;
	auto c = a + b;
	auto d = { b,c }; 

	// 변수의 실제 타입을 출력
	std::cout << "type of a : " << typeid(a).name() << std::endl;
	std::cout << "type of b : " << typeid(b).name() << std::endl;
	std::cout << "type of c : " << typeid(c).name() << std::endl;
	std::cout << "type of d : " << typeid(d).name() << std::endl;

	return 0;
}

 

 

auto 키워드는 함수의 반환 타입도 자동으로 추론한다.

두 매개변수의 합을 계산하는 add() 함수가 있다고 가정하면,

 

int add(int i, int j)
{
	return i+j;
}

 

 

add 함수는 auto 키워드를 써서 다음과 같이 리팩토링 할 수 있다.

auto add(int i, int j) ->int
{
	return i + j;
}

 

 

 

리팩토링이란?
리팩터링(refactoring)은 소프트웨어 공학에서 '결과의 변경 없이 코드의 구조를 재조정함'을 뜻한다.
주로 가독성을 높이고 유지보수를 편하게 한다. 버그를 없애거나 새로운 기능을 추가하는 행위는 아니다.

 

auto 키워드의 또 다른 기능으로 후행 반환 타입이 있으며

이 기능을 사용하면 반환 타입을 지정할 수 있는데,

후행 반환 타입을 써서 위와 같이 반환 타입을 정해줄 수 있다.

 

이 코드를 자세히 보면 함수의 반환 타입에 auto를 사용했기 때문에 

컴파일러가 알아서 반환 타입을 결정할 수 있을 것이다.

그럼에도 불구하고 후행 반환 타입 구문을 사용해서 -> 다음에 반환 타입으로 int를 지정하고 있다.