본문 바로가기
Program Language/c++

c++ 기초(반복문(while, do/while, for, 범위 기반 for))

by 토담이아빠 2023. 1. 9.

반복문

 

이글은 "전문가를 위한 c++(개정4)" 학습한 내용을 직접 실습해보며 정리한 Review 글입니다.


while 문

 

while문은 주어진 표현식이 true일 동안 일정한 코드 블록을 계속해서 반복합니다. 예를 들어 "안녕하세요"문장을 다섯번 출력하고 싶다면 다음과 같이 작성합니다.


int i = 0;
while (i < 5){ //i값이 5보다 작을 동안 반복한다.
	cout << "안녕하세요." << endl;
	i++;
}

반복문 안에서는 break, continue 키워드를 사용할 수 있습니다. break는 사용즉시 반복문을 빠져나와 다음 코드를 실행합니다. continue문은 반복문의 첫번째 줄인 조건 표현식으로 돌아가서 다시 실행합니다.다음은 continue문을 사용하여 5보다 큰 수를 더하는 예제입니다.


#include <iostream>
#include <array>
 
using namespace std;
 
int main()
{	
	array<int, 8> arr = {120, 100, 111, 3, 121, 105, 108, 111};
	
	int i = 0;
	int size = arr.size();
	int sum = 0;
 
	while (i < size){
 
		if (arr[i] < 5) {
			i++;
			continue;
		}
 
		sum += arr[i];
 		i++;
	}
 
	cout << "Sum = " << sum << endl;
 
	return 0;
}

결과


반복문 안에서 continue 문의 사용은 조건문과 함께 최대한 앞줄에 배치하여 단란 논리와 유사하게 사용하는 것이 좋습니다. 조건 문 뒤쪽으로 따라오는 내용이 실행시간이 오래 걸린다면 앞쪽 조건 논리 결과에 따라 실행할 필요가 없을 수도 있기 때문입니다. 

 

위의 반복문 내용은 continue 사용없이 다음과 같이 바꾸어도 결과는 동일합니다.


while (i < size) {
 
	if (arr[i] > 5) {
		sum += arr[i];
	}
	i++;
}

이 책의 저자는 반복문 안에서 continue사용은 자제할 것을 권고합니다. 프로그램의 흐름을 갑자기 바꾸는 것은 좋지 않다는 것이 이유입니다. 물론 수긍되는 내용입니다. 하지만 반복문 안에서 제어문을 사용할 상황이라면 continue문과 함께 사용하는 것은 무방하다고 생각됩니다. 어짜피 제어문의 역할이 프로그램의 흐름을 바꾸는 것이기 때문입니다. 따라서 적절히 본인의 논리에 맞게 사용하시면 될 것 같습니다.

 

do ~ while문

 

while문과 비슷하지만 먼저 한번 실행하고 조건 검사를 한 뒤 루트를 계속 진행할 지를 결정합니다. 다음은 조건 값이 false이더라도 "안녕하세요"란 문장이 한번 출력되는 예를 보여줍니다.


#include <iostream>
 
using namespace std;
 
int main()
{	
	int i = 100;
 
	do {
		cout << "안녕하세요" << endl;
		i++;
	} while (i < 5);
 
	return 0;
}

결과


for 문

 

반복문 중 가장 사용 빈도가 높은 것이 for문일 것입니다. 초기 표현식, 종료 조건, 매번 반복이 끝날 때 마다 실행할 문장으로 반복문을 구성할 수 있어서 좀 더 편하기 때문입니다. 다음 예를 보면 그 편리성을 쉽게 확인할 수 있습니다.


for (int i = 0; i < 5; i++) {
	cout << "안녕하세요" << endl;
}

'i값은 0부터 4까지 1씩 증가시키며 블럭 내용을 실행하라'라는 내용으로 쉽게 직관적으로 파악할 수 있습니다.

 

범위 기반 for문

 

이 구문은 컨테이너에 담긴 원소에 대해 반복문을 실행하는데 편리합니다. c스타일 루프, 이니셜라이저 리스트, std::array, std::vector 등 표준 라이브러리에서 제공하는 반복자(begin(), end())를 리턴하는 모든 타입의 컨테이너에 적용할 수 있습니다. 

 

다음 예제는 먼저 정수값 네 개로 구성된 배열을 정의한 뒤 범위 기반 for문을 돌면서 이 배열의 모든 원소에 대한 복제본을 화면에 출력합니다. 


#include <iostream>
#include <array>
 
using namespace std;
 
int main()
{	
	array<int, 5> arr = { 1,2,3,4,5 };
	
	for (int i : arr) {
		cout << i << endl;
	}
 
	return 0;
}

복사 방식은 오버헤드가 크기 때문에 대부분 참조 방식으로 사용합니다. 다음과 같이 참조 방식으로 사용하는 것을 추천합니다.


for (int& i : arr) {
	cout << i << endl;
}

 

 

'Program Language > c++' 카테고리의 다른 글

c++ 기초(스택과 힙)  (0) 2023.01.11
C++ 기초(이니셜라이저 리스트)  (0) 2023.01.10
C++ 기초(구조적 바인딩)  (0) 2023.01.09
c++ 기초(c++ 스타일 배열)  (0) 2023.01.06
c++ 기초(C 스타일 배열)  (0) 2023.01.05

댓글