ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1074) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (349) N
      • C++ (168) N
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (10) N
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 포인터
  • 언리얼
  • 파이썬
  • 프로그래머스
  • 유니티
  • 클래스
  • 티스토리챌린지
  • 오블완
  • 문자열
  • SQL
  • C++
  • 함수
  • string
  • 배열
  • c#
  • Unity
  • C
  • 알고리즘
  • 백준
  • 그래픽스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/C++

C++ auto 타입 추론

2022. 9. 21. 22:34

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

출처 : https://computer-science-student.tistory.com/78

저작자표시 (새창열림)

'프로그래밍 언어 > 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
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • std::variant와 std::monostate 여러가지 타입 중 한 가지의 객체를 보관
    • C extern (변수 / 함수 외부 선언)
    • C++ mutable
    • C++ static (정적 변수 / 함수)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바