range-based for

Jaemyeong Lee·2024년 8월 4일
0

FastCampusC++

목록 보기
29/78

첫 번째 블록 (C 스타일 배열 순회)

{
    // C스타일 배열, 기존 출력 방법
    int nums[5] = { 1, 2, 3, 4, 5 };
    for (int i = 0; i < 5; ++i)
    {
        cout << nums[i] << endl;
    }

    // Range based for
    for (int num : nums)
    {
        cout << num << endl;
    }
}
  1. int nums[5] = { 1, 2, 3, 4, 5 };로 C 스타일 배열을 선언하고 초기화합니다.
  2. 기존 for 문을 사용하여 배열의 각 요소를 출력합니다.
  3. 범위 기반 for 문을 사용하여 배열의 각 요소를 출력합니다.

두 번째 블록 (C++ 스타일 배열 순회)

{
    // C++ 스타일 배열, 기존 출력 방법
    array<int, 5> nums = { 1, 2, 3, 4, 5 };
    for (int i = 0; i < 5; ++i)
    {
        cout << nums[i] << endl;
    }

    // Range based for
    for (int num : nums)
    {
        cout << num << endl;
    }
}
  1. array<int, 5> nums = { 1, 2, 3, 4, 5 };std::array를 선언하고 초기화합니다.
  2. 기존 for 문을 사용하여 배열의 각 요소를 출력합니다.
  3. 범위 기반 for 문을 사용하여 배열의 각 요소를 출력합니다.

세 번째 블록 (구조체 배열 순회 및 값 변경)

{
    Person persons[]{
        Person{70.f, 181.f},
        Person{56.2f, 167.3f}
    };

    // 순회하면서 변경
    for (int i = 0; i < 2; ++i)
    {
        persons[i].weight = 0.f;
    }

    for (Person person : persons)
    {
        cout << person.weight << " " << person.height << endl;
    }
}
  1. Person 구조체 배열을 선언하고 초기화합니다.
  2. 기존 for 문을 사용하여 배열의 각 요소를 순회하며 weight 값을 0으로 변경합니다.
  3. 범위 기반 for 문을 사용하여 변경된 값을 출력합니다.

네 번째 블록 (범위 기반 for 문으로 값 변경 시 효과 없음)

{
    Person persons[]{
        Person{70.f, 181.f},
        Person{56.2f, 167.3f}
    };

    // 순회하면서 변경
    for (Person person : persons)
    {
        person.weight = 0.f;
    }

    // 변경 되지 않음
    for (Person person : persons)
    {
        cout << person.weight << " " << person.height << endl;
    }
}
  1. Person 구조체 배열을 선언하고 초기화합니다.
  2. 범위 기반 for 문을 사용하여 배열의 각 요소를 순회하며 weight 값을 0으로 변경합니다. 그러나 값이 변경되지 않습니다.
  3. 값이 변경되지 않은 이유는, 범위 기반 for 문이 복사본을 사용하기 때문입니다. 원본이 아닌 복사본을 변경하므로 원본에는 변화가 없습니다.

다섯 번째 블록 (참조를 사용한 범위 기반 for 문)

{
    Person persons[]{
        Person{70.f, 181.f},
        Person{56.2f, 167.3f}
    };

    // 순회하면서 변경, 참조(레퍼런스)
    for (Person& person : persons)
    {
        person.weight = 0.f;
    }

    // 변경 됨
    for (Person person : persons)
    {
        cout << person.weight << " " << person.height << endl;
    }
}
  1. Person 구조체 배열을 선언하고 초기화합니다.
  2. 참조를 사용한 범위 기반 for 문을 사용하여 배열의 각 요소를 순회하며 weight 값을 0으로 변경합니다.
  3. 원본이 변경되어 올바르게 출력됩니다.

여섯 번째 블록 (참조와 복사의 차이점)

{
    Person persons[]{
        Person{70.f, 181.f},
        Person{56.2f, 167.3f}
    };

    for (int i = 0; i < 2; ++i)
    {
        cout << &persons[i] << endl;
    }

    cout << endl;
    for (Person person : persons)
    {
        cout << &person << endl; // 주소 값이 다르다
    }

    cout << endl;
    for (Person& person : persons)
    {
        cout << &person << endl;
    }
}
  1. Person 구조체 배열을 선언하고 초기화합니다.
  2. 기존 for 문을 사용하여 배열의 각 요소의 주소를 출력합니다.
  3. 범위 기반 for 문을 사용하여 각 요소의 주소를 출력합니다. 복사본이 사용되므로 주소가 다릅니다.
  4. 참조를 사용한 범위 기반 for 문을 사용하여 각 요소의 주소를 출력합니다. 원본 주소가 출력됩니다.

일곱 번째 블록 (참조를 사용한 배열 값 변경)

{
    int nums[3] = { 1, 2, 3 };
    for (int num : nums)
    {
        num = 0; // 안 바뀜
    }
    for (int num : nums)
    {
        cout << num << endl;
    }

    for (int& num : nums) // 참조(레퍼런스)
    {
        num = 0; // 바뀜
    }
    for (int num : nums)
    {
        cout << num << endl;
    }
}
  1. int nums[3] = { 1, 2, 3 };로 배열을 선언하고 초기화합니다.
  2. 범위 기반 for 문을 사용하여 각 요소를 0으로 변경하려 하지만, 값이 변경되지 않습니다. 이는 복사본이 사용되기 때문입니다.
  3. 참조를 사용한 범위 기반 for 문을 사용하여 각 요소를 0으로 변경합니다. 원본 값이 변경됩니다.
  4. 변경된 값을 출력합니다.

정리

범위 기반 for 문은 C++11에서 도입된 편리한 문법으로, 배열이나 컨테이너의 모든 요소를 순회하는 데 유용합니다. 범위 기반 for 문에서 복사본이 사용되면 원본 값이 변경되지 않으므로, 원본을 변경하려면 참조를 사용해야 합니다. C++ 스타일 배열(std::array)과 C 스타일 배열 모두 범위 기반 for 문을 사용할 수 있습니다. 범위 기반 for 문은 가독성을 높이고 코드 작성을 단순화하는 데 도움이 됩니다.

profile
李家네_공부방

0개의 댓글