- 프로그래밍 언어(Programming Language)/C\C++

[C/C++ Syntax] #009 반복문(Repetitive statement)

mymir 2021. 1. 8. 10:47

컴퓨터의 가치를 높여주는 기능은 여러가지가 있지만 그 중에서도 빠른 반복은 꽤 높은 순위에 위치할 것입니다. 이번 글에서 소개할 반복문(repetitive statement) 또한 제어문 중 하나로, 그 구조를 배워보겠습니다.

 

 

 

반복문이란?


반복문은 loop라고도 불리며, 문장들을 차례로 수행하는 순차 구조에서 벗어나 특정 문장들을 특정 조건하에 계속 반복하는 역할을 해주는 하나의 문장입니다. C언어에서 흔히 사용하는 반복문에는 while, do-while, for 3가지가 있습니다.

 

 

 

while loop


while loop는 특정 조건이 참인 동안 계속하여 반복을 실행하는 문장구조를 갖습니다. 그 구조는다음과 같습니다.

먼저 조건식의 결과값이 참인지 거짓인지 판별한 뒤 참인 경우에 문장 n들을 수행합니다. (조건식이 거짓인 경우에 while문을 읽지 않고 넘어갑니다.) 그 다음에 다시 조건식을 판별하여 다시 문장 n들을 수행합니다. 이러한 반복이 조건식의 결과값이 거짓으로 판별될 때까지 반복하며, 조건식이 거짓으로 판별되면 문장 n들을 더 이상 수행하지 않고 넘어가게 됩니다. 여기서도 마찬가지로 while (조건식) 이후 중괄호로 문장들을 묶지 않으면 이후 한 문장만 while문에 귀속되어 그 한 문장만 반복됩니다.

 

while문을 사용하여 구구단을 출력하는 예제 프로그램을 하나 작성해보도록 하겠습니다.

#include <iostream>

using namespace std;

int main() {
	int n;
	int i = 1;
	cout << "원하는 단수를 입력하시오. : ";
	cin >> n;

	while(i <= 10){
		cout << n << " X " << i << " = " << n * i << endl;
		i++;
	}
}

 

 

do - while loop


do - while문 또한 while문과 마찬가지로 특정 조건이 참인 동안 계속 반복을 실행하는 구조이지만, 조건을 판별하는 순서가 while문과는 반대의 구조를 갖고 있습니다. while문은 한 회당 조건을 판별하고 문장을 실행하는 형식이였지만 do-while문은 한 회당 문장을 먼저 실행하고 조건을 판별하는 형식입니다. do-while문의 구조는 다음과 같습니다.

do-while문은 이전의 제어문들과는 다르게 while(조건식) 다음에 반드시 세미콜론을 붙여 사용해야합니다. 또한 앞서 말한 수행-판별 구조에 따라 do-while문 내부의 문장들은 적어도 한 번은 수행된다는 특징을 가지고 있습니다. 이 do-while문을 사용하여 up-down 게임을 작성해보도록 하겠습니다.

#include <iostream>

using namespace std;

int main() {
	const int answer = 77;
	int n;
	
	do {
		cout << "추측할 숫자를 입력하시오. : ";
		cin >> n;

		if (n > answer)
			cout << "down" << endl;
		else if (n < answer)
			cout << "up" << endl;
		else
			cout << "정답" << endl;
	} while (n != answer);
}

 

for loop


while문과 같은 사건 제어 루프문은 반복문을 탈출 할 수 있도록 조건식에 사용되는 데이터를 변경시켜 특정 순간에 조건식의 값이 false가 되도록 하는 것이 일반적입니다. 그렇지 않으면 조건식의 값이 항상 true가 되는 무한루프를 생성해버리기 때문이죠. (break 사용하여 탈출하는 방법도 있습니다. 아래에서 설명하겠습니다.)for문은 이런 조건식의 변경을 조건식과 가까운 위치에 두어 사용할 수 있도록 만들어졌습니다. 그 구조는 다음과 같습니다.

초기식은 for문의 처음에서 한 번만 실행되는 문장입니다. 조건식은 이전과 마찬가지로 문장 n들의 수행 이전에 참 거짓을 판별하여 참인 경우에만 다음 회차의 반복을 수행할 수 있도록 하는 문장입니다. 증감식은 한 회차의 for문의 마지막마다 수행되는 문장입니다. 초기식, 조건식, 증감식은 각각 없을 수 있으며 세미콜론은 각 식을 구분하기 위한 용도이므로 반드시 적어주어야 합니다.

 

for문을 사용하여 위의 예제와 같이 구구단을 출력하는 프로그램을 만들어보겠습니다.

#include <iostream>

using namespace std;

int main() {
	int n;
	cout << "원하는 단수를 입력하시오. : ";
	cin >> n;

	for (int i = 1; i <= 10; i++) {
		cout << n << " X " << i << " = " << n * i << endl;
	}
}

여기서 초기식 부분에서 변수 i의 선언이 일어났는데 이 i는 해당 for문이 종료되면 이후에 사용할 수 없습니다. 이에 관련해선 이후에 지역변수 개념을 다루면서 자세히 알아보도록 하겠습니다.

 

이렇게 알아본 반복문도 조건문과 마찬가지로 하나의 문장이므로 반복문 내부에 또다른 반복문이 오는 중첩의 형태가 가능합니다. 다만 문장의 실행순서를 바꾸는 이런 제어문들이 중첩되어 사용되면 다소 복잡하기때문에 실수나 오류를 범할 가능성이 높아집니다. 따라서 많은 연습을 통해 자유롭게 사용할 수 있도록 연습을 하는 것이 좋습니다.

 

 

 

break


break문은 반복문을 중단하기 위한 문장으로, 주로 if문과 함께 사용되어 반복문의 조건식 외에 다른 조건에서도 반복문을 탈출할 수 있도록 해주는 문장입니다. 무한 루프 내에서 특정 값을 입력받으면 반복문이 종료되는 프로그램을 만들어보도록 하겠습니다.

#include <iostream>

using namespace std;

int main() {
	int i;
	while (1) {
		cout << "값을 입력하시오.(-1 입력시 종료) : ";
		cin >> i;
		if (i == -1) {
			break;
		}
	}
}

만약 break문이 중첩된 반복문 내부에서 사용되면 break가 읽히는 가장 내부의 반복문만 종료됩니다. 만약 중첩된 반복문 전체를 탈출하고 싶다면 goto문을 이용하면 됩니다.

 

 

 

goto


goto는 무조건적으로 다음 실행할 문장을 지정하는 문장입니다. 문장 자체는 오류가 없지만 무조건 점프라는 특성때문에 코드를 복잡하게 하는 등의 문제점이 있어 거의 사용되지 않는 키워드이지만 위와 같이 특수한 경우에 가끔 사용되곤 합니다. 구조는 다음과 같습니다.

먼저 'goto 레이블명;'이 읽히면 해당 레이블명의 위치로 점프합니다. 그렇게되면 문장 A-n들은 읽히지 않고 다음으로 B-n들이 읽히는 것이죠. 레이블명이 goto문보다 이전에 위치하면 반복문과 같이 사용될 수 있습니다.

 

 

 

continue


continue는 현재 수행되고 있는 회차의 반복만 뛰어넘도록 하는 문장입니다. 반복 도중 continue문이 읽히면 현재 회차의 진행을 중단하고 다음 회차의 시작으로 넘어가는 것이죠. 이를 이용하여 1부터 10까지의 자연수 중 짝수만을 출력하는 프로그램을 작성해보겠습니다.

#include <iostream>

using namespace std;

int main() {
	for (int i = 1; i <= 10; i++) {
		if (i % 2 != 0)
			continue;
		cout << i << endl;
	}
}