Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것.

2026. 4. 19. 20:08·지식 아카이브/C언어


  안녕하세요! 이번 글에서는 조건문인 if에 대해 배워보도록 하겠습니다. 조건문은 프로그램 실행 분기를 제어하는 중요한 문법입니다. 이제부터 본격적으로 코딩이 시작된다고 말할 수 있습니다.

 

∨ 조건문 if

  조건문은 조건을 검사하여, 그 결과에 따라 서로 다른 코드를 실행하도록 하는 문법입니다. C언어에서는 if 문을 사용하여 조건문을 작성할 수 있습니다. 프로그램은 코드의 위에서부터 아래로 순차적으로 실행됩니다. 이 위에서부터 아래로 향하는 흐름을 제어할 수 있는 것이 바로 조건문입니다. 아래 그림을 보도록 하겠습니다. 첫 번째 이미지는 조건문이 없을 때의 프로그램 실행의 흐름입니다.

 

  그리고 두 번째 그림은 조건문이 있을 때의 프로그램 실행 흐름입니다.

초록색 흐름과, 빨간색 흐름으로 나뉜다.

 

  이처럼 조건문은 프로그램 실행 흐름에 분기를 만들 수 있습니다. 분기를 만들 수 있다는 뜻은 프로그램이 다양하게 진행될 수 있다는 의미입니다. 게임에서 키보드를 누를 때 누른 키에 따라 게임이 다르게 진행되는 것처럼 말이죠. 코드에서 조건문은 다음과 같이 작성합니다.

if (조건식) {
    실행할 코드;
}

 

  조건식이 참일 경우 중괄호 {} 안에 있는 코드가 실행되고, 거짓(0)일 경우에는 실행되지 않습니다. 잠시 중요한 내용을 짚고 넘어가자면, C언어에서는 0은 거짓을 의미하고, 0 이외의 값은 참을 의미합니다. 따라서 조건식이 거짓이라면 0을 반환하고, 참이라면 0 이외의 값(주로 1)를 반환합니다.

 

  C언어에 대한 글 중 가장 초반 내용 중에 이런 것이 있습니다. "C언어는 대/소문자를 구분한다.", 즉 if문 같은 키워드 또한 대소문자를 철저히 지켜주어야 합니다. if문에서 "if" 대신 "IF"나 "If"와 같은 글자를 쓰는 것은 오류를 발생시킵니다.

 

  예를 들어, 어떤 값이 0보다 큰지 확인하는 코드는 다음과 같이 작성할 수 있습니다.

#include <stdio.h>

int main(void) {
    int x = 10;

    if (x > 0) {
        printf("양수입니다.");
    }
    return 0;
}

 

  위 코드에서는 x > 0이 참이므로 "양수입니다."가 출력됩니다. 

 

 if문의 조건식은 괄호를 이용하여 (조건식) 형태로 작성해야 합니다. 위의 예에서 (x > 0)처럼 작성하는 것이 일반적입니다. 그 후 조건식이 만족될 때 실행할 코드를 중괄호 { }로 감싸 작성합니다. 위의 예를 다시 보자면 if (x > 0) 다음에 오는 중괄호 내부에 printf("양수입니다."); 코드는 조건식이 만족될 때 실행될 코드입니다.

 

  꼭 함수 하나뿐만 아니라 여러가지 명령어와 코드를 사용할 수 있습니다. 아래 코드는 변수 x에 사용자가 값을 입력하고, 만약 입력한 값이 음수라면 x에 -1를 곱해 양수로 바꾼 후 printf 함수를 실행하는 if문으로 이루어져 있습니다. 이 코드를 실행해보겠습니다.

#include <stdio.h>

int main(void) {
    int x = 10;
    
    // x 값 입력
    printf("x의 값을 입력하세요 :");
	scanf("%d", &x);
    
    // 입력된 x값이 음수일 때,
    if (x < 0) {
    	x *= -1; // x의 값의 부호를 바꾼다.
        printf("x의 값을 양수로 바꾸었습니다.\n");
    }
    
    // x 값 출력
    printf("x의 값은 %d입니다.", x);
   
    return 0;
}

 

  변수 x에 -5를 대입했더니 x의 값을 양수로 바꾸었다고 출력됩니다. x의 값을 양수로 바꾸었다고 나온 printf 함수는 if 문 내부의 코드입니다. 만약 if문을 거치지 않는다면 "x의 값을 양수로 바꾸었습니다." 문자열은 출력되지 않을 것입니다. if문을 거치지 않을려면 조건식을 만족시켜주지 않으면 됩니다. 조건식이 (x < 0) 이므로 x에 양수를 입력해보겠습니다.

x의 값을 입력하세요 :-5
x의 값을 양수로 바꾸었습니다.
x의 값은 5입니다.

 

 이제 다시 프로그램을 실행해서 이번엔 x의 값에 5를 입력해보겠습니다.

x의 값을 입력하세요 :5
x의 값은 5입니다.

  x의 값을 양수로 바꾸었다는 출력이 나오지 않습니다. 그 이유는 x의 값이 양수이므로 조건식을 만족하지 않아 if문이 실행되지 않았기 때문입니다. if문의 작동법은 간단하죠?

 

  위의 예에서 "(x > 0)"이라고 표현한 것처럼 말이죠. 근데 여기서 괄호 안에 꼭 조건식을 써주지 않아도 됩니다. if문은 소괄호 () 내부의 값을 가지고 if문을 실행할 지 안할 지를 결정합니다. 아까 0은 거짓을 의미하고 0이외의 값은 참을 의미한다고 한 것을 기억하시나요? if문은 소괄호 () 내부의 값을 검사하고 0(거짓)이라면 if문을 실행하지 않고 0이외의 값(참)이라면 if문을 실행합니다. 이를 확인해보겠습니다.

#include <stdio.h>

int main(void) {
    if (0) {
        printf("if문을 거침\n");
    }
    printf("프로그램을 종료하겠습니다!");
    return 0;
}

 

  결과는 아래와 같습니다. 

프로그램을 종료하겠습니다!

 

  이제 if문의 소괄호 () 내부의 값을 0이외의 값(참)으로 바꾸어보겠습니다.

#include <stdio.h>

int main(void) {
    if (1) {
        printf("if문을 거침\n");
    }
    printf("프로그램 종료");
    return 0;
}

  결과는 아래와 같습니다.

if문을 거침
프로그램 종료

 

  즉, 이처럼 if문 소괄호 () 내부에 변수를 넣으면 변수의 값이 0 이외의 값일 때 if문이 실행됩니다.

#include <stdio.h>

int main(void) {
    int x = 0;
    
    if (x) {
        printf("if문을 거침\n");
    }
    printf("프로그램 종료");
    return 0;
}

  또는, 변수 x에 조건식의 결과값을 저장하여 if문 조건식에 변수 x를 사용할 수 있습니다.

#include <stdio.h>

int main(void) {
    int x = (5 >= 0);
    
    if (x) {
        printf("if문을 거침\n");
    }
    printf("프로그램 종료");
    return 0;
}

 

  if문을 사용할 때 중괄호 {}를 꼭 사용해야 하는 것은 아닙니다. 만약 실행할 if문의 코드가 한 줄이라면 다음과 같이 if문은 중괄호 {}를 사용하지 않아도 됩니다.

#include <stdio.h>

int main(void) {
    if(1)
        printf("if문을 거침\n");
 
    printf("프로그램 종료");
    return 0;
}

 

  하지만 중괄호를 쓰는 것을 권장합니다. 왜냐면 아래와 같은 실수를 저지를 수 있기 때문입니다. 아래의 예시에서 if문 내부의 코드는 if문 바로 아래 printf("if문을 거침\n"); 뿐입니다. 하지만 마치 그 다음 줄의 printf 함수도 if문 내부에 있는 것과 같이 착각할 수 있습니다. 이는 오류는 아니지만 의도대로 결과가 출력되지 않습니다. 

#include <stdio.h>

int main(void) {
    if(1)
        printf("if문을 거침\n");
        printf("if문을 또 거침??\n"); // 실수 포인트!!
 
    printf("프로그램 종료");
    return 0;
}

 

  이 코드가 잘못됨을 확인하기 위해 if문의 조건식 내부에 1을 0으로 바꾸어보겠습니다.

#include <stdio.h>

int main(void) {
    if(0)
        printf("if문을 거침\n");
        printf("if문을 또 거침??\n"); // 분명 if문 내부에 있는 것 같지만...
 
    printf("프로그램 종료");
    return 0;
}

 

  결과가 어떻게 되던가요? printf("if문을 또 거침??\n"); 함수는 if문 내부에 있는 것 같이 생겼기 때문에 if문이 실행되지 않는다면 이 함수도 실행되지 않아야 할 것처럼 보입니다. 그런데도 불구하고 이 함수는 실행이 되었습니다. 애시당초 if문에 포함이 되지 않았기 때문이죠. 그래서 이런 실수를 방지하기 위해 if문 내부의 코드가 한 줄이라도 중괄호 {}로 감싸는 것을 권장합니다.

 

  또 다른 실수 포인트를 짚어 드리겠습니다. if문과 세미콜론 ;의 사용에서 주로 실수가 발생합니다. 아래에서 어떤 실수가 발생했는지 찾아 보시길 바랍니다.

#include <stdio.h>

int main(void) {

    if (0); {
        printf("if문을 거침\n");
        printf("if문을 또 거침??\n");
    }
 
    printf("프로그램 종료");
    return 0;
}

  정답은 if (0); 이 부분입니다. if (조건식) 뒤에 세미콜론을 붙이면, if문은 아무것도 하지 않는 문장이 되어버립니다. 즉, 조건식의 결과와 상관없이 바로 끝나게 됩니다. 따라서 if문의 조건식 뒤에는 세미콜론을 붙이지 않습니다.

 

∨ else

  else문은 if문이 실행되지 않았을 때 실행할 코드입니다. 아래와 같은 프로그램 실행 분기를 만들어 낼 수 있습니다.

 

초록색 흐름과 빨간색 흐름으로 나뉜다.

 

아래의 예를 보겠습니다. 여기서 해당 조건식은 짝수인 지 홀수인 지 확인하는 조건식으로 매우 자주 쓰이니 알아두시는 것이 좋습니다. 짝수라면 2로 나누었을 때 나머지가 0이 나오고 홀수라면 나머지가 1이 나오는 것을 이용한 조건식입니다. 

#include <stdio.h>

int main(void) {
    int x = 12;

    if (x % 2 == 0) { // x가 짝수인지 확인하는 조건식
        printf("x는 짝수입니다.");
    }

    return 0;
}

 

  이때 x가 홀수일 때 "x는 홀수입니다."을 출력하게끔 할려면 어떻게 할까요? 이때 else를 사용합니다. 아래의 코드를 실행해보면서 감을 잡아보겠습니다.

#include <stdio.h>

int main(void) {
    int x = 12;

	// x가 짝수인지 확인하는 조건식
    if (x % 2 == 0)  
        printf("x는 짝수입니다.");
    else 
        printf("x는 홀수입니다.");

    return 0;
}

  x가 짝수일 때는 if문의 조건식을 만족하므로 if문 내부의 코드를 실행하게 됩니다. 그래서 "x는 짝수입니다."가 출력됩니다. 반대로 x가 홀수일 때는 if문의 조건식을 만족하지 않고 if문 내부의 코드를 건너뛰게 됩니다. 대신 else문 내부의 코드를 실행하게 됩니다. 그래서 "x는 홀수입니다."가 출력됩니다. 

 

  else문 또한 if문처럼 else문 내부의 코드가 한 줄일 때 중괄호 {}를 써주지 않아도 됩니다.

#include <stdio.h>

int main(void) {
    int x = 12;

    // x가 짝수인지 확인하는 조건식
    if (x % 2 == 0)
        printf("x는 짝수입니다.");
    else
        printf("x는 홀수입니다.");

    return 0;
}

  하지만 if문에서와 마찬가지로 실수를 저지를 수 있는 것은 마찬가지이므로 중괄호 {}를 사용하는 것을 권장합니다.

 

  else문은 else (x%2 == 1)처럼 조건식을 따로 붙이지 않습니다. 또한 else문은 if문 하나당 else문 하나만 사용할 수 있습니다. 즉 아래와 같은 코드는 허용되지 않는다는 뜻입니다.

#include <stdio.h>

int main(void) {
    int x = 12;

    if (x < 5) {
        printf("x는 5보다 작다.");
    }
    else {
        printf("x는 5보다 크다.");
    }
    else {
        printf("오류 발생!");
    }

    return 0;
}

 

  그렇다면 아래 그림과 같은 3개 이상의 프로그램 실행 분기를 만들려면 어떻게 해야할까요? else if문을 사용합니다.

 

∨ else if

  else if문은 if문 뒤에 오는 추가 조건문으로, 앞의 조건이 거짓일 때 새로운 조건을 검사하는 역할을 합니다. 여러 개의 조건을 순서대로 검사하여, 처음으로 참이 되는 조건의 코드 블록만 실행됩니다. 

#include <stdio.h>

int main(void) {
    int x = 8;

    if (x < 5) {
        printf("x는 5보다 작다.");
    }
    else if (x < 10)  {
        printf("x는 5보다 크고 10보다 작다.");
    }
    else {
        printf("x는 10보다 크다");
    }

    return 0;
}

 

  x의 값이 8인데, 처음 if문의 조건식은 실행되지 않습니다. x의 값이 5보다 작지 않기 때문입니다. 그 다음 else if문의 조건식을 확인합니다. x의 값이 8로 10보다 작으므로 else if문 내부의 코드가 실행됩니다. 

 

  else if문은 한꺼번에 여러 개를 사용할 수 있습니다. 개수 제한은 없습니다.

#include <stdio.h>

int main(void) {
    int x = 17;

    if (x < 5) {
        printf("x는 5보다 작다.");
    }
    else if (x < 10) {
        printf("x는 5보다 크고 10보다 작다.");
    }
    else if (x < 20) {
        printf("x는 10보다 크고 20보다 작다.");
    }
    else if (x < 40) {
        printf("x는 20보다 크고 40보다 작다.");
    }
    else {
        printf("x는 40보다 크다.");
    }

    return 0;
}

  여기서 프로그램은 if문부터 조건식을 확인하여 조건식을 만족하지만 다음 else if문의 조건식을 확인하고, 그렇게 계속 만족하는 조건식을 확인하다가 결국 없으면 else문을 실행하게 됩니다. 여기서 x의 값은 17이므로 처음에는 if문부터 조건식을 확인하다가 else if (x < 20)의 조건식을 만족하므로 "x는 10보다 크도 20보다 작다" 코드를 실행하게 됩니다.

  

  이처럼 작동 방식은 간단합니다. if문부터 조건식을 확인하여 조건식을 만족하면 조건문을 실행하고, 조건식이 거짓이라면 다음 조건문인 else if문의 조건식을 확인하고, 계속 거짓이라면 결과적으로 else문을 실행합니다.

 

 여기서 중요한 3가지가 있습니다. 첫 번째는 else if와 else를 사용하려면 if가 우선 있어야 합니다. 아래 코드는 if가 없으므로 코드에 오류가 발생합니다.

#include <stdio.h>

int main(void) {
    int x = 17;

    else if (x < 10) {
        printf("x는 5보다 크고 10보다 작다.");
    }
    else if (x < 20) {
        printf("x는 10보다 크고 20보다 작다.");
    }
    else {
        printf("x는 20보다 크다.");
    }

    return 0;
}

 

  두 번째는 if - else if - else 순서를 지켜 주어야 합니다. 아래와 같이 순서를 지키지 않으면 오류가 발생합니다.

#include <stdio.h>

int main(void) {
    int x = 17;

    else {
        printf("x는 20보다 크다.");
    }
    else if (x < 10) {
        printf("x는 5보다 크고 10보다 작다.");
    }
    if (x < 20) {
        printf("x는 10보다 크고 20보다 작다.");
    }

    return 0;
}

 

  마지막 세번째로, else는 없어도 된다는 것입니다. 아래처럼 else를 제외하고 코드를 재구성해도 아무런 문제가 없습니다. 

#include <stdio.h>

int main(void) {
    int x = 17;

    if (x < 5) {
        printf("x는 5보다 작다.");
    }
    else if (x < 10) {
        printf("x는 5보다 크고 10보다 작다.");
    }
    else if (x < 20) {
        printf("x는 10보다 크고 20보다 작다.");
    }

    return 0;
}

 

  즉, if문에서 가능한 조합은 다음과 같습니다.

  • if
  • if - else
  • if - else if
  • if - else if - else

  여기서 제일 중요한 것은 어떤 조합이든간에, 각 조건문 중 딱 하나만이 실행된다는 것입니다. 예를 들어 if - else if - else 문의 경우, if문만 실행되거나, else if문만 실행되거나 else문만 실행된다는 의미입니다. 코드를 짤 때는 이 점을 유의해야 합니다.

 

 

∨ 블럭식 사고

  코드 블록이라는 개념은 아마 if문에서 처음으로 본격적으로 접하게 될 것입니다. 코드 블록이란 여러 개의 코드를 하나의 묶음으로 만든 것을 의미합니다. 보통 중괄호 { }를 사용하여 표현합니다. if문에서 if문 내부의 코드를 중괄호로 감싼 것도 코드 블럭입니다.

 

  코드 블럭은 주로 if, for, while 등 특정 역할을 하는 코드 묶음이기도 합니다. 아래의 코드를 보면 if문과 else if문의 조건식은 문자형 변수 c_value의 입력값이 소문자인지 대문자인지 확인합니다.

/*입력받은 문자가 소문자인지, 대문자인지, 그 외인지 확인하는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    char c_value;

    printf("문자 입력:");
    scanf("%c", &c_value);

    // 변수 c_value가 소문자라면
    if ('a' <= c_value && c_value <= 'z') {
        printf("%c는 소문자", c_value);
    }
    // 변수 c_value가 대문자라면
    else if ('A' < c_value && c_value < 'Z') {
        printf("%c는 대문자", c_value);
    }
    // 변수 c_value가 소문자도, 대문자도 아니라면
    else {
        printf("%c는 알파벳이 아닙니다.", c_value);
    }

    return 0;
}

실행 결과는 아래와 같습니다.

문자 입력:@
@는 알파벳이 아닙니다.

 

  이 프로그램의 실행 흐름을 이처럼 위에서부터 아래까지의 흐름으로 나타낼 수도 있습니다. 순서도와 유사하지만 중요한 것은 if문, else if문, else문은 코드 블럭이므로 이것을 하나의 블럭으로 보는 것입니다. 이는 뒤에서 설명할 for문과 while문을 사용하는데 매우 자주 사용할 예정입니다.

 

  여기서 if - else if - else 가 프로그램 상에서 어떻게 작동하는지 알 수 있습니다. 각각의 블럭은 옆으로 나열되는데 실행 흐름은 위에서부터 아래로 가면서 같은 층에서 하나의 블럭만 거칠 수 있습니다. 따라서 if - else if - else 중 하나의 블럭만 거치게 됩니다.

 

∨ if - if

  조건문 단원에서 제일 중요한 것은 조건문을 어떻게 구성하느냐라는 것입니다. 지금까지 if, if-else, if-else if, if-else if-else에 대해 배웠습니다. 이제 다른 구조에 대해서도 배워보겠습니다. if문을 나열하는 형식은 언제 쓰이는 지 알아보겠습니다.

 

  if문을 나열하면 각각의 if문은 서로 독립적입니다. 독립적이라는 것은 기존의 if - else if - else문끼리는 딱 하나의 조건문만이 실행되는 것에 비해, 각각의 if문은 서로의 실행 여부가 영향을 끼치지 않습니다. 처음 if문이 실행되었다고 해서 다음 if문이 실행될 수 없는 것은 아니죠. 글로 보려니 지겨우던 참입니다. "블럭식 사고"와 코드를 통해 설명드리겠습니다.

/*값을 입력받아 3의 배수인지 5의 배수인지 확인하는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int num;

    printf("값 입력:");
    scanf("%d", &num);
    
    // 변수 num이 3의 배수일 때 조건식을 만족함.
    if (num % 3 == 0) {
        printf("%d는 3의 배수이다.\n", num);
    }

    // 변수 num이 5의 배수일 때 조건식을 만족함.
    if (num % 5 == 0) {
        printf("%d는 5의 배수이다.\n", num);
    }

    return 0;
}

 

  참고로 if-if문은 if-if문이라는 문법이 따로 존재하는게 아니라 그냥 if문을 연달아 쓴 것뿐입니다. 또한, if문의 조건식인 num % 3 == 0은 3으로 나누었을 때 나머지가 0인지 확인하는 조건식입니다. 만약 num이 3의 배수라면 이 조건식을 만족합니다. 위 코드는 변수 num이 3의 배수인지 확인하는 if 조건문과 5의 배수인지 확인하는 if 조건문으로 이루어져 있습니다. 이제 실행해봅시다. 첫 번째는 3의 배수인 9를 입력해보겠습니다.

값 입력:9
9는 3의 배수이다.

 

  이제 15를 입력해봅시다. 15는 3의 배수면서 동시에 5의 배수입니다.

값 입력:15
15는 3의 배수이다.
15는 5의 배수이다.

 

변수 num에 9를 입력했을 때와 15를 입력했을 때의 프로그램 실행 흐름을 블럭식 사고로 나타내보겠습니다.

 

  여기서 퀴즈를 하나 내보겠습니다.

if(3의 배수), if(5의 배수) 형태의 기존 코드를

if(3의 배수), else if(5의 배수) 형태의 코드로 바꾼다면 어떻게 될까요? 코드로 먼저 확인해보겠습니다.

/*값을 입력받아 3의 배수인지 5의 배수인지 확인하는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int num;

    printf("값 입력:");
    scanf("%d", &num);
    
    // 변수 num이 3의 배수일 때 조건식을 만족함.
    if (num % 3 == 0) {
        printf("%d는 3의 배수이다.\n", num);
    }

    // 변수 num이 5의 배수일 때 조건식을 만족함. <- if를 else if로 바꾸었다!
    else if (num % 5 == 0) {
        printf("%d는 5의 배수이다.\n", num);
    }

    return 0;
}

  9를 입력했을 땐 정상적으로 작동하는 것 같습니다.

값 입력:9
9는 3의 배수이다.

하지만, 15를 입력해본다면..

값 입력:15
15는 3의 배수이다.

  이상한 일이 발생합니다. 분명 15는 3의 배수는 맞지만 5의 배수이기도 하기 때문에 "15는 5의 배수이다"도 출력이 되어야 하거든요. 이는 처음의 if(3의 배수)문이 실행되면서 뒤의 else if문은 실행되지 못했기 때문입니다. 즉, 이 if와 else if문은 서로 독립적이지 않기 때문에 발생한 일이라는 것이죠. 블럭식 사고를 통해 그림을 그려 확인해보겠습니다.

  9를 입력했을 때는 코드에서 실행한 것과 같이 정상적으로 작동합니다. 하지만 어딘가 아슬아슬하죠, 왜냐하면 3의 배수인 경우와 동시에 5의 배수인 경우도 있는데 이 그림에서는 3의 배수 조건문과 5의 배수 조건문이 if - else if로 이어져 둘 중 하나만 실행될 수 있기 때문입니다. 15를 입력했을 때는 결국 우려하던 일이 발생합니다. 15는 3의 배수이고 5의 배수이기도 한데, 5의 배수 조건문은 실행되지 못합니다. 

 

  즉, 우리가 이를 통해 알 수 있는 것은 상황에 맞게 조건문을 작성해야 한다는 것입니다. 이 외에도 조건문을 작성하는 여러 방법이 있습니다. 마지막 경우까지 보고 이 글을 마치겠습니다.

 

∨ 다중 조건문

  다중 조건문은 조건문이 중첩된 상태를 의미합니다. 즉, 아래와 같은 코드를 의미하죠.

/*절댓값을 확인하는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int num;

	printf("값 입력 :");
	scanf("%d", &num);

	if (num > 0) { //num이 양수일 때,
		if (num >= 10) {
			printf("%d의 절댓값은 10보다 크다.", num);
		}
		else {
			printf("%d의 절댓값은 10보다 작다.", num);
		}
	}
	
	return 0;
}

 

  여기서 if문 내부에 if문이 또 존재합니다. 가장 밖의 if문은 우선 num 값이 양수인지 확인한 후, 내부에서 num 값의 절댓값을 확인하는 조건문으로 이루어져 있습니다. 이번에도 그림을 그려 확인해보겠습니다. 이 경우 이전처럼 if문을 블럭으로 표현하고 블럭 내부에 블럭을 또 그려주면 됩니다. -3, 9, 12 입력에 대한 각각의 프로그램 실행 흐름입니다. 

  만약 가장 바깥 if문을 통과하지 못했다면 내부 if문도 실행되지 않고 넘어가게 됩니다. 바깥 if문이 실행될 때는 내부 if문도 조건식을 확인하여 만족하면 실행됩니다. 여기에 num값이 음수인 경우도 생각해보겠습니다.

/*절댓값을 확인하는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int num;

	printf("값 입력 :");
	scanf("%d", &num);

	if (num > 0) { //num이 양수일 때,
		if (num >= 10) {
			printf("%d의 절댓값은 10보다 크다.", num);
		}
		else {
			printf("%d의 절댓값은 10보다 작다.", num);
		}
	}
	else { // num이 음수일 때
		if (num <= -10) {
			printf("%d의 절댓값은 10보다 크다.", num);
		}
		else {
			printf("%d의 절댓값은 10보다 작다.", num);
		}
	}
	
	return 0;
}

  이처럼 바깥 조건문에 else문까지 추가하면 num이 우선 양수인지 음수인지 확인한 후 내부 조건문을 통해 절댓값을 확인합니다. 이 또한 그림으로 표현하자면 다음과 같이 표현될 수 있습니다. 다음 그림은 입력이 -7일 때를 나타낸 것입니다.

 

다중 조건문은 조건식을 잘 다루어 다음과 같이 if문을 줄일 수 있습니다.

/*절댓값을 확인하는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int num;

	printf("값 입력 :");
	scanf("%d", &num);

	if (num < -10 || num > 10) { // num이 -10보다 작거나 10보다 클 때,
		printf("%d의 절댓값은 10보다 크다", num);
	}
	else { // num이 -10보다 크고 10보다 작을 때,
		printf("%d의 절댓값은 10보다 작다.", num);
	}
	
	return 0;
}

 

  위 두 방식은 모두 틀리지 않았습니다. 다만 오류가 발생하지 않고 어떻게 해야 가독성이 뛰어난 지 훈련하기 위해서 여러번 코드를 작성해보는 것을 추천합니다. 아래 링크를 눌러 관련 연습을 진행해보세요.

<수정>

 

∨ 효율적인 if문

  &&(그리고)와 ||(또는)은 조건식에서 매우 용이하게 쓰입니다. 이때 효율적인 if문을 작성하려면 &&, || 그리고 if - else if - else 등의 특징을 잘 알아야 합니다. 

 

  우선 &&(그리고)와 ||(또는)의 특징에 대해 설명드리겠습니다. 첫 번째로 &&(그리고)는 앞의 값이 거짓이면 뒤의 것은 보지도 않고 거짓을 반환합니다. 예를 들면 다음과 같은 것이죠.

 

  (5 < 2) && (100 > 120)

 

  이 조건식을 계산할 때 앞의 조건식인 (5 < 2)가 0(거짓)이므로 뒤의 조건식이 참이든 거짓이든 &&(그리고) 연산의 결과는 0(거짓)이 반환되므로 뒤의 조건식의 결과는 중요하지 않습니다. 실제로 컴퓨터는 이처럼 && 연산 시 앞의 조건식이 0(거짓)일 때는 뒤의 조건식을 계산하지도 않고 넘어갑니다. 이를 한 번 확인해봅시다.

 

  정수형 변수 x를 선언하고 100을 대입합니다. 그 후 && 연산을 수행합니다. 이때 &&의 첫 번째 조건식인 5 > 10은 거짓이므로 두 번째 조건식 ++x > 0 은 검사하지도 않을 것입니다. 두 번째 조건식이 계산되는지 안되는지를 확인하기 위해 두 번째 조건식에 ++x를 작성하였습니다. 만약 두 번째 조건식이 계산된다면 ++ 연산자에 의해 x는 1이 증가하여 101이 될 것입니다. 두 번째 조건식이 계산되지 않았다면 x는 증가하지 않아 100이 될 것입니다. 자 그럼 실행해봅시다.

#include <stdio.h>

int main(void) {
    int x = 100;

    // 만약 뒤의 조건식을 계산한다면 ++ 연산자에 의해 x는 101이 될 것이다. 
    (5 > 10) && (++x > 0);

    printf("x의 값은 ? %d", x);

    return 0;
}

 

  결과값은 다음과 같습니다.

x의 값은 ? 100

 

  x값이 증가하지 않았습니다. 두 번째 조건식은 보지도 않았다는 것입니다. 앞의 조건식을 참으로 바꿔본다면 컴퓨터는 뒤의 조건식도 검사할 것입니다. 이를 확인해봅시다. 첫 번째 조건식을 참이 되도록 바꾸었습니다.

#include <stdio.h>

int main(void) {
    int x = 100;

    // 만약 뒤의 조건식을 계산한다면 ++ 연산자에 의해 x는 101이 될 것이다. 
    (10 > 0) && (++x > 0);

    printf("x의 값은 ? %d", x);

    return 0;
}

 

  결과는 다음과 같습니다. 이 경우는 두 번째 조건식도 계산되므로 x의 값이 1 증가하여 101이 출력됩니다.

x의 값은 ? 101

 

  ||(또는)의 경우에도, 컴퓨터는 앞의 조건식이 0이외의 값(참)이라면 뒤의 조건식은 보지도 않습니다. &&을 가지고 실험을 해보았기 때문에 또 실험해보지는 않겠습니다.

 

  이를 if문에서 매우 유용하게 활용할 수 있습니다. 예를 들어, 계산에 시간이 오래 걸리거나 복잡한 조건식이 있다면, 이를 뒤쪽에 배치하는 것이 효율적입니다.

if (x != 0 && (100 / x) > 1) {
    printf("조건 만족\n");
}

  위 코드에서 x != 0이 먼저 검사됩니다. 만약 x가 0이라면 뒤의 (100 / x)는 계산되지 않습니다. 따라서 0으로 나누는 오류도 방지할 수 있고, 불필요한 연산도 줄일 수 있습니다.

 

  이처럼 && 연산자는 앞의 조건이 거짓이면 뒤를 검사하지 않는 특징이 있기 때문에, 간단하고 빠르게 판단할 수 있는 조건을 앞에 배치하고, 복잡하거나 비용이 큰 연산은 뒤에 배치하는 것이 효율적입니다.

 

  마찬가지로 || 연산자는 앞의 조건이 참이면 뒤를 검사하지 않기 때문에, 참이 될 가능성이 높은 조건을 앞에 두는 것이 효율적입니다.

 

  이러한 특징은 하나의 조건식 내부뿐만 아니라 if - else if - else 구조에서도 동일하게 적용됩니다. 다음의 코드를 예로 들 수 있습니다. 다음의 조건식은 x의 값이 양수인지 음수인지 0인지 확인하는 코드입니다.

if (x == 0) {
	printf("x는 0");
}
else if (x > 0) {
	printf("x는 양수");
}
else {
	printf("x는 음수");
}

  “논리적으로는” 잘못되지 않았지만 조건의 순서도 매우 중요한 요소입니다. 특히 어떤 조건이 더 자주 발생하는지를 고려해야 합니다. 임의의 값이 양수이거나 음수인 경우가 0인 경우가 일반적으로 더 많습니다. 즉, 더 많은 경우를 필터링할 수 있는 조건식을 우선적으로 배치해야 합니다.

 

  여기서 x의 값으로 -5, 2, 1, 0, 14를 순서대로 대입하고 코드를 실행한다고 가정하면, 대부분의 경우는 양수 또는 음수에 해당하고, 0인 경우는 한 번만 발생합니다. 즉, 위 코드는 비효율적입니다. 왜냐하면 불필요하게 더 많은 조건식을 계산하기 때문입니다. 실제로 각 경우에서 조건식이 몇 번 계산되는지 살펴보면 다음과 같습니다. x의 값을 -5, 2, 1, 0, 14를 순서대로 대입하고 코드를 실행했을 때,

  • x = -5일 때, (x == 0) 조건식과 (x > 0) 조건식. 조건식을 총 2번 계산한다.
  • x = 2일 때, (x == 0) 조건식과 (x > 0) 조건식. 조건식을 총 2번 계산한다.
  • x = 1일 때, (x == 0) 조건식과 (x > 0) 조건식, 조건식을 총 2번 계산한다.
  • x = 0일 때, (x == 0) 조건식. 조건식을 총 1번 계산한다. 
  • x = 14일 때, (x == 0) 조건식과 (x > 0) 조건식. 조건식을 총 2번 계산한다.

  따라서 이 코드의 경우, 각 x 값의 경우에서 조건식 연산 횟수의 합은 9번입니다.

 

  효율적으로 코드를 수정해보겠습니다. 앞 쪽에서 최대한 많이 필터링될 수 있도록 조건식 순서를 바꾸면 됩니다. 일반적으로 임의의 숫자가 0인 경우보다는 양수거나 음수일 경우가 더 많을 것이므로 양수와 음수 조건식을 앞 쪽에 배치하면 됩니다. 

if (x > 0) {
	printf("x는 양수");
}
else if (x < 0) {
	printf("x는 음수");
}
else {
	printf("x는 0");
}

 

  이때도 x의 값으로 -5, 2, 1, 0, 14를 순서대로 대입하고 코드를 실행한다고 가정하면, 조건식을 몇 번 계산해야 하는 지 확인해보겠습니다.

  • x = -5일 때, (x > 0) 조건식과 (x < 0) 조건식. 조건식을 총 2번 계산한다.
  • x = 2일 때, (x > 0) 조건식. 조건식을 총 1번 계산한다.
  • x = 1일 때, (x > 0) 조건식. 조건식을 총 1번 계산한다.
  • x = 0일 때, (x > 0) 조건식과 (x < 0). 조건식을 총 2번 계산한다. 
  • x = 14일 때, (x > 0) 조건식. 조건식을 총 1번 계산한다.

   이 코드의 경우, 각 x값의 경우에서 연산해야 하는 조건식 연산 횟수의 합은 7번입니다. 비록 연산 횟수의 합이 9와 7로 2 차이긴 합니다. 하지만 미묘한 차이여도 데이터 개수가 많아지거나 논리 구조가 복잡해지면 상당히 비효율적인 코드가 됩니다.

 

∨ 연습

 

∨ 정리

 

'지식 아카이브 > C언어' 카테고리의 다른 글

Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지  (0) 2026.04.19
Chapter 8.5. C언어 : 비트 연산자 부연 설명. 하드웨어적 연산 비트 연산!  (0) 2026.04.19
Chapter 8. C언어 : 연산자, 사칙 연산부터 비교 연산까지!  (0) 2026.04.19
Chapter6. C언어 : 변수의 자료형, unsigned vs signed  (0) 2026.04.15
Chapter5. C언어 : 변수의 선언, 대입, 초기화, 참조.  (0) 2026.04.15
'지식 아카이브/C언어' 카테고리의 다른 글
  • Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지
  • Chapter 8.5. C언어 : 비트 연산자 부연 설명. 하드웨어적 연산 비트 연산!
  • Chapter 8. C언어 : 연산자, 사칙 연산부터 비교 연산까지!
  • Chapter6. C언어 : 변수의 자료형, unsigned vs signed
검정부기
검정부기
안녕하세여. 한성대학교 AI응용학과에 재학중인 대학생입니다!! 공부 내용 개인적으로 정리하고, 도움이 될만한 내용은 공유하기 위해 개인적으로 만든 블로그입니다. 댓글 아무거나 쓰셔도 상관없습니다. 무엇이든 질문하셔도 됩니다, 틀린 질문도 괜찮습니다, 성실히 답변해드리겠습니다!
  • 검정부기
    검정부기
    검정부기
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • 강의 아카이브 (11)
        • Python for AI (1)
        • 선형대수 (2)
        • 컴퓨터 프로그래밍 (4)
        • 웹프로그래밍기초 (2)
        • 확률 및 통계 (2)
        • 사회데이터의 이해 (0)
        • 생활 속의 인공지능 (0)
        • 생활 속의 빅데이터 (0)
      • 지식 아카이브 (12)
        • 파이썬 (1)
        • C언어 (11)
        • 웹프로그래밍 (0)
        • 확률 통계 (0)
        • 선형대수 (0)
        • git & github (0)
        • 리눅스 (0)
        • 컴퓨터 구조 (0)
        • 운영체제 (0)
        • 네트워크 (0)
      • Daily 아카이브 (29)
        • 공부일지 (22)
        • IT 에세이 (0)
        • 프로젝트 (1)
        • 아무거나 쓰는 곳 (4)
        • 연습 일지 (0)
        • 일기 (2)
      • 알쓸 아카이브 (2)
        • 군대 (IT) (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 블로그 사용법
    • 안녕하세용. 반갑습니다.
  • 인기 글

  • 태그

    서류심사
    육군
    파이썬
    정보보호병
    시험대비
    ai학과
    수업정보
    강의
    ai
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
검정부기
Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것.
상단으로

티스토리툴바