컴공생의 다이어리
[c++] auto 키워드 본문
auto 키워드
auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맟춰 선언하는 인스턴스(변수)의 형식이 '자동'으로 결정된다. 이것을 타입 추론(type inference)이라고 한다.
이 기능은 생성 시 변수를 초기화할 때만 작동한다. 초기화 값을 사용하지 않고 생성된 변수는 이 기능을 사용할 수 없다. 이유는 초기화된 값을 기준으로 자료형을 선택하기 때문이다. 아래에서 다양한 예제로 auto관련해서 다뤄보겠다.
auto 사용 예시
아래는 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;
}
auto 사용 시 주의사항
- auto 키워드는 함수 매개변수로 사용할 수 없음
- auto 키워드는 구조체나 클래스의 멤버 변수로 사용 불가(해당 객체 자료형 크기를 모르기 때문)
- 가독성이 떨어짐으로 적당히 사용해야 함
www.yes24.com/Product/Goods/95863013
'Development > C & C++' 카테고리의 다른 글
[c++] array container(std::array) (0) | 2021.01.15 |
---|---|
[c++] 범위 기반 for문 (range-based for statement) (0) | 2021.01.15 |
[c++] 순차 자료 구조와 연결 자료 구조 (0) | 2021.01.13 |
[c++] STL(Standard Template Library) (0) | 2021.01.05 |
[c++] 클래스 템플릿(Class Template) (0) | 2021.01.05 |