프로그램을 수행하면서 사용자가 조건을 제시하고, 이를 만족하거나 그렇지 못할 때 수행할 내용을 기술함으로써, 프로그램에 일종의 가지치기를 할 수 있는 기능이다.
아주 간단한 일상 예를 들어보면, 비가 오면 우산을 써야해. 일기예보에서 내일은 비가 온대.라는 문장에서, 내일은 비가 올 것이고, 비가 오면 우산을 써야한다고 한다. 따라서 비가 온다는 조건을 만족했으므로, 우산을 써야하는 것이다.
조건이란
국어 문장의 만약 ~라면, ~할 것이다에서 만약 ~라면부분을 조건이라 할 수 있다.
~할 것이다부분은 조건이 만족될 때, 행해야 할 동작을 나타낸 부분이다.
따라서 지정한 조건이 만족하냐 못하냐를 이용해, 경우에 따른 동작을 달리하여 프로그램에 일종의 분기점을 줄 수 있다.
if문
가장 기본적인 조건문의 형태로, 조건이 만족될 때 수행할 내용을 적는 구문이다.
형태
if(조건식)
{
수행할 내용
}
if-else문
if문에서 발전한 형태로, if문의 조건이 만족되지 않았을 때의 경우에 수행할 내용을 추가한 구문이다.
형태
if(조건식)
{
수행할 내용 1
}
else
{
수행할 내용 2
}
위 예시에서 조건식이 만족되면 수행할 내용 1이, 그렇지 않으면 수행할 내용 2가 실행된다.
if-else if-else문
if-else문에서 발전한 형태로, if문의 조건을 만족하지 않을 때, 추가적인 조건을 제시하여 해당 조건을 만족할 경우에 수행할 내용을 추가한 구문이다.
else if는 여러 번 쓸 수 있다.
형태
if(조건식 1)
{
수행할 내용 1
}
else if(조건식 2)
{
수행할 내용 2
}
.
.
.
else if(조건식 N-1)
{
수행할 내용 N-1
}
else
{
수행할 내용 N
}
위 예시에서 조건식 1이 만족되면 수행할 내용 1이, 조건식 1을 만족하지 못한 상태로 조건식 2를 만족하면 수행할 내용 2, 조건식 N-2을 만족하지 못한 상태로 조건식 N-1를 만족하면 수행할 내용 2, 그렇지 않으면 수행할 내용 N이 실행된다.
Nested if statement
조건문은 중첩하여 사용할 수 있다.
예
if(조건식 1)
{
수행할 내용 1
if(조건식 2)
{
수행할 내용 2
}
수행할 내용 3
}
위 예시에서 조건식 1을 만족하면 수행할 내용 1이 실행되며, 그 상태에서 조건식 2를 만족하면 수행할 내용 2를 실행한 다음 수행할 내용 3이 실행되고, 조건식 2를 만족하지 않으면 수행할 내용 3이 수행할 내용 1을 이어서 실행된다.
위 예시에서는 if문 안에 if문이 들어갔지만, else if문이나 else문 안에도 조건문이 들어갈 수 있다.
switch문
switch문은 if문에서 조건의 결과가 여러 값으로 나올 때, 편하게 사용하기 위한 if문이라고 생각하면 편하다.
형태
switch(조건식)
{
case 값1:
수행할 내용 1
break;
case 값2:
수행할 내용 2
break;
case 값N-1:
수행할 내용 N-1
break;
case default:
수행할 내용 N
break;
}
if-else if-else 구문과 거의 비슷한 모습을 볼 수 있다.
if는 첫 번째 case, else if는 k번째 case, else는 default에 대응한다.
수행할 내용 밑 줄에는 break;가 있는데, 이를 작성하지 않으면 break;를 만날 때까지 있는 모든 case의 수행할 내용이 수행되게 된다.
의도적으로 이를 이용하여 필요한 곳에 쓸 수도 있다.
goto문
goto문은 코드에 특정 분기를 기록하여, goto 분기명;을 만나면 해당 분기점으로 이동하여 코드를 실행하는 구문이다.
따라서 사용을 하게되면 프로그램의 흐름을 따라잡는데 어려움이 발생한다.
goto를 이용하여 loop를 만들 수 도 있지만, 권장하지 않는다.
예
goto A;
printf("HELLO\n");
A:
printf("BYE\n");
위의 예에서 HELLO는 출력되지 않고 BYE가 출력된다.
최종 예제
이 글에서 다룬 내용들을 모두 담은 예제 소스를 작성해보았다. 개연성이 전혀 없는 코드이지만, 프로그래밍을 처음 배운다면 코드의 흐름을 파악하는 것에 좋은 연습이 될 수 있을거라 믿는다.
#include <stdio.h>
int main()
{
int a = 3;
int b = 4;
int c, d = 0;
if(a + b > 10)
{
c = a * 2;
printf("Case 1 -- ");
}
else if(a + b > 8)
{
c = b * 2;
printf("Case 2 -- ");
}
else
{
if(a + b >= 6)
{
c = a + b + a * b;
printf("Case 3 -- ");
}
else
{
c = a * ++b;
printf("Case 4 -- ");
}
}
cond:
if(d == 4)
{
printf("// GOTO IS BAD...");
goto end;
}
switch(c)
{
case 6:
d = 1;
break;
case 8:
d = 2;
case 15:
d = 3;
break;
case 19:
d = 4;
break;
default:
d = 0;
break;
}
goto cond;
end:
printf("d = %d ", d);
return 0;
}