4. 제어문(Control Flow Statements)
1. 키워드
- 제어문(Control Flow Statements)
- 조건문(Conditional Statements)
if
,if
/else
,if
/else if
/else
,switch
문- 반복문(Iteration Statements)
while
,do
/while
,for
, 범위 기반의for
문continue
,break
,goto
문
2. 조건문
1) 제어문
- C++ 프로그램이 원하는 결과를 얻기 위해서는 프로그램의 순차적인 흐름을 제어해야만 할 경우가 생긴다.
- 이때 사용하는 명령문을 제어문이라고 하며, 이러한 제어문에는 조건문, 반복문 등이 있다.
- 이러한 제어문에 속하는 명령문들은
{}
(중괄호)로 둘러싸여 있으며, 이러한{}
영역을 블록(Block)이라고 한다.
2) 조건문
- 조건문은 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문이다.
- 조건문 중에서도 가장 기본이 되는 명령문은 바로
if
문이다. - C++에서 사용하는 대표적인 조건문의 형태는 다음과 같다.
1] if
2] if
/ else
3] if
/ else if
/ else
4] switch
(1) if
문
if
문은 조건식의 결과가 참(true
)이면 주어진 명령문을 실행하며, 거짓(false
)이면 아무것도 실행하지 않는다.
if
문을 순서도로 표현하면 다음 그림과 같다.
- C++에서
if
문의 문법은 다음과 같다.
- 위의 코드에서 블록에 속한 명령문은
{}
를 기준으로 오른쪽으로 들여쓰기가 되어 있는 것을 볼 수 있다. - 이처럼 들여쓰기를 통해 코드의 가독성을 높이는 것을 인덴트(Indent)라고 하며, 될 수 있으면 모든 코드를 인덴트하는 것이 좋다.
#include <iostream>
using namespace std;
int main() {
int num;
cout << "숫자를 입력하세요: ";
cin >> num;
if (num < 5) {
cout << "입력하신 수는 5보다 작습니다." << endl;
}
if (num == 5) {
cout << "입력하신 수는 5입니다." << endl;
}
if (num > 5) {
cout << "입력하신 수는 5보다 큽니다." << endl;
}
return 0;
}
// 숫자를 입력하세요: 10 (입력)
// 입력하신 수는 5보다 큽니다.
- 위의 코드에서는
if
문을3
번 연속해서 사용하여, 사용자가 입력한 수와 숫자5
를 비교하여 그 결괏값을 출력하는 예제이다. - 만약 사용자가 숫자가 아닌 문자를 입력하면,
cin
객체는 숫자가 아니라는 의미로0
을 변수num
에 전달할 것이다. - 참고로
if
문에서 실행될 명령문이 한 줄뿐이라면{}
를 생략할 수 있다.
(2) if
/ else
문
if
문과 함께 사용하는else
문은if
문과는 반대로 주어진 조건식의 결과가 거짓(false
)이면 주어진 명령문을 실행한다.
if
/else
문을 순서도로 표현하면 다음 그림과 같다.
- C++에서
if
/else
문의 문법은 다음과 같다.
if
/else
문을 사용하면 앞선 코드를 좀 더 직관적으로 표현할 수 있다.
#include <iostream>
using namespace std;
int main() {
int num;
cout << "숫자를 입력하세요: ";
cin >> num;
if (num < 5) {
cout << "입력하신 수는 5보다 작습니다." << endl;
} else {
if (num == 5) {
cout << "입력하신 수는 5입니다." << endl;
} else {
cout << "입력하신 수는 5보다 큽니다." << endl;
}
}
return 0;
}
// 숫자를 입력하세요: 1 (입력)
// 입력하신 수는 5보다 작습니다.
- 참고로
if
/else
문에서도 실행될 명령문이 한 줄뿐이라면{}
를 생략할 수 있다.
(3) if
/ else if
/ else
문
if
/else if
/else
문은 마치 새로운 구문처럼 보이지만, 사실은 두 개의if
/else
문이 연달아 나온 것뿐이다.- 이러한
if
/else if
/else
문은 조건식을 여러 개 명시할 수 있으므로 중첩된if
문을 좀 더 간결하게 표현할 수 있다.
if
/else if
/else
문을 순서도로 표현하면 다음 그림과 같다.
- C++에서
if
/else if
/else
문의 문법은 다음과 같다.
if (조건식1)
{
조건식1의 결과가 참일 때 실행하고자 하는 명령문;
}
else if (조건식2)
{
조건식2의 결과가 참일 때 실행하고자 하는 명령문;
}
else
{
조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문;
}
- 이때
else if
문은 여러 번 나와도 상관없지만,if
문과else
문은 단 한 번만 나올 수 있다.
if
/else if
/else
문을 사용하면 앞선 코드를 더욱 간결하게 표현할 수 있다.
#include <iostream>
using namespace std;
int main() {
int num;
cout << "숫자를 입력하세요: ";
cin >> num;
if (num < 5) {
cout << "입력하신 수는 5보다 작습니다." << endl;
} else if (num == 5) {
cout << "입력하신 수는 5입니다." << endl;
} else {
cout << "입력하신 수는 5보다 큽니다." << endl;
}
return 0;
}
// 숫자를 입력하세요: 5 (입력)
// 입력하신 수는 5입니다.
- 참고로
if
/else if
/else
문에서도 실행될 명령문이 한 줄뿐이라면{}
를 생략할 수 있다.
(4) 삼항 연산자에 의한 조건문
- C++에서는
if
/else
문을 삼항 연산자를 이용하여 간단히 표현할 수 있다.
(5) switch
문
switch
문은if
/else
문과 마찬가지로 주어진 조건 값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문이다.- 이러한
switch
문은if
/else
문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편이다. - 하지만
switch
문의 조건 값으로는int
타입으로 승격할 수 있는 값만이 사용될 수 있다. - 즉, C++에서는
char
,short
,int
타입 변수 또는 리터럴과 열거체까지 사용할 수 있다. - 따라서
if
/else
문보다는 사용할 수 있는 상황이 적은 편이다.
- C++에서
switch
문의 문법은 다음과 같다.
switch (조건 값)
{
case 값1:
조건 값이 값1일 때 실행하고자 하는 명령문;
break;
case 값2:
조건 값이 값2일 때 실행하고자 하는 명령문;
break;
...
default:
조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문;
break;
}
default
절은 조건 값이 위에 나열된 어떠한case
절에도 해당하지 않을 때만 실행된다.- 이 절은 반드시 존재해야 하는 것은 아니며 필요할 때만 선언할 수 있다.
- 그리고
default
절의 위치가 꼭switch
문의 맨 마지막일 필요는 없다.
#include <iostream>
using namespace std;
int main() {
int num;
cout << "숫자를 입력하세요: ";
cin >> num;
switch (num) {
case 1:
cout << "입력하신 수는 1입니다." << endl;
break;
case 2:
cout << "입력하신 수는 2입니다." << endl;
break;
case 3:
cout << "입력하신 수는 3입니다." << endl;
break;
case 4:
cout << "입력하신 수는 4입니다." << endl;
break;
case 5:
cout << "입력하신 수는 5입니다." << endl;
break;
default:
cout << "1부터 5까지의 수만 입력해 주세요!" << endl;
break;
}
return 0;
}
// 숫자를 입력하세요: 2 (입력)
// 입력하신 수는 2입니다.
- 각
case
절 및default
절은 반드시break
키워드를 포함하고 있어야 한다. break
키워드는 조건 값에 해당하는case
절이나default
절이 실행된 뒤에 전체switch
문을 빠져나가게 해준다.- 만약
break
키워드가 없다면, 조건에 해당하는switch
문의case
절 이후의 모든case
절이 전부 실행될 것이다.
- 다음의 코드는 조건 값으로 여러 개의
char
타입 문자를 검사하는 것이다. - 이렇게
switch
문의 조건으로 여러 개의case
절을 사용하여 여러 개의 조건을 한 번에 검사할 수 있다.
#include <iostream>
using namespace std;
int main() {
char ch;
cout << "학점을 입력하세요: ";
cin >> ch;
switch (ch) {
case 'a':
case 'A':
cout << "이 학생의 학점은 A입니다." << endl;
break;
case 'b':
case 'B':
cout << "이 학생의 학점은 B입니다." << endl;
break;
case 'c':
case 'C':
cout << "이 학생의 학점은 C입니다." << endl;
break;
case 'd':
case 'D':
cout << "이 학생의 학점은 D입니다." << endl;
break;
case 'f':
case 'F':
cout << "이 학생의 학점은 F입니다." << endl;
break;
default:
cout << "학점을 정확히 입력해 주세요!(A, B, C, D, F)" << endl;
break;
}
return 0;
}
// 학점을 입력하세요: c (입력)
// 이 학생의 학점은 C입니다.
3. 반복문
- 반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문이다.
- 프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나이다.
- C++에서 사용되는 대표적인 반복문의 형태는 다음과 같다.
1] while
2] do
/ while
3] for
4] 범위 기반의 for
1) while
문
while
문은 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행한다.
- C++에서
while
문의 문법은 다음과 같다.
while
문은 우선 조건식이 참(true
)인지를 판단하여, 참이면 내부의 명령문을 실행한다.- 내부의 명령문을 전부 실행하고 나면, 다시 조건식으로 돌아와 또 한 번 참인지를 판단하게 된다.
- 이렇게 표현식의 검사를 통해 반복해서 실행되는 반복문을 루프(Loop)라고 한다.
#include <iostream>
using namespace std;
int main() {
int i = 0;
int num = 5;
while (i < num) {
cout << "while 문이 현재 " << i + 1 << "번째 반복 실행 중입니다." << endl;
i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨
}
cout << "while 문이 종료된 후 변수 i의 값은 " << i << "입니다." << endl;
return 0;
}
// while 문이 현재 1번째 반복 실행 중입니다.
// while 문이 현재 2번째 반복 실행 중입니다.
// while 문이 현재 3번째 반복 실행 중입니다.
// while 문이 현재 4번째 반복 실행 중입니다.
// while 문이 현재 5번째 반복 실행 중입니다.
// while 문이 종료된 후 변수 i의 값은 5입니다.
while
문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않을 때 프로그램이 영원히 반복되게 된다.- 이것을 무한 루프에 빠졌다고 하며, 무한 루프에 빠진 프로그램은 영원히 종료되지 않는다.
- 무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황이다.
- 따라서
while
문을 작성할 때는 조건식의 결과가 어느 순간 거짓(false
)을 가지도록 조건식의 결과를 변경하는 명령문을 반드시 포함시켜야 한다. - 참고로
while
문에서 실행될 명령문이 한 줄뿐이라면{}
를 생략할 수 있다.
2) do
/ while
문
while
문은 루프에 진입하기 전에 먼저 조건식부터 검사한다.- 하지만
do
/while
문은 먼저 루프를 한 번 실행한 후에 조건식을 검사한다. - 즉,
do
/while
문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행한다.
- C++에서
do
/while
문의 문법은 다음과 같다.
#include <iostream>
using namespace std;
int main() {
int i = 0;
int num = 2;
do {
cout << "do / while 문이 현재 " << i + 1 << "번째 반복 수행 중입니다." << endl;
i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨
} while (i > num);
cout << "do / while 문이 종료된 후 변수 i의 값은 " << i << "입니다." << endl;
return 0;
}
// do / while 문이 현재 1번째 반복 수행 중입니다.
// do / while 문이 종료된 후 변수 i의 값은 1입니다.
- 위의 코드가 만약
while
문이었다면 단 한 번의 출력도 없었을 것이다. - 하지만
do
/while
문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행해 준다.
3) for
문
for
문은while
문과는 달리 자체적으로 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문이다.- 따라서
while
문보다는 좀 더 간결하게 반복문을 표현할 수 있다.
- C++에서
for
문의 문법은 다음과 같다.
- 이때
for
문을 구성하는 초기식, 조건식, 증감식은 각각 생략될 수 있다.
for
문을 사용하면 앞선 코드의while
문을 더욱 더 간결하게 표현할 수 있다.
#include <iostream>
using namespace std;
int main() {
int i;
int num = 5;
for (i = 0; i < num; i++) {
cout << "for 문이 현재 " << i + 1 << "번째 반복 수행 중입니다." << endl;
}
cout << "for 문이 종료된 후 변수 i의 값은 " << i << "입니다." << endl;
return 0;
}
// for 문이 현재 1번째 반복 수행 중입니다.
// for 문이 현재 2번째 반복 수행 중입니다.
// for 문이 현재 3번째 반복 수행 중입니다.
// for 문이 현재 4번째 반복 수행 중입니다.
// for 문이 현재 5번째 반복 수행 중입니다.
// for 문이 종료된 후 변수 i의 값은 5입니다.
- 참고로
for
문에서 실행될 명령문이 한 줄뿐이라면{}
를 생략할 수 있다.
- C++에서는 다음의 코드처럼
for
문 안에서만 사용하는 변수를 초기식에서 직접 선언할 수 있다. - 이렇게
for
문에서 직접 선언된 변수는for
문이 종료되면 같이 소멸된다.
#include <iostream>
using namespace std;
int main() {
int num = 3;
for (int i = 0; i < num; i++) { // 변수 i는 이 for 문이 종료되면 같이 소멸됨.
cout << "첫 번째 for 문이 " << i + 1 << "번째 반복 수행 중입니다." << endl;
}
for (int i = 0; i < num; i++) { // 따라서 변수 i를 다시 선언해도 괜찮음.
cout << "두 번째 for 문이 " << i + 1 << "번째 반복 수행 중입니다." << endl;
}
return 0;
}
// 첫 번째 for 문이 1번째 반복 수행 중입니다.
// 첫 번째 for 문이 2번째 반복 수행 중입니다.
// 첫 번째 for 문이 3번째 반복 수행 중입니다.
// 두 번째 for 문이 1번째 반복 수행 중입니다.
// 두 번째 for 문이 2번째 반복 수행 중입니다.
// 두 번째 for 문이 3번째 반복 수행 중입니다.
4) 범위 기반의 for
문
- C++11부터는 범위 기반의
for
문이라는 새로운 형태의 반복문이 추가되었다. - 범위 기반의
for
문은 표현식 안에 포함되어 있는 모든 값에 대해 한 번씩 루프를 실행해 준다. - 이러한 범위 기반의
for
문은 배열을 자동으로 인식하여, 컨테이너 클래스에서 많이 사용된다.
- 다음의 코드는 범위 기반의
for
문을 사용하여 배열의 모든 값을 출력하는 것이다.
#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 3, 5, 7, 9};
for (int element : arr) {
cout << element << " ";
}
return 0;
}
// 1 3 5 7 9
4. continue
, break
, goto
문
- 일반적으로 조건식의 검사를 통해 루프로 진입하면, 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다.
- 하지만
continue
와break
문은 이러한 일반적인 루프의 흐름을 사용자가 직접 제어할 수 있도록 도와준다.
1) continue
문
continue
문은 루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어가게 해준다.- 보통 반복문 내에서 특정 조건에 대한 예외 처리를 하고자 할 때 자주 사용된다.
- 다음의 코드는
1
부터100
까지의 정수 중에서 짝수를 제외하고 홀수만을 출력하는 것이다.
#include <iostream>
using namespace std;
int main() {
int except_num = 2;
for (int i = 0; i <= 100; i++) {
if (i % except_num == 0) {
continue;
}
cout << i << " ";
}
return 0;
}
// 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
2) break
문
break
문은 루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, 반복문 바로 다음에 위치한 명령문을 실행한다.- 즉, 루프 내에서 조건식의 판단 결과와 상관없이 반복문을 완전히 빠져나가고 싶을 때 사용한다.
- 다음의 코드는
1
부터 사용자가 입력한 정수까지의 합을 구하는 것이다.
#include <iostream>
using namespace std;
int main() {
int num = 1, sum = 0;
int end_num;
cout << "숫자를 입력하세요: ";
cin >> end_num;
while (1) // 무한 루프
{
sum += num;
if (num == end_num) {
break;
}
num++;
}
cout << "1부터 " << end_num << "까지 더한 값은 " << sum << "입니다.";
return 0;
}
// 숫자를 입력하세요: 10
// 1부터 10까지 더한 값은 55입니다.
4) goto
문
goto
문은 프로그램의 흐름을 지정된 레이블로 무조건 변형시키는 명령문이다.goto
문은 다른 제어문과는 달리 아무런 조건없이 프로그램의 흐름을 옮겨준다.- 따라서 가장 손쉽게 사용할 수 있지만, 반면에 프로그램의 흐름을 매우 복잡하게 만들기도 한다.
- 이러한 단점 때문에 현재는 디버깅 이외에는 거의 사용되지 않는다.