C & C++

C++ 스타일의 for문(범위 기반 for문) : 배열, 문자열, 벡터 순회 예제

jimmy_AI 2022. 4. 20. 22:39
반응형

C++ 범위 기반 for문 사용법

이번 글에서는 C++에서 제공하는 스타일의 for문인 범위 기반 for문의 사용 방법을

array, string 및 vector에서의 사용 예제를 통해서 살펴보겠습니다.

 

 

배열 순회 예시, 값 변경 시 주의 사항

배열 내 값들을 순회할 때, C언어 스타일의 순회 방법도 C++에서 여전히 사용 가능하지만

아래의 예시 코드와 같이 for(자료형 순회 변수 : 배열) 형태로도 사용하실 수 있습니다.

이와 같은 형태로 for문을 사용하는 방식을 범위 기반 for문이라고 합니다.

#include <iostream>

using namespace std;

int main() {
  int arr1[] = {0, 1, 2, 3};

  // C언어 스타일의 for문
  for(int i = 0; i < 4; i++){
    cout << arr1[i] << '\n';
  }

  // C++ 스타일의 for문
  for(int num : arr1){
    cout << num << '\n';
  }
}

위 코드를 실행시켜보면, 두 for문 모두 arr1의 원소인 0, 1, 2, 3이 한 줄씩 걸쳐 출력됩니다.

 

단, 범위 기반 for문 사용 시 주의 사항으로 순회 도중 값을 변경시키고 싶은 경우에는

Call by Reference 방식의 순회를 해주셔야 값 수정이 가능하다는 점입니다.

#include <iostream>

using namespace std;

int main() {
  int arr1[] = {0, 1, 2, 3};

  // Call by Value : 실제 저장 값 변화 X
  for(int num : arr1){
    num *= 2;
  }
  
  // 0, 1, 2, 3이 한 줄씩 걸쳐 출력
  for(int num : arr1){
    cout << num << '\n';
  }

  // Call by Reference : 실제 저장 값 변화 O
  for(int &num : arr1){
    num *= 2;
  }

  // 0, 2, 4, 6이 한 줄씩 걸쳐 출력
  for(int num : arr1){
    cout << num << '\n';
  }
}

위의 코드에서 첫 for문의 Call by Value 방식으로는

배열에 실제로 저장된 값을 변화시킬 수 없습니다.

따라서, 다시 배열을 순회하며 값을 출력하면 0, 1, 2, 3이 그대로 출력되는 것을 볼 수 있습니다.

 

반면, 아래의 for문처럼 순회 변수에 &를 붙여 Call by Reference 방식으로 바꿔주시면

실제 저장 값의 변경이 가능해지고, 결국 최종적으로 원래 값에 2배가 곱해진

0, 2, 4, 6이 한 줄씩에 걸쳐서 출력되는 것을 확인하실 수 있습니다.

반응형

문자열, 벡터 순회 예시

char 자료들의 배열로 볼 수 있는 문자열 자료형이나

C++에서 제공하는 또다른 자료형 형태인 벡터에서도

위와 같은 형태의 범위 기반 for문 사용이 가능합니다.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
  // 문자열 순회 예시
  string str1 = "hello world!";

  for(char chr : str1){
    cout << chr;
  }
  cout << '\n';

  // 벡터 순회 예시
  vector<int> vec1 = {0, 1, 2, 3}; 

  for(int num : vec1){
    cout << num << '\n';
  }
}

실제로 위의 코드를 실행시켜보면 각각의 string 및 vector에 저장된 값들이

잘 출력된다는 점을 확인하실 수 있습니다.

 

물론, 문자열과 벡터의 경우에도 값 수정이 필요한 경우, 마찬가지로 Call by Value가 아닌

Call by Reference 형태로 순회를 진행해주셔야 한다는 점에 유의해주셔야 합니다.