[C++] auto, range-based for

강한·2025년 2월 6일

CPP

목록 보기
16/18
post-thumbnail

auto

  • 타입 자동 추론
  • 컴파일러가 변수의 초기화 값을 기반으로 변수의 타입을 결정한다.
#include <iostream>

int main() {
    auto a = 10;        // int
    auto b = 3.14;      // double
    auto c = "Hello";   // const char*
    auto d = true;      // bool
		// auto를 사용할 때는 반드시 초기화가 필요함 (auto x; → 오류 발생)
		
		int x = 10;
    int y = 20;
    const int z = 30;

    auto a = x;        // int
    auto& b = y;       // int&
    auto* c = &x;      // int*
    const auto d = z;  // const int
		
    return 0;
}
  • auto&를 사용하면 변수를 참조 형태로 가져올 수 있다.
  • auto*를 사용하면 포인터 타입으로 저장 가능하다.
  • const auto를 사용하면 변경 불가능한 값으로 지정 가능하다.

장점

  • 코드를 간결하게 만들 수 있다.
  • 반복자(iterator)와 같은 긴 타입을 쉽게 다룰 수 있다.
  • 템플릿 프로그래밍에서 유용하다.
  • 반환 타입이 복잡한 함수에서 가독성을 높일 수 있다.

주의점

  • 초기화가 필수이다.
  • 과도하게 사용 시 코드의 가독성이 떨어질 수 있다.
  • const와 &가 포함되지 않으면 값 복사가 이루어지므로 참조자를 사용해야 복사 비용을 줄일 수 있다.

var, auto 차이점

  • var는 지역 변수에서만 사용 가능하다.
  • auto는 지역 변수뿐만 아니라 클래스 멤버 변수와 함수의 반환 타입으로 사용 가능하다.

Range-based for (범위 기반 for)

  • 컨테이너나 배열, 범위(Range)에 대해 간결한 방법으로 반복을 수행할 수 있게 해주는 문법이다.
  • 기존의 인덱스 기반 for 문이나 반복자(Iterator)를 사용하는 방법보다 훨씬 간단하고 직관적이다.
  • C#의 foreach문과 비슷하다.
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 기존 for문 + 반복자
    for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << "\n";

    // 범위 기반 for 문
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\n";
    
    for (auto num : numbers) {
	    // num은 numbers의 각 요소를 '복사'한 값
	    // -> 내부에서 수정해도 원본에 반영되지 않음
	    num *= 2;
		}
		
    for (auto& num : numbers) {
	    //'원본' numbers의 요소가 실제로 2배가 됨
	    num *= 2;
		}

    return 0;
}
profile
의지 강한 게임개발자

0개의 댓글