auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맟춰 선언하는 인스턴스(변수)의 형식이 '자동'으로 결정된다 (타입 추론(type inference)). 이 기능은 생성 시 변수를 초기화할 때만 작동한다.
아래는 int형 변수 a와 float형 변수 b의 합을 auto키워드를 통해 sum변수에 저장하고 출력한 것이다.
#include <iostream>
using namespace std;
int main() {
int a = 5;
float b = 3.5;
auto sum = a + b;
cout << "sum : " << sum << "\n";
return 0;
}
아래는 auto 키워드를 통해 sum변수를 함수의 반환 값으로 초기화 한 것이다.
#include <iostream>
using namespace std;
int add(int x, int y) {
return x + y;
}
int main() {
auto sum = add(5, 7);
cout << "sum : " << sum << "\n";
return 0;
}
아래와 같이 auto 키워드는 함수 매개 변수와 함께 사용할 수 없다.
#include <iostream>
using namespace std;
void addAndPrint(auto x, auto y) {
cout << x + y;
}
int main() {
addAndPrint(5, 7);
return 0;
}
아래는 auto 키워드가 함수의 반환 타입을 자동으로 추론할 수 있도록 확장된 것이다. int형 변수 x와 float형 변수 y의 합은 float형 타입의 반환 값을 가져야 한다고 추론한다. 하지만 이와 같은 경우는, auto 키워드를 사용하면 잘 못 해석할 수 있으며, 이로 인해 의도하지 않은 오류가 발생할 수 있기 때문에 함부로 사용하지 않는게 좋다.
#include <iostream>
using namespace std;
auto addAndPrint(int x, float y) {
return x + y;
}
int main() {
cout << addAndPrint(5, 8.5);
return 0;
}
아래와 같이 auto 키워드는 포인터와 참조자를 붙일 수 있다.
#include <iostream>
using namespace std;
int main() {
//포인터와 참조자를 붙일 수 있음
int a = 1.2;
auto &b = a;
auto *c = &b;
}
아래와 같이 auto 키워드는 구조체나 공용체, 클래스도 가능하다.
#include <iostream>
using namespace std;
class Market {
int apple;
int banana;
public:
Market(int a, int b) { apple = a; banana = b; }
int getapple() { return apple; }
int getbanana() { return banana; }
};
struct Person {
string name;
int age;
};
int main() {
Market M(5, 8);
auto m = M;
cout << "--- 클래스 ---\n";
cout << "apple : " << m.getapple() << "\n";
cout << "banana : " << m.getbanana() << "\n";
cout << "--------------\n";
cout << "--- 구조체 ---\n";
Person P = { "홍길동",50 };
auto p = P;
cout << "name : " << P.name << "\n";
cout << "age : " << P.age << "\n";
cout << "--------------\n";
}
auto 키워드는 함수포인터(구조체나 클래스의 함수 포인터도 가능)나, 함수 자체도 가능하다. 아래와 같은 경우도 가능하다.
#include <iostream>
using namespace std;
int SUM(int a, int b) { return a + b; }
int main() {
//함수포인터나, 함수 자체도 가능함 -> 이러한 함수가 람다 함수
//함수 포인터 -> 구조체나 클래스의 함수 포인터도 가능
auto s = SUM;
cout << "sum : " << s(1, 7) << "\n";
}
#include <iostream>
using namespace std;
int main() {
//함수 (매개변수 없을 시)
auto test1 = [] {cout << "hello wolrd" << endl; };
cout << "test1 : ";
test1();
//함수 (매개변수 존재 시)
auto test2 = [](int a) {return a; };
cout << "test2 : " << test2(7) << endl;
//함수 (함수 내부에서 외부의 지역변수 참조 시 [ ]안에 &를 사용함)
int b = 7;
auto test3 = [&](int a) {return b + a; };
cout << "test3 : " << test3(3) << endl;
}
#include <iostream>
using namespace std;
int main() {
//함수 (참조자 리턴 시)
//함수의 인자가 속한 괄호에 -> 를 명시해주고 리턴자료형 &를 붙여줌
//참조자 외에는 자료형을 명시하지 않아도 return값을 기준으로 auto 자동으로 리턴자료형을 판단함
//이 때 주의점은 auto&를 하게 되면 함수의 참조자가 되는 것이지 리턴형의 참조자가 되는 것은 아님!
auto test = [](int* a)->int& {return *a; };
return 0;
}
cf) typeid(변수이름).name()을 사용하면 자료형을 확인할 수 있다. 아래와 같이 for문에서 auto를 사용해 자료형을 추론해 출력할 수 있다.
#include <iostream>
int main() {
auto arr = { 1, 2, 3, 4 };
for (auto number : arr)
std::cout << number << '\n';
return 0;
}
함수로 사용할 시 ->로 람다식이랑 비슷하게 타입 추론을 해줄 수가 있다.
#include <iostream>
using namespace std;
auto GetSum(int val1, int val2)->int
{
return val1 + val2;
}
int main()
{
int n1 = 1, n2 = 2;
cout << GetSum(n1, n2);
}
auto 사용 시 주의사항
- auto 키워드는 함수 매개변수로 사용할 수 없음
- auto 키워드는 구조체나 클래스의 멤버 변수로 사용 불가(해당 객체 자료형 크기를 모르기 때문)
- 가독성이 떨어짐으로 적당히 사용해야 함
'프로그래밍 언어 > C++' 카테고리의 다른 글
std::variant와 std::monostate 여러가지 타입 중 한 가지의 객체를 보관 (0) | 2022.10.10 |
---|---|
C extern (변수 / 함수 외부 선언) (0) | 2022.09.27 |
C++ mutable (0) | 2022.09.15 |
C++ static (정적 변수 / 함수) (0) | 2022.09.13 |
C++ inout형 포인터 *& (0) | 2022.09.02 |