조건 분기
조건 분기란, 특정한 조건에 부합하는 경우, 이하에 속하는 지시사항들의 실행 여부를 결정하는 일입니다.
이는 "예측 가능한" 조건 분기입니다.
예측할 수 없는 경우에 대해서는 그 분기지점을 마련할 수 없으며, 의도적으로 계획된 부분에 대해서 그 처리를 미리 정해놓음을 의미합니다.
조건 분기 - if, else if, else
#include <stdio.h>
int main(int argc,char** argv)
{
int InputValue;
printf("Input your value :");
scanf("%d",&InputValue);
if( InputValue > 0 )
{
printf("InputValue > 0");
}
else if(InputValue == 0)
{
printf("InputValue == 0");
}
else
{
printf("InputValue < 0");
}
}
위의 코드에서는 특정한 int 값을 입력받고, 그 결과에 따라 분기하고 있습니다.
if( condition )
{
}
condition 이 true 라면 이 블록에 묶인 코드는 실행됩니다.
- condition 이 false 라면 실행되지 않을 것입니다.
C/C++에서 condition 값은 여러가지로 정의됩니다.
- bool 자료형에 따른 true 혹은 false 를 의미 (C++)
- false 는 0 값, true 는 그 이외의 값을 의미 (C)
이러한 C/C++의 특징은 예기치 못한 에러를 만들어 내기도 합니다.
- A == B 비교연산을 적으려고 했다가, A = B로 적는다면, A에 B가 대입됨은 물론 원치 않는 값을 가르키는 상황이 됩니다.
else if(condition)
{
}
else if 문을 사용할 수 있습니다.
if 문의 결과가 false 라면, 이어지는 else if의 condition 을 확인합니다. true 라면 이 블록 안으로 분기하게 됩니다.
- else if 밑에는 다시 else if 문을 여러 번 다시 사용할 수 있습니다.
- 연속적으로 사용한 경우, else if 를 만나기 전 까지의 모든 조건이 실패했을때 해당 condition 을 체크합니다.
else
{
}
모든 조건들에 부합하지 않는 경우 else 블록으로 처리할 수 있습니다.
상위의 모든 조건이 실패하면, 자동적으로 이 else 블록으로 분기하게 됩니다.
else if와 else 는 처리할 필요가 없다면 사용하지 않아도 무방합니다.
조건 분기 - switch
또 다른 조건분기인 switch 문을 살펴보겠습니다.
#include <stdio.h>
int main(int argc,char** argv)
{
int InputValue;
printf("Input your value :");
scanf("%d",&InputValue);
switch(InputValue)
{
case 0 :
printf("InputValue == 0");
break;
case 1 :
printf("InputValue == 1");
break;
default:
printf("InputValue is default");
break;
}
return 0;
}
switch(Value)
{
case A:
break;
case B:
break;
default:
break;
}
Value 의 위치에 매개 변수 혹은 값이 사용되며,
이하 case 로 되어있는 값과 이를 비교하고, 비교값이 동일하다면 실행합니다.
if 문의 경우, 각 if 문과 else if문 마다 매개변수를 다르게 사용할 수도 있지만,
switch 문은 그렇지 못 하며, if 문처럼 조건을 직접 명시하지 못 하고 비교값이 될 대상만을 지정합니다.
각 case 문이 처리될때, break 가 명시되어 있지 않다면 멈추지 않고 계속해서 진행합니다.
- case A문에 진입하여 처리 된 이후, 끝에 break 를 명시하지 않는다면 case B역시 처리됩니다.
- B가 A를 포함하는 형태의 경우 유용하게 사용되지만, 그렇지 않다면 실수에 의한 오류를 유발할 수 있습니다.
switch 문은 if 문에 비해 단순하게 처리됩니다. 실제로 컴파일러는 if 문보다 switch 문을 사용할때 보다 짧고 효율적인 기계어를 만들어 냅니다.
- switch 는 아래서 사용할 goto의 기계어 결과물과 비슷한 로직을 따릅니다.
제어문 - goto
조건 분기는 아니지만, goto 라는 제어문이 있습니다.
지정된 라벨 위치로 바로 건너뛰라는 지시어이며, 1:1로 기계어와 매칭되는 가장 단순한 분기 방법입니다.
int abc = 0;
goto Last;
abc++;
Last:
printf("%d",abc);
어느 특정한 지점을 Label: 의 형태로 지정해 놓고 goto Label; 이라고 사용하면 그 지점으로 무조건 건너 뛰게 됩니다.
위와 같은 코드에서는 abc++가 무시되고 바로 0을 출력합니다. 컴퓨터 입장에서는 매우 단순하고 효율적인 방법이지만, 프로그래머 입장에서는 코드의 흐름이 복잡한 코드가 됩니다.
현재는 일부 시스템 프로그래밍을 제외하고는 거의 사용하지 않는 방법입니다.