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를 지정하고 있다.
'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글
모던 C++ 함수형 프로그래밍 null 포인터 (0) | 2023.12.17 |
---|---|
모던 C++ 함수형 프로그래밍 decltype (0) | 2023.12.16 |
상황에 맞는 키워드 (Context-Sensitive Keywords) (0) | 2023.11.21 |
C++/ CX 와 C++/ CLI 의 차이 (0) | 2023.11.21 |
C++ 오류 처리 (0) | 2023.11.17 |