해당 C언어 시리즈는 처음 코딩을 접하는 사람들이 쉽게 이해할 수 있도록 작성되었습니다.
조건문은 특정한 조건에 만족할 경우에만 명령문을 실행하도록 도와주는 문법입니다.
조건은 일반적으로 수식으로 표현되고 수식의 진리값이 참일 경우에만 작동됩니다.
조건문의 종류로는 if, switch가 있습니다.
if는 만약 ~라면이라는 뜻을 가지고 있습니다.
우리는 ~의 부분에 조건을 넣어주어 조건문을 완성시켜줄 겁니다.
if (조건 수식) 명령문;
위와 같이 코드를 작성하면 조건 수식이 참일 경우에만 명령문을 실행하게 됩니다.
int var = 5;
if (var > 3) // var이 3보다 크다면
printf("var는 3보다 큽니다.\n");
printf("프로그램 종료\n");
출력: var는 3보다 큽니다.
프로그램 종료
위 코드에서는 () 안에 var > 3, var이 3보다 큰가라는 조건을 넣어줬습니다.
5는 3보다 크기 때문에 참입니다. 따라서 들여 쓰기가 되어 있는 출력문과 프로그램 종료 출력문 모두 실행됩니다.
C언어에서는 해당 명령문이 어디에 속해 있는지 구분하기 위해 들여 쓰기 사용을 권장합니다. printf("var는 3보다 큰 수입니다.\n");는 조건문 if와 연관이 있는 명령문이기 때문에 들여 쓰기를 하여 작성합니다.
사용 형식처럼 조건 수식 옆에 명령문을 작성하기도 합니다. (스타일 차이)
int var = 2;
if (var > 3) // var이 3보다 크다면
printf("var는 3보다 큽니다.\n");
printf("프로그램 종료\n");
출력: 프로그램 종료
반대로 var가 3보다 크지 않다면 조건 수식의 진리값이 거짓이 되므로 조건문과 연결된 명령문은 실행되지 않습니다.
명령문1;
if (조건 수식) 명령문2;
명령문3;
조건 수식이 참일 경우
: 명령문1 -> 명령문2 -> 명령문3
조건 수식이 거짓일 경우
: 명령문1 -> 명령문3
방금 전까지의 내용만 보면 조건 당 하나의 명령문만 실행 가능합니다.
하지만 작업 단위를 묶어주는 역할을 하는 {}를 이용하면 하나의 조건에 여러 개의 명령문을 실행할 수 있게 해줄 수 있습니다.
char pass = 0;
int score = 82;
if (score >= 70) // score가 70 이상이라면
{
printf("귀하의 점수는 %d점입니다.\n", score);
pass = 1; // 합격
}
if (pass == 1)
printf("축하드립니다. 합격입니다.\n");
printf("프로그램 종료\n");
출력: 귀하의 점수는 82점입니다.
축하드립니다. 합격입니다.
프로그램 종료
위 코드는 점수가 70점 이상일 경우 시험에 통과했음을 알려주는 코드입니다.
score가 82점으로 70점 이상이기 때문에 score >= 70이라는 조건 수식은 참이 됩니다.
따라서 {}로 묶여 있는 출력문과 합격임을 나타내는 명령문이 모두 실행됩니다.
{} 안에서 변수 pass의 값을 1로 바꿔 합격 처리를 했기 때문에 pass == 1이라는 조건 역시 참이 되어 축하 문구가 출력이 됩니다.
명령문1;
if (조건 수식) {
명령문2;
명령문3;
}
명령문4;
조건 수식이 참일 경우
: 명령문1 -> 명령문2 -> 명령문3 -> 명령문4
조건 수식이 거짓일 경우
: 명령문1 -> 명령문4
if else문은 상반되는 조건이 있을 때 사용하는 조건문입니다.
if는 아까도 말씀드렸다시피 만약 ~라면이라는 의미를 가지고 있습니다.
else는 또 다른 이라는 의미를 가지고 있는데, 그렇지 않으면 이라고 해석하면 편합니다.
한마디로 if문의 조건 수식이 거짓일 경우 else과 짝 지어진 명령문이 실행된다는 겁니다.
if (조건 수식) 명령문1;
else 명령문2;
기존의 if문은 하나의 조건만을 가정할 수 있기 때문에 반대되는 조건이 있을 경우 다음과 같이 코드를 작성해야만 했습니다.
int var = 5;
if (var >= 3) // var이 3 이상이라면
printf("var는 3보다 크거나 같습니다.\n");
if (var < 3) // var이 3 미만이라면
printf("var는 3보다 작습니다.\n");
printf("프로그램 종료\n");
출력: var는 3보다 크거나 같습니다.
프로그램 종료
위의 코드는 상반되는 조건을 if문을 통해 2번 나열해야 된다는 불편함이 있습니다.
하지만 if else문을 사용한다면 한 번의 조건 나열만으로 상반되는 조건을 표현할 수 있습니다.
int var = 5;
if (var >= 3) // var이 3 이상이라면
printf("var는 3보다 크거나 같습니다.\n");
else // var이 3 미만이라면
printf("var는 3보다 작습니다.\n");
printf("프로그램 종료\n");
출력: var는 3보다 크거나 같습니다.
프로그램 종료
코드가 훨씬 간결하고 깔끔해진 걸 볼 수 있습니다.
명령문1;
if (조건 수식) 명령문2;
else 명령문3;
명령문4;
조건 수식이 참일 경우
: 명령문1 -> 명령문2 -> 명령문4
조건 수식이 거짓일 경우
: 명령문1 -> 명령문3 -> 명령문4
if else문 역시 조건에 따라 여러 개의 명령문을 실행하도록 바꿔줄 수 있습니다.
int score = 82;
printf("귀하의 점수는 %d점입니다.\n", score);
if (score >= 70) // score가 70 이상이라면
printf("축하드립니다. 합격입니다.\n");
else
{ // score가 70 미만이라면
printf("70점 이상부터 합격입니다.\n");
printf("재응시 바랍니다.\n");
}
printf("프로그램 종료\n");
출력: 귀하의 점수는 82점입니다.
축하드립니다. 합격입니다.
프로그램 종료
명령문1;
if (조건 수식) {
명령문2;
명령문3;
}
else {
명령문4;
명령문5;
}
명령문6;
조건 수식이 참일 경우
: 명령문1 -> 명령문2 -> 명령문3 -> 명령문6
조건 수식이 거짓일 경우
: 명령문1 -> 명령문4 -> 명령문5 -> 명령문6
서로 상반되는 조건이 있을 때 if문을 두 번 작성하는 방법과 if else문을 이용하는 방법이 있습니다.
if문을 두 번 작성할 경우 첫 번째 if문이 참이 됨에 따라 명령문을 실행했어도 두 번째 if문을 무조건 검사하게 됩니다.
반면, if else문은 앞의 조건이 참일 경우 else 명령문을 지나치게 됩니다.
if if 구조는 프로그램의 불필요한 연산을 만들어낼 수 있고, 이는 프로그램 성능 저하로 이어집니다. 따라서 상반되는 조건이 있을 때는 if else문을 사용해야 합니다.
이전 시간에 배운 연산자 외에 조건 연산자, 삼항 연산자라고 불리는 연산자가 존재합니다.
해당 연산자는 3개의 항을 이용하여 조건의 참, 거짓 여부를 확인하여 명령문을 실행합니다.
(조건 수식) ? 명령문1 : 명령문2;
동작 방식은 if else문과 매우 유사합니다.
조건 수식의 진리값이 참일 경우 명령문1, 거짓일 경우 명령문2를 실행하게 됩니다.
int var = 5;
(var >= 3) ? printf("var는 3보다 크거나 같습니다.\n") : printf("var는 3보다 작습니다.\n");
출력: var는 3보다 크거나 같습니다.
변수 var의 값은 5로 3보다 크거나 같은 수이기 때문에 : 앞의 명령문이 실행됩니다.
var의 값을 3 미만의 값으로 변경하게 되면 : 뒤의 명령문이 실행됩니다.
명령문1;
(조건 수식) ? 명령문2 : 명령문3;
명령문4;
조건 수식이 참일 경우
: 명령문1 -> 명령문2 -> 명령문4
조건 수식이 거짓일 경우
: 명령문1 -> 명령문3 -> 명령문4
결괏값 = (조건 수식) ? 수식1 : 수식2;
사용 형식 1에서는 명령문의 실행에 초점이 맞춰져 있다면,
사용 형식 2는 조건에 따른 수식의 저장에 초점이 맞춰져 있습니다.
char pass = 0;
int score = 82;
printf("귀하의 점수는 %d점입니다.\n", score);
pass = (score >= 70) ? 1 : 0;
if (pass == 1)
printf("축하드립니다. 합격입니다.\n");
else
{
printf("70점 이상부터 합격입니다.\n");
printf("재응시 바랍니다.\n");
}
출력: 귀하의 점수는 82점입니다.
축하드립니다. 합격입니다.
변수 score 값은 82로 70 이상이기 때문에 수식1인 값 1이 pass에 저장됩니다.
따라서 pass == 1의 조건이 참이 되어 합격 축하 문구가 출력됩니다.
int price = 30000;
int point = 0;
point = (price >= 30000) ? price * 0.05 : price * 0.03;
printf("현재 포인트: %d점\n", point);
출력: 현재 포인트: 1500점
수식에 단순한 값이 아닌 연산을 사용해도 무관합니다.
결괏값 = (조건 수식) ? 수식1: 수식2;
조건 수식이 참일 경우
: 수식1을 결괏값에 저장
조건 수식이 거짓일 경우
: 수식2를 결괏값에 저장
if문 역시 명령문의 종류 중 하나입니다.
때문에 if문의 명령문으로 다시 한번 if문을 넣어줄 수 있습니다.
char pass = 0;
int score = 82;
printf("귀하의 점수는 %d점입니다.\n", score);
if (score >= 70) // score가 70 이상이라면
{
pass = 1; // 합격
if (pass == 1)
printf("축하드립니다. 합격입니다.\n");
else
printf("재응시 바랍니다.\n");
}
printf("프로그램 종료\n");
출력: 귀하의 점수는 82점입니다.
축하드립니다. 합격입니다.
프로그램 종료
이는 if else문 역시 동일하게 적용됩니다.
char grade;
int score = 82;
if (score >= 90) // score가 90 이상이라면
{
grade = 'A';
}
else
{
if (score >= 80) // score가 80 이상이라면
{
grade = 'B';
}
else
{
if (score >= 70) // score가 70 이상이라면
{
grade = 'C';
}
else
{
if (score >= 60) // score가 60 이상이라면
{
grade = 'D';
}
else // score가 60 미만이라면
{
grade = 'F';
}
}
}
}
printf("점수: %d\t등급: %c\n", score, grade);
출력: 점수: 82 등급:B
if else if else문은 위의 중첩된 if else문을 변형시켜 나온 문법입니다.
조건문은 하나의 명령문으로 해석이 되기 때문에 if 또는 else의 {} 안에 명령문이 몇 개가 있든 상관없이 무조건 단일 명령문으로 처리됩니다.
다음은 위 코드를 일부 발췌한 코드입니다.
if (score >= 90) // score가 90 이상이라면
{
grade = 'A';
}
else
{
if (score >= 80) // score가 80 이상이라면
{
grade = 'B';
}
}
현재 조건에 따른 명령문을 모두 {}로 묶어 복합 명령문 처리했지만, {}로 묶은 명령문이 하나이기 때문에 단일 명령문이므로 다음과 같이 표현할 수 있습니다.
if (score >= 90) // score가 90 이상이라면
grade = 'A';
else if (score >= 80) // score가 80 이상이라면
grade = 'B';
}
이와 같은 과정을 모두 거치면 다음과 같이 간단한 코드가 나옵니다.
char grade;
int score = 82;
if (score >= 90) // score가 90 이상이라면
grade = 'A';
else if (score >= 80) // score가 80 이상이라면
grade = 'B';
else if (score >= 70) // score가 70 이상이라면
grade = 'C';
else if (score >= 60) // score가 60 이상이라면
grade = 'D';
else // score가 60 미만이라면
grade = 'F';
printf("점수: %d\t등급: %c\n", score, grade);
출력: 점수: 82 등급: B
이로써 if ~ else if ~ else의 구조가 만들어졌습니다.
앞으로 우리는 조건이 여러 개일 경우 해당 구조를 이용하여 표현할 겁니다.
두 번째 조건부터는 else if (조건 수식)을 사용하고
서술한 조건에 모두 부합하지 않을 경우는 else로 표현하여 사용합니다.
else는 필수 조건이 아니기 때문에 생략 가능합니다.
else if 역시 명령문이 여러 개라면 {}로 작업 단위를 묶어줄 수 있습니다.
else는 항상 마지막에 위치합니다.
switch문은 if문과 다르게 정해진 상수들과 비교를 하여 명령문을 실행합니다.
정해진 상수가 조건이 되는 겁니다.
switch (수식 또는 변수) { case 상수1: 명령문2; break; case 상수2: 명령문3; break; default: 명령문4; break; } 명령문5;
switch문의 조건이 되는 ()에는 조건 수식을 포함한 모든 수식을 사용할 수 있습니다. 수식의 결괏값을 case와 함께 쓰여 있는 상수와 비교하여 명령문을 실행합니다.
char grade;
int score = 82;
switch (score / 10)
{
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
default: // if문의 else 역할과 동일
grade = 'F';
}
printf("점수: %d\t등급: %c\n", score, grade);
출력: 점수: 82 등급: B
점수에 따른 등급을 산출할 때 10점 단위로 점수를 끊어 등급을 매기는 걸 볼 수 있습니다.
이러한 규칙을 이용하여 switch문을 작성할 수 있습니다.
10점 단위이기 때문에 10으로 나누어 얻어지는 몫을 이용하여 case를 나눕니다.
그러면 100~90점은 case 10과 9로 나누어 A 등급, 89~80점은 B 등급, ..., 60~69점은 D 등급, 그 외는 default를 이용하여 F 등급으로 처리할 수 있습니다.
break라는 처음 보는 명령문이 각 case마다 들어가 있습니다.
break는 switch문을 빠져나오는 역할을 합니다. break문을 넣어주지 않을 경우 조건에 부합하지 않더라도 그다음의 case문까지 모두 실행하여 원치 않는 결과가 나오게 됩니다.
default는 if문의 else 역할과 동일합니다.
서술한 조건(case)과 모두 부합하지 않을 경우 default의 명령문을 실행하게 됩니다.
default는 필수 조건이 아니기 때문에 생략 가능하고,
마지막에 서술되는 조건이기 때문에 break문 또한 작성하지 않아도 됩니다.
점수에 따른 등급 산출 프로그램을 봤을 때 if문을 이용한 코드가 switch문을 이용한 코드보다 간결하다는 걸 알 수 있습니다.
처음 코딩을 배우는 많은 사람이 코드의 길이가 짧을수록 좋은 코드라고 생각합니다.
하지만, 코드의 길이는 프로그램의 성능과 연관이 없습니다.
코드의 길이가 짧다고 성능이 좋은 게 아니라는 소리입니다.
오히려 switch문으로 작성된 코드가 기계어로 번역했을 때 연산이 더 적어 if문보다 좋은 성능을 보입니다.
if문은 어떠한 조건이든지 수식으로 표현하여 사용할 수 있다는 장점이 있습니다.
switch문은 수식의 결과 또는 변수의 값을 상수들과 비교하는 데에 장점이 있지만 비교 대상이 상수에 국한된다는 큰 단점이 있습니다.
주로 조건문을 사용할 때 if문을 이용하지만, 상황에 따라 switch가 더 간결하고 가독성이 좋은 경우가 더러 있습니다.