안녕하세요, katte입니다.
이번 글에서는 Range 기반 for 루프에 대해 알아보겠습니다.
Range 기반의 for 루프는 C++11에서 추가된 기능입니다.
지금까지 우리는 for 루프를 사용하여 배열 요소에 접근할 때, 다음과 같은 방법을 사용해야 했습니다.
int arr[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; ++i)
std::cout << arr[i] << std::endl;
그러나 range 기반 for 루프를 사용하면 배열 요소에 좀 더 깔끔하게 접근할 수 있습니다.
int arr[5] = { 1,2,3,4,5 };
for (int var : arr)
std::cout << var << std::endl;
첫 번째 코드와 두 번째 코드의 출력 결과는 완전히 같습니다.
자, 우선 두 번째 코드를 살펴봅시다.
for 구문의 제어부분을 보면, 본래 우리가 쓰던 두 개의 세미콜론으로 나누어진 형식이 아닌
낯선 형식이 자리잡고 있음을 알 수 있습니다.
for(typename var: array)
먼저 괄호 안에서 지역변수 var을 선언합니다. 이때 선언된 변수 var은 배열의 첫 번째 요소의 값으로 초기화됩니다.
이후 루프의 몸체부분을 실행한 뒤, var에 그 다음 요소의 값이 대입됩니다.
var은 지역변수이므로 루프를 벗어나면 소멸하지만, 루프 안에서는 자유롭게 사용 가능합니다.
변수 var에는 int, float과 같은 자료형 뿐만 아니라, 클래스나 구조체도 올 수 있습니다. 이때 var의 자료형은 배열 요소들의 자료형과 같아야 합니다.
따라서 역시 C++11에서 추가된 기능인 auto 키워드를 사용하면, 배열 요소의 자료형과 다른 자료형으로 변수를 선언하는 실수를 막을 수 있습니다.
#include <iostream>
struct Point
{
int x;
int y;
Point(int x_= 0, int y_= 0) :x(x_), y(y_){}
};
int main()
{
Point point_arr[5]; //구조체 배열
for (auto point_var : point_arr) //auto 키워드 사용!
std::cout << point_var.x << ", " << point_var.y << std::endl;
}
또한 이 range 기반 루프를 사용해야 할 때 주의해야 할 점은, 배열 요소가 선언한 변수에 단순 대입된다는 것입니다.
값이 단순 대입된다는 것은 즉, 값이 1대 1로 복사되는 것이기 때문에 이 변수를 통해 배열 요소의 값을 변경하는 것은 불가능합니다.
인덱스를 통해 배열에 직접 접근해서 변경하면 되지 않나요...? 라고 생각할 수도 있지만 그러려면 따로 인덱스 변수를 선언하고 루프마다 증가시켜서 접근해야 하니 굳이? 싶은 방법이죠.
따라서 배열 요소를 변경하기 위해서는 변수를 레퍼런스로 선언해주어야 합니다.
int arr[5] = { 1,2,3,4,5 };
for (int& var : arr)
var = 2;
for (int var : arr)
std::cout << var << std::endl;
위와 같이 변수를 레퍼런스로 선언해주면 배열 요소의 값을 변경할 수 있습니다.
위의 코드를 컴파일해 보면 모든 배열 요소들이 2로 바뀌었음을 확인할 수 있습니다.
마지막으로, 배열 대신에 초기화 리스트를 사용할 수도 있습니다.
for (int var : { 1,2,3,4,5 })
std::cout << var << std::endl;
해당 코드를 컴파일해 보면 정상적으로 초기화 리스트의 숫자들이 출력됨을 확인할 수 있습니다.
* 해당 글은 'C++ 기초 플러스 6판'을 참고하였습니다.
'Computer > C++' 카테고리의 다른 글
[C++] 입출력과 스트림, 버퍼 (0) | 2022.10.26 |
---|---|
[C++] cin 잘못된 입력 판별하기, 입력 버퍼 비우기 (0) | 2022.10.23 |
[C++] cctype 라이브러리 소개 (0) | 2022.10.23 |
[C++] EOF에 관한 이야기 (0) | 2022.10.22 |
[C++] ctime, clock()으로 경과한 시간 불러오기 (0) | 2022.10.21 |