본문 바로가기

C언어 강좌

[C언어_05] 다양한 조건문 (if, if...else, if...else if...else, switch)

 

안녕하세요, 이번 포스팅에서는 다양한 조건문에 대해서 알아보는 시간을 갖도록 하겠습니다.

조건문도 여러가지 구조가 존재하는데요, 어떤 상황에서 어떤 구조의 조건문을 사용해야 하는지도 예시를 통해 보여드리겠습니다. 그럼 바로 시작해보도록 하죠!


 

| 지난 강좌 Review

지난 강좌 보기:   2020/10/09 - [C언어 강좌] - [C언어_04] C언어의 다양한 연산자 & 참, 거짓

 

[C언어_04] C언어의 다양한 연산자 & 참, 거짓

안녕하세요, 이번 포스팅에서는 C언어의 다양한 연산자를 알아보는 시간을 가져보도록 하겠습니다. 수학의 연산자가 수학적 연산을 위한 약속된 기호인 것처럼, C언어의 연산자도 C언어에서 제�

swdoodle.tistory.com

 

지난 강좌에서는 '연산자'에 대한 내용을 중점적으로 다루었는데요,

산술 연산자, 복합대입 연산자, 관계 연산자, 논리 연산자, 증감 연산자에 대한 내용이 바로 그것입니다.

이중에서도 오늘 배울 내용과 가장 관련이 깊은 것은 단연 "논리 연산자", "관계 연산자" 와 같은 참/거짓(True/False)을 반환하는 연산자입니다.

 

 

if문: 가장 기본적인 조건문

if( /* True or False */ ) { . . . }

조건문은 프로그래머가 걸어놓은 조건에 따라 실행 흐름이 달라지도록 하는 구문을 말합니다.

if 라는 영어 단어의 뜻도 그렇듯이 직관적으로 주는 의미가 크기 때문에 아래 코드를 보시면 쉽게 이해가 될 것입니다.

 

#include<stdio.h>

void main()
{
    int num;
    scanf("%d", &num);
    
    if(num > 0){
    	printf("num is positive\n");
    }
}
입력: 5
실행결과:
num is positive

입력: 0
실행결과:

실행 결과를 보면 알 수 있듯이, num 변수에 양수값인 5를 입력했을 때와는 다르게,

0을 입력했더니 아무것도 출력되지 않았습니다.

 

이처럼 if문은 괄호 안의 논리값이 1(참) 이라면 중괄호 영역의 명령들을 실행하고,

0(거짓) 이라면 건너 뛰도록 하는 제어문입니다.

 

하지만 조건문을 처음 접하실 때 주의할 점은,

괄호 안에 0과 1만 들어갈 수 있는건 아니라는 것입니다.

이것은 '참'과 '거짓'이 오직 1과 0에만 대응된다고 착각할 때 발생하는 문제입니다.

 

'거짓'은 0에만 대응되는 것이 맞지만, C언어에서는 0이 아닌 모든 수를 참으로 인식합니다.

따라서 괄호 안의 결과값이 1이든 2이든 3이든 4이든 모두 '참'에 대응되기 때문에,

모두 중괄호 내부의 명령을 실행하는 같은 결과를 낳습니다.

 

| if ... else 구조의 조건문

조건을 만족하는 경우가 있다면 그렇지 않은 경우도 분명히 존재할 것입니다.

이를 처리해 주는것이 바로 else의 역할입니다.

if( /*True or False*/ ){
    /*commands*/
}
else{
    /*commands*/
}

else에는 어떠한 조건이 필요하지 않습니다.

그저 자신과 연결된 조건문의 조건이 충족되지 않았을 때 실행될 뿐입니다.

예시 코드를 보며 따라가 봅시다.

 

#include<stdio.h>

void main()
{
    int num;
    scanf("%d", &num);
    
    if(num%2 == 0)
    	printf("%d is even\n", num);
    else
    	printf("%d is odd\n", num);
}

 

입력: 8
실행결과:
8 is even

입력: 9
실행결과:
9 is odd

위의 예시 코드는 짝수와 홀수를 판별하는 프로그램입니다.

num을 2로 나누었을 때, 그 나머지가 0이라면 (즉 짝수라면) "num is even"을 출력하고,

그렇지 않다면 "num is odd"라고 출력하게 되는 것이죠.

2로 나눈 나머지는 0과 1 둘 중 하나이므로 짝수가 아니라는 것은 홀수를 의미한다는 뜻이 됩니다.

 

하지만 그렇지 않은 경우는 어떻게 처리하면 좋을까요?

짝수와 홀수의 경우에는 경우의 수가 두 가지이므로 이거 아니면 저거, 이렇게 나타낼 수 있지만

다음과 같은 예시는 단순하게 이분법적으로는 나타낼 수 없을 것입니다.

사용자가 입력한 score값이
90이상이라면 A,
80이상 90미만이라면 B,
70이상 80미만미라면 C,
60이상 70미만이라면 D,
60미만이라면 F
를 출력하시오.

이는 사용자가 입력한 값으로 인해 처리될 수 있는 경우의 수가 5가지가 되어,

자연스럽게 새로운 논리적 구조가 필요하게 됩니다.

 

| if ... else if ... else 구조의 조건문

위에서 제시한 문제를 새로운 구조의 조건문으로 처리해 보겠습니다.

#include<stdio.h>

void main()
{
    int score;
    scanf("%d", &score);
    
    if(score >= 90)
        printf("A\n");
    else if(score >= 80)
        printf("B\n");
    else if(score >= 70)
        printf("C\n");
    else if(score >= 60)
        printf("D\n");
    else
        printf("F\n");
}
입력: 92
실행결과: A

입력: 86
실행결과: B

입력: 64
실행결과: D

입력: 48
실행결과: F

 

앞서 살펴본 if ... else 구문은 if의 조건이 충족되지 않았을 경우 else를 실행하지만,

if ... else if ... else 구문은 if의 조건이 충족되지 않았을 경우, 바로 다음에 오는 else if의 조건을 검사합니다.

그 조건도 충족되지 않았을 경우 다음 else if의 조건을 검사합니다.

그렇게 모든 else if의 조건이 모두 충족되지 않았다면, 마지막에 있는 else영역의 명령들이 실행됩니다.

 

한편 조건을 검사하는 와중에 어떤 하나의 조건이 충족되어 해당 영역의 명령을 실행한다면,

이후에 나오는 조건들은 모두 무시하고 넘어갑니다.

위의 예시에서도 86을 입력했을 때 그 뒤의 조건들을 무시하고 넘어갔기 때문에 'B'라는 값만 출력될 수 있었던 것이고,

만약 뒤의 조건까지 모두 검사했다면 B, C, D, F가 모두 출력됐을 것입니다.

 

| switch문

switch(value){
case value1:
    //commands
    break;
case value2:
    //commands
    break;
case value3:
    //commands
    break;
default:
    //commands
}

switch문도 프로그램의 실행 흐름을 제어하는 조건문입니다.

하지만 괄호 안에 들어가는 것이 참/거짓이 아니라 어떠한 값(value)이 들어간다는 점에서 앞서 살펴본 것과는 다릅니다.

 

만약 value값이 value1과 동일하다면 해당 영역의 명령들을 실행하고,

value값이 value2와 동일하다면 해당 영역의 명령들을 실행합니다.

만약 value와 일치하는 case가 단 하나도 존재하지 않는다면 default영역의 명령들을 실행합니다.

 

따라서 이 조건문은 말 그대로 case를 나누어 처리하고 싶을 때 사용합니다.

또한 같은 내용을 else if로 구현하는 것 보다 가독성이 좋아진다는 장점이 있습니다.

프로그래밍 언어도 결국 '언어'이기 때문에, 같은 로직을 짜더라도 내가 작성한 코드를 남이 읽었을 때 내용이 한 눈에 들어오고 의도가 명확하게 드러나는 코드가 더 좋은 코드가 되기 때문입니다.

 

#include<stdio.h>

void main()
{
    char level;
    
    scanf("%c", &level);
    
    switch(level){
    case 'a':
        printf("You selected high level English.\n");
        break;
    case 'b':
        printf("You selected medium level English.\n");
        break;
    case 'c':
        printf("You selected low level English.\n");
        break;
    default:
        printf("You typed wrong input!\n");
    }
}
입력: a
실행결과: You selected high level English.

입력: b
실행결과: You selected medium level English.

입력: d
실행결과: You type wrong input!

영어 학원에서 자신이 수강할 레벨을 선택한다고 가정한 예시 코드입니다.

확실히 정돈된 듯한 느낌이 드는 것을 확인할 수 있습니다.

 

break문은 나중에 반복문 파트에서 자세히 다루겠지만,

여기서 break의 역할은 switch문을 빠져나가는 것입니다.

 

만약 위의 코드에서 모든 break를 제거한다면 어떤 일이 일어날까요?

입력: a
실행결과:
You selected high level English.
You selected medium level English.
You selected low level English.
You type wrong input!

우리가 원하는 것은 a에 해당하는 case만 실행하고 나머지는 건너 뛰는 것인데,

break가 없으니 case a 에 뒤따르는 모든 case들이 실행된 모습입니다.

따라서 원하는 case를 실행한 뒤에는 꼭 break를 넣어 switch를 탈출해 줍시다.

 


 

지금까지 다양한 조건문에 대해서 공부해 보았는데요, 

조건문은 앞으로의 코딩에서 가장 많이 사용하게 되는 구문 중 하나이니 잘 숙지하셔야 합니다!

공부라고 생각한다기보다 "나의 논리를 구현하기 위한 도구"로써 생각하시면 좀 더 받아들이기 편할 것 같습니다.

 

오늘 살펴본 내용중에 잘못된 부분이 있거나, 궁금한 부분이 있으시다면 댓글 꼭 달아주시기 바랍니다. 감사합니다!