티스토리 뷰

※ 주의 사항 ※

  • 이 글의 목적은 '지식의 전달'이 아닌 '학습의 기록'입니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.

 

C++에서 사용하는 for문은 C언어로부터 물려받은 반복문입니다. 사용 예는 다음과 같습니다.

#include <iostream>

int main()
{
	for(int i = 0; i < 10; i++)
	{
		std::cout << i << ' ';
	}
	std::cout << std::endl;

	return 0;
}

/*
실행 결과

0 1 2 3 4 5 6 7 8 9

*/

 

만약 다음과 같은 배열이 있다고 가정했을 때,

int arr[] = { 11, 1010, 22, 99, 33, 88, 44, 77, 55, 66 };

 

for문을 이용해 위 배열의 각 요소들을 순서대로 출력하려면 다음과 같이 할 수 있습니다.

#include <iostream>

int main()
{
	int arr[] = { 11, 1010, 22, 99, 33, 88, 44, 77, 55, 66 };

	for (int i = 0; i < 10; i++)
	{
		std::cout << arr[i] << ' ';
	}
	std::cout << std::endl;

	return 0;
}

/*
실행 결과

11 1010 22 99 33 88 44 77 55 66

*/

 

인덱스 i를 이용해서 배열의 각 요소에 직접 접근하는 모습입니다. 하지만 '범위 기반 for문'을 이용하면 다음과 같이 할 수 있습니다.

#include <iostream>

int main()
{
	int arr[] = { 11, 1010, 22, 99, 33, 88, 44, 77, 55, 66 };

	for (int number : arr)     //범위 기반 for문의 차별점
	{
		std::cout << number << ' ';
	}
	std::cout << std::endl;

	return 0;
}

/*
실행 결과

11 1010 22 99 33 88 44 77 55 66

*/

 

범위 기반 for문은 특별할 것 없습니다. arr이라는 그룹 내의 모든 멤버들을 한 번에 하나씩 변수 number에 저장하고, 이 number를 가지고 원하는 작업을 수행하도록 합니다. 위 예제에서 일어나는 일을 설명하면 다음과 같습니다. 처음 for문을 실행할 때는 arr의 첫 번째 요소인 '11'이 number에 저장되고 이를 출력합니다. 그 다음엔 arr의 두 번째 요소인 '1010'을 number에 저장하고 이를 출력합니다. arr의 마지막 요소를 number에 저장하고 출력할 때까지 이를 반복합니다.

 

이런 문법은 자바나 C#같은 객체 지향 언어들은 모두 하나씩 가지고 있습니다. 자바의 foreach문이 그러합니다. 그래서 객체 지향 언어를 조금 맛본 사람은 C++의 범위 기반 for문을 낯설어하지 않을 것 같습니다.

 

저는 위 예제를 보면서 배열 arr에 있는 모든 요소들을 하나씩 number에 저장할 때마다 값의 복사가 일어날 것이라고 생각했습니다. 만약 객체로 이루어진 배열을 다루게 될 경우 혹은 객체들을 저장하는 컨테이너를 다루게 될 경우, 범위 기반 for문이 끝나기까지 계속 이런 복사가 이뤄진다면 프로그램의 성능에 안 좋은 영향을 끼칠 수 있을 것이라고 생각했습니다. 그래서 arr의 요소들을 참조자로 받으면 어떨까 생각했고 다음과 같이 코드를 수정해서 실행해 보았습니다.

#include <iostream>

int main()
{
	int arr[] = { 11, 1010, 22, 99, 33, 88, 44, 77, 55, 66 };

	for (int& number : arr)     //참조자 사용
	{
		std::cout << number << ' ';
	}
	std::cout << std::endl;

	return 0;
}

/*
실행 결과

11 1010 22 99 33 88 44 77 55 66

*/

 

프로그램의 실행에는 아무런 문제가 없었습니다. 따라서 저는 앞으로 범위 기반 for문을 사용할 때는 참조자를 사용하는 습관을 들일 생각입니다.

'공부 일지 > CPP 공부 일지' 카테고리의 다른 글

C++17 Date and time utilities  (0) 2022.02.07
C++ | mutable 키워드  (0) 2021.08.10
C++ | 상수 표현식(constexpr )  (0) 2021.08.07
C++ | 열거형  (0) 2021.08.06
C++ | 묶음 타입(구조체와 공용체)  (0) 2021.08.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함