프로그램을 짜는 데 있어서 Branch(분기)는 매우 중요하다. 코드가 순서대로 전부 실행되는 것만으로는 한계가 매우 크다. 선택적으로 실행할 수 있어야한다.
앞으로 많이 사용하게 될 if문은 if와 else 키워드로 구성된다.
if(조건식){
//실행 내용
}
else{
//실행 내용
}
if는 else가 없어도 독립적으로 사용 가능하나, else는 if가 있을 때만 사용 가능하며 효용이 있다.
if문의 조건식을 만족하면 중괄호 내의 코드가 실행된다. 모두 if로 조건을 검사하지 않고 else를 사용하는 이유는, 하나의 if~else로 묶여있는 조건문들 중 하나의 블록만 실행되기 때문이다.
다음을 보자.
if(){
}
else if(){
}
else if(){
}
else{
}
위의 코드는 순차적으로 실행되며 어느 블록이던 조건을 만족하는 블록을 만나면 그 블록을 실행하고 남아있는 블록들은 조건을 검사하지 않고 건너뛴다.
연산자를 통해 조건을 검사하는 방법도 있다. 피연산자가 세 개인 삼항연산자로,
(조건) ? (result1) : (result2)
이와 같은 형식을 가진다.
조건부가 참이면 result1, 거짓이면 result2를 반환한다.
int num = num0 == 0? num1 : num2;
위와 같이 활용할 수 있다.
반복문 내에서 이 키워드가 실행되면 반복문의 조건검사가 있는 위치로 이동하게 된다. continue문 이하의 부분은 무시되고 조건검사 부분으로 이동한다.
continue;
반복문을 빠져나올 때 사용하는 키워드이다. break문이 실행되면, 이 break문을 감싸고 있는 가장 가까운 반복문 하나를 빠져나오게 된다.
break;
switch문은 if~else if~else와 유사하며 if문보다 간결하게 작성할 수 있지만 사용하기에 제한적인 부분이 있다.
예제를 통해 구조를 살펴보자.
#include <stdio.h>
int main(void) {
int num;
printf("1 : 가방 2 : 연필 3 : 사탕\n번호를 입력하시오 : ");
scanf("%d", &num);
switch (num) {
case 1:
printf("Bag\n");
break;
case 2:
printf("Pencil\n");
break;
case 3:
printf("Candy\n");
break;
default:
printf("No Result");
}
return 0;
}
1 : 가방 2 : 연필 3 : 사탕
번호를 입력하시오 : 1
Bag
1 : 가방 2 : 연필 3 : 사탕
번호를 입력하시오 : 3
Candy
1 : 가방 2 : 연필 3 : 사탕
번호를 입력하시오 : 9
No Result
switch(n)에 들어갈 n은 정수형 변수여야한다. 변수 n에 저장된 값에 의해 실행될 case가 지정되고, n의 위치로 이동하긴 하지만 그 이후 문장들도 모두 실행되므로, 매 case의 끝부분에는 break가 있어야한다. break가 없을 때 결과가 어떻게 달라지는지 보면 이를 확인할 수 있다.
#include <stdio.h>
int main(void) {
int num;
printf("1 : 가방 2 : 연필 3 : 사탕\n번호를 입력하시오 : ");
scanf("%d", &num);
switch (num) {
case 1:
printf("Bag\n");
case 2:
printf("Pencil\n");
case 3:
printf("Candy\n");
default:
printf("No Result");
}
return 0;
}
1 : 가방 2 : 연필 3 : 사탕
번호를 입력하시오 : 1
Bag
Pencil
Candy
No Result
1 : 가방 2 : 연필 3 : 사탕
번호를 입력하시오 : 3
Candy
No Result
즉, switch는 해당 case위치로 이동하긴 하나 그 case만 골라서 실행하는 구문은 아니므로 break를 이용해야한다.
하지만 이러한 데에는 이유가 있다. 다음 예시를 보자.
#include <stdio.h>
int main(void) {
char vote;
printf("1 : A후보 2 : B후보 3 : C후보\n투표할 후보의 성명을 입력하시오 : ");
scanf("%c", &vote);
switch (vote) {
case 'A':
case 'a':
printf("A후보에게 투표완료");
break;
case 'B':
case 'b':
printf("B후보에게 투표완료");
break;
case 'C':
case 'c':
printf("C후보에게 투표완료");
break;
default:
printf("기권");
}
return 0;
}
1 : A후보 2 : B후보 3 : C후보
투표할 후보의 성명을 입력하시오 : A
A후보에게 투표완료
1 : A후보 2 : B후보 3 : C후보
투표할 후보의 성명을 입력하시오 : a
A후보에게 투표완료
아스키코드는 정수이므로 switch문을 사용할 수 있다.
위의 예시에서, 여러 입력에서 동일한 코드를 실행하고 싶을 때 break를 두지 않았다. 이와같이 활용할 수 있다.
키워드 goto는 프로그램 실행 중 위치를 이동시키고싶을 때 사용할 수 있다. goto의 사용은 지양되고 있다.
LABEL:
//실행 내용
goto LABLE;
else if~else구문에서는 한 블록이 실행되면 나머지를 건너뛴다.
continue문장이 실행되면 해당 반복문의 나머지 부분은 무시하고 조건검사 부분으로 돌아온다.
break가 실행되면 최근접 반복문 하나만 빠져나온다.