Programming/C

C언어 - 흐름의 분기(if, else, continue, break, switch)

JunsuKim 2021. 9. 17.
728x90

if문을 이용한 조건적 실행

분기의 가장 기본은 if와 else로 구성이 된 if~else이다. 이 중 if는 독립적으로 사용되어 "조건적 실행"을 가능하게 한다.

if(num1 > num2) {
    printf("num1이 num2보다 크다.\n");
    printf("%d > %d\n", num1, num2);
}

 

위 사진처럼 if문은 위에서부터 순서대로 흐름이 진행된다. 

 

if문을 통해 선택적인 사칙연산 프로그램을 만들어보자.

#include<stdio.h>

int main() {
    int select = 0;
    double num1 = 0, num2 = 0, result = 0;
    
    printf("1. 덧셈, 2. 뺄셈, 3. 곱셈, 4. 나눗셈\n");
    printf("어떤 연산을 하겠습니까? ");
    scanf("%d", &select);
    printf("두개의 수를 입력: ");
    scanf("%d %d", &num1, &num2);
    
    if(select == 1) result = num1 + num2;
    if(select == 2) result = num1 - num2;
    if(select == 3) result = num1 * num2;
    if(select == 4) result = num1 / num2;
    
    printf("연산 결과: %f\n", result);
    return 0;
}

위 코드에서는 문제점이 있는데, select변수에 어떤 값을 입력하든, 13행~16행의 조건문이 모두 실행되는 것이다. 이는 불필요한 연산을 하는 것이기 때문에 효율적이지 못하다. 더 효율적인 코드를 짤 수 있는 방법은 if~else문을 사용하는 것이다.

if~else문을 이용한 흐름의 분기

else는 독립적으로 사용되지 못하고 if와 더불어 하나의 문장을 구성하는 형태이다.

if(num1 > num2) printf("num1이 num2보다 크다.\n");
else printf("num2가 num1보다 크다.\n");

위와 같이 if문 안의 조건이 틀렸다면 else 블록이 실행되는 구조이다.

 

위와 같이 두 블록으로만 구성이 된다면 if, else를 사용하는 구조였다.

하지만 셋 이상의 블록으로 구성이 된다면 if, else if, else를 사용하는 구조가 된다.

if문을 설명할 때 작성한 사칙연산 프로그램을 if, else if, else를 사용해 다시 작성해보겠다.

#include<stdio.h>

int main() {
    int select = 0;
    double num1 = 0, num2 = 0, result = 0;
    
    printf("1. 덧셈, 2. 뺄셈, 3. 곱셈, 4. 나눗셈\n");
    printf("어떤 연산을 하겠습니까? ");
    scanf("%d", &select);
    printf("두개의 수를 입력: ");
    scanf("%d %d", &num1, &num2);
    
    if(select == 1) result = num1 + num2;
    else if(select == 2) result = num1 - num2;
    else if(select == 3) result = num1 * num2;
    else result = num1 / num2;
    
    printf("연산 결과: %f\n", result);
    return 0;
}

위 코드는 처음 if로만 작성했던 코드와 결과는 똑같으나 select에서 할당받은 값과 같은 조건블록만 실행이 되므로 더 효율적인 코드가 된다.

조건 연산자: 피 연산자가 세개인 "삼 항 연산자"

"삼 항 연산자"는 피연산자의 수가 세개이며 if~else문을 일부 대체할 수 있다.

(num1 > num2) ? num1 : num2;
// 조건 ? 참 : 거짓

"삼 항 연산자"는 기호 ? 와 기호 :로 이뤄진다. 기호 ?앞에 있는 조건이 참일 시 첫번째 데이터가 반환되고

거짓일 시 두번째 데이터가 반환된다.

반복문의 탈출

1. break

break문이 실행되면 break문을 가장 가까이서 감싸고 있는 반복문 하나를 빠져나오게 된다.

#include<stdio.h>

int main() {
    int sum = 0, num = 0;
    
    while(1) { // 무한루프
        sum += num;
        if(sum > 5000) break;
        num++;
    }
    printf("sum: %d\n", sum);
    printf("num: %d\n", num);
    return 0;
}

/*출력
sum: 5050
num: 100
*/

코드를 보면 무한루프인 반복문을 계속해서 실행하다 sum이 5000을 넘으면 while문을 탈출하게 된다.

* break문이 if문과 함께 쓰이고 있다 하여 if문을 빠져 나오는 것으로 오해하면 안된다.

 

2. continue

continue문도 break문과 같이 반복문 안에 삽입된다.

continue문이 실행되면, 위치에 관계없이 반복문의 조건검사 위치로 이동한다. 반복 조건이 여전히 '참'이라면

반복 영역을 다시 실행한다. continue문의 이후는 생략이 되고 처음부터 다시 실행을 하는 것이다. 예시를 들어보겠다.

#include<stdio.h>

int main() {
    int num = 0;
    
    for(num = 1; num<20; num++) {
        if(num % 2 == 0 || num % 3 == 0) continue;
        printf("%d ", num);
    }
    return 0;
}

/*출력
1 5 7 11 13 17 19
*/

num 을 2 또는 3으로 나눴을 때 0이 된다면 continue문이 실행되어 뒤에 있는 printf함수가 실행이 안되는 것을 알 수 있다.

switch문에 의한 선택적 실행

switch문은 if, else if, else와 유사한 측면이 있어 경우에 따라 대체를 할 수 있지만 사용할 수 있는 영역이 제한적이다.

#include<stdio.h>

int main() {
    int num = 0;
    printf("3이하의 정수 입력: ");
    scanf("%d", &num);
    
    switch(num) {
        case 1:
            printf("ONE\n");
            break;
        case 2:
            printf("TWO\n");
            break;
        case 3:
            printf("THREE\n");
            break;
        default:
            printf("3보다 큽니다.\n");
            break;
    }
    return 0;
}

3이하의 정수를 입력했을 때 그에 맞는 case문이 실행된다. 또한 조건이 어긋났다면 default문이 실행이 된다.

각 case마다 break문이 붙은 이유는 반복문을 탈출하듯이, switch문을 탈출하는 용도로 사용된다. breakl문이 없었다면 모든 case가 실행된다.

728x90

댓글