Skip to content

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 문을 순서도로 표현하면 다음 그림과 같다.


001


  • C++에서 if 문의 문법은 다음과 같다.


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 문을 순서도로 표현하면 다음 그림과 같다.


002


  • C++에서 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;
}

// 숫자를 입력하세요: 1 (입력)
// 입력하신 수는 5보다 작습니다.


  • 참고로 if / else 문에서도 실행될 명령문이 한 줄뿐이라면 {}를 생략할 수 있다.


(3) if / else if / else

  • if / else if / else 문은 마치 새로운 구문처럼 보이지만, 사실은 두 개의 if / else 문이 연달아 나온 것뿐이다.
  • 이러한 if / else if / else 문은 조건식을 여러 개 명시할 수 있으므로 중첩된 if 문을 좀 더 간결하게 표현할 수 있다.


  • if / else if / else 문을 순서도로 표현하면 다음 그림과 같다.


003


  • 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 문을 삼항 연산자를 이용하여 간단히 표현할 수 있다.


조건식 ? 반환값1 : 반환값2


(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 (조건식)
{
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}


004


  • 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 문의 문법은 다음과 같다.


do {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);


005


#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 (초기식; 조건식; 증감식)
{
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}


006


  • 이때 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

  • 일반적으로 조건식의 검사를 통해 루프로 진입하면, 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다.
  • 하지만 continuebreak 문은 이러한 일반적인 루프의 흐름을 사용자가 직접 제어할 수 있도록 도와준다.


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 문은 다른 제어문과는 달리 아무런 조건없이 프로그램의 흐름을 옮겨준다.
  • 따라서 가장 손쉽게 사용할 수 있지만, 반면에 프로그램의 흐름을 매우 복잡하게 만들기도 한다.
  • 이러한 단점 때문에 현재는 디버깅 이외에는 거의 사용되지 않는다.

References