[C++] auto

비아베·2024년 4월 14일

C++

목록 보기
2/7

Auto란?

auto를 사용하면 초깃값의 형식에 맞춰 선언하는 인스턴스(변수)의 형식이 자동으로 결정되는 기능이다. 타입 추론(type inference)이라고 한다.

이 기능은 생성 시 변수를 초기화할 때만 작동한다. 초기화 값을 사용하지 않고 생성된 변수는 이 기능을 사용할 수 없다. 이 이유는 초기화된 값을 기준으로 자료형을 선택하기 때문이다.

예시 및 사용법

 #include <iostream>
using namespace std;
int main( )
{
    int a = 10;
    float b = 3.5;
    auto sum = a+b;
    
    cout << sum;
}

sum은 13.5가 출력된다. int형 변수 a와 float형 변수 b의 합을 auto 키워드를 통해 sum 변수에 저장하고 출력한 것이다.


함수의 반환 값

  • 아래는 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;
}

실행 결과는 sum : 12가 나온다.


사용할 수 없는 상황

  • 아래는 auto를 사용할 수 없는 상황이다. 위에도 말했듯이, 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;
}

실행결과로 13.5가 나온다.


포인터와 참조자

  • 아래와 같이 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";
}

실행 결과는 sum : 8로 출력된다.

#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;

typeid(변수이름).name()을 사용하면 자료형을 확인할 수 있다.


for문

  • 아래와 같이 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 키워드는 구조체나 클래스의 멤버 변수로 사용 불가(해당 객체 자료형 크기를 모르기 때문)
  • 가독성이 떨어짐으로 적당히 사용해야 함
profile
게임 개발자로서의 한걸음

0개의 댓글