강께르의 개발일지

[C++] 범위 기반 for문 본문

프로그래밍/C++

[C++] 범위 기반 for문

강께르 2021. 6. 13. 00:51

1. 범위 기반 반복문, 범위 기반 for문이란?

- C++11에서 제공하는 것으로 상대적으로 조금 더 복잡하고 실수할 가능성이 있는 for문을 일부 대체할 목적으로 사용할 수 있다.

- 시작과 끝점을 알려주지 않아도 알아서 처음부터 끝까지 순회 해주는 반복문이다.

- C#의 foreach와 비슷하다고 한다.

 

2. 범위 기반 for문 기본 사용 방법

for(element_declaration : array)
	statement;

- 루프를 돌 때마다 array의 요소를 반복해서 해당 현재 배열 요소를 element_declaration에 선언된 변수에 할당한다.

- 이 때, element_declaration의 자료형은 array의 자료형과 같아야 한다.

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

for (int elem : arr)
    cout << elem << endl;

- 위의 코드를 예제로 설명하자. arr은 10개의 int형 값을 가지고 있는 배열 변수이다. 이를 범위 기반 for문에 의해 배열 요소를 하나씩 출력할 것이다.

- for문이 반복될 때마다 arr에 있는 배열 요소는 하나씩 증가하면서 elem에 할당될 것이다. 그래서 elem의 값은 처음과 끝을 지정하지 않아도 arr의 배열 요소의 값을 모두 출력할 것이다.

 

3. for문을 완전히 대체하지 못하는 범위기반 for문

- 일반적인 for문에는 보통 index 값으로 i를 선언하여 조건문과 증감식을 이용해 반복문을 진행시키는 구조여서 이 index를 활용할 수 있는 경우가 있었는데, 범위 기반 for문에서는 index가 없이 위에서 본 부분인 element_declaration에 자동으로 배열 인덱스가 증가되어서 요소의 값이 저장되는 방식이라 index를 활용하기가 힘들다.

- 일반적인 방법으로는 배열의 요소를 바꿀 수 없다고 한다. 후술할 방법으로는 가능하다.

 

4. 범위 기반 for문 심화

- element_declaration의 값이 할당되는 방법은 array의 값이 복사되어서 할당되는 것이다. 배열 요소를 복사하는 것은 비용이 많이 들수 있다고 한다. 그래서 참조(&)를 이용한다. 값이 복사되지 않고 배열 요소에 대해 참조를 할 것이다.

for (int& elem : arr)
   cout << elem << endl;

- element_declaration의 자료형은 array의 자료형과 일치하여야 한다고 했다. 그래서 element_declaration의 자료형을 auto를 선언하여 프로그래머가 판단해야할 것을 덜 수 있는 방법이 있다고 한다.

for (auto& elem : arr)
   cout << elem << endl;

- element_declaration를 참조로 선언하였다고 하지만 값에 대한 변경을 허용하고 싶지 않다면 const로 선언하면 된다.

for (const auto& elem : arr)
   cout << elem << endl;

- 범위 기반 루프는 일반적인 배열 말고도 std::vector와 같은 구조에서도 작동한다고 한다.

- 포인터로 변환된 배열은 범위 기반 for문으로 사용할 수 없다고 한다. 배열의 크기를 알지 못하기 때문이라고 한다. 보통 이런 상황은 함수로 자료형의 포인터 변수를 매개변수로 넘겨받고 함수 내에서 범위 기반 for문을 사용했을 때 일어나는 문제인 것 같다.