제어문 (Control Flow Statement)

C++ 프로그램이 원하는 결과를 얻기 위해서는 프로그램의 순차적인 흐름을 제어해야만 할 경우가 생긴다. 이때 사용하는 명령문을 제어문이라고 하며, 이러한 제어문에는 조건문, 반복문 등이 있다.

이러한 제어문에 속하는 명령문들은 중괄호 {} 로 둘러싸여 있으며, 이러한 중괄호 영역을 블록이라고 한다.


조건문

프로그램에서 조건에 따라 프로그램의 흐름을 바꿔야 하는 경우가 있다. 이러한 경우에 사용할 수 있는 문장이 if 문이다. if 문은 영어 단어 if 의 의미처럼 “만약 ~하면 ~한다.”라고 해석하면 된다.

if

if 문의 형식은 다음과 같다.

if (조건식)
{
	실행문;
}

if 문에서 조건식이 true 면 실행문을 실행하고, false 면 실행문을 실행하지 않는다.

#include <iostream>

int main()
{
	int a = 5;

	if (a < 6) // 참
		std::cout << "a < 6 입니다." << std::endl;

	if (a > 6) // 거짓
		std::cout << "a > 6 입니다." << std::endl;

	return 0;
}
a < 6 입니다.

else if, else

else if 문을 통해 if 문을 연속적으로 사용할 수 있다.

if (조건식1)
{
    실행문1;
}
else if (조건식2)
{
    실행문2;
}

만약 ‘조건식1’이 true 라면 ‘실행문1’이 실행된다. 그러나 ‘조건식1’이 false 이고, ‘조건식2’가 true 라면 ‘실행문2’가 실행된다.

또한 else 문을 통해 조건식이 모두 거짓인 경우에도 처리할 수 있다.

if (조건식1)
{
    실행문1;
}
else if (조건식2)
{
    실행문2;
}
else
{
    실행문
}

‘조건식1’과 ‘조건식2’가 모두 false 라면 ‘실행문3’이 실행된다.

위와 같이 if, else if, else 를 통해 여러 if 문을 연속적으로 사용할 때 위에서 아래로 차례대로 조건식을 계산하며 조건에 맞는 if 문이 실행되면 그 뒤의 if 문들은 건너뛰게 된다.

#include <iostream>

int main()
{
	int score = 81;

	if (score >= 90) // 90점 이상 A
	{
		std::cout << "점수 : " << score << std::endl;
		std::cout << "등급 : A" << std::endl;
	}
	else if (score >= 80) // 89 ~ 80점 B
	{
		std::cout << "점수 : " << score << std::endl;
		std::cout << "등급 : B" << std::endl;
	}
	else if (score >= 70) // 79 ~ 70점 C
	{
		std::cout << "점수 : " << score << std::endl;
		std::cout << "등급 : C" << std::endl;
	}
	else if (score >= 60) // 69 ~ 60점 D
	{
		std::cout << "점수 : " << score << std::endl;
		std::cout << "등급 : D" << std::endl;
	}
	else // 60점 미만 F
	{
		std::cout << "점수 : " << score << std::endl;
		std::cout << "등급 : F" << std::endl;
	}

	return 0;
}
점수 : 81
등급 : B

중첩 if

if 문 안에 다른 if 문이 들어갈 수도 있다.

#include <iostream>

int main()
{
	int score = 81;

	if (score >= 80)
	{
		if (score >= 90)
		{
			std::cout << "점수 : " << score << std::endl;
			std::cout << "등급 : A" << std::endl;
		}
		else
		{
			std::cout << "점수 : " << score << std::endl;
			std::cout << "등급 : B" << std::endl;
		}
	}

	return 0;
}
점수 : 81
등급 : B

switch

프로그램에서 조건에 따라 프로그램의 흐름을 바꿔야 하는 경우 if 문을 사용할 수 있다. 하지만 if 문은 조건식이 truefalse 냐에 따라서 실행할 문장이 둘 중 하나로 결정된다. 만약 여러 경로 중에서 하나를 선택하는 경우 if else 문을 통해서 표현이 가능하지만 switch 문을 사용하는 것이 좀 더 간결해 보인다.

switch 문의 형식은 다음과 같다.

switch (제어식)
{
case A:                // 제어식의 값이 A이면 실행문1 이 실행됩니다.
        실행문1;
        break;
case B:                // 제어식의 값이 B이면 실행문2 가 실행됩니다.
        실행문2;
        break;
case C:                // 제어식의 값이 C이면 실행문3 이 실행됩니다.
        실행문3;
        break;
default:               // 일치하는 값이 없으면 실행문4 가 실행됩니다.
        실행문4;
        break;
}

switch 문에서는 제어식을 계산하여 그 값을 각 case 절의 값(A, B, C)과 비교하여 제어식의 값과 일치하는 값이 있으면 해당 case 절의 실행문을 실행하다 break 문에 도달하면 switch 문은 종료된다.

이때 제어식의 값은 반드시 정수 값(또는 하나의 문자)으로 계산되어야 하고, 만약 case 절에서 일치하는 제어식의 값을 찾지 못했다면 default 절이 실행된다. default 문은 생략될 수 있으며 마지막이 아닌 위치에 써주어도 상관없다.

#include <iostream>

int main()
{
	int number = 2;

	switch (number)
	{
	case 1:
		std::cout << "number = 1" << std::endl;
		break;
	case 2:
		std::cout << "number = 2" << std::endl;
		break;
	case 3:
		std::cout << "number = 3" << std::endl;
		break;
	default:
		std::cout << "number = ?" << std::endl;
		break;
	}

	return 0;
}
number = 2

반복문

프로그래밍에서 어떠한 대상에 대하여 같은 처리 과정을 반복하는 일은 자주 발생한다. 이럴 때 반복문을 사용하면 프로그램을 간결하게 만들 수 있다.

for

for 문은 주로 정해진 횟수만큼 반복할 때 사용한다. for 문은 초기식, 조건식, 증감식의 세 부분으로 구성되며 이들 세 부분은 세미콜론 ; 으로 구분되어 있다.

for(초기식; 조건식; 증감식)
{
    반복되는 문장;
}

for 문에서 초기식은 가장 먼저 실행되고 딱 한 번만 실행된다.

이어서 조건식을 검사하며 조건식이 true 면 반복 문장이 실행된다.

반복 문장 실행이 끝나면 증감식이 실행되고, 이어서 다시 조건식이 검사된다.

만약 한 번이라도 조건식이 false 이면 바로 for 문을 벗어나게 된다.

Untitled

#include <iostream>

int main()
{
	// 1 ~ 5 까지 화면에 출력하는 프로그램
	for (int i = 1; i <= 5; i++)
		std::cout << i << std::endl;

	return 0;
}
1
2
3
4
5

범위 기반 for

범위 기반 for 문(ranged-based for statement)은 C++11 에서 도입된 새로운 유형의 반복문으로 더 간단하고 안전하게 배열, std::vector, std::list, std::map 등의 모든 요소를 반복할 수 있다.

for(Type element : DataList)
{
    반복되는 문장;
}

범위 기반 for 문은 다음과 같은 특징이 있다.

#include <iostream>
#include <vector>

int main() 
{
	std::vector<int> Vec = { 0, 1, 2, 3, 4 };
	for (int Num : Vec)
		std::cout << Num << " ";
	
	return 0;
}
0 1 2 3 4

각 요소들을 복사를 통해 반복하는 것은 비용이 많이들 수 있다. 따라서 범위 기반 for 문 에서는 참조 또는 const 참조를 사용하는 것이 좋다.

참조를 사용하지 않을때는 element 를 수정해도 원본에 영향을 주지 않지만, 참조를 사용하는 경우에는 element 를 수정할 경우 원본 요소에도 영향을 미친다.

#include <iostream>
#include <vector>

int main() 
{
	std::vector<int> Vec = { 0, 1, 2, 3, 4 };
	for (const int& Num : Vec)
		std::cout << Num << " ";
	
	return 0;
}
0 1 2 3 4

while

while 문은 주어진 조건식이 true 면 문장을 실행하는 구조이다.

while(조건식)
{
    반복되는 문장;
}

while 문의 조건식은 true, false 로 계산될 수 있는 수식이다. 만약 처음부터 조건식의 값이 false 면 문장은 한 번도 실행되지 않는다.

Untitled

#include <iostream>

int main()
{
	int i = 1;

	// 1 ~ 5 까지 화면에 출력하는 프로그램
	while (i <= 5)
		std::cout << i++ << std::endl;

	return 0;
}
1
2
3
4
5

do while

do while 문은 while 문과 비슷하지만 반복 조건을 루프의 처음이 아니라 로프의 끝에서 검사한다는 것이 다르다.

do
{
    반복되는 문장;
} while (조건식);

do while 문은 while 문과 달리 조건식이 false 이어도 루프 안의 문장이 한 번은 실행되며, 이후에 조건식을 검사하여 true 면 반복을 계속한다.

Untitled