Qaupot Blog
Software Engineering, Trip

407. 조건분기

🕐 Fri, 07 Feb 2014 09:00:00 GMT 🕓 Tue, 24 Aug 2021 07:18:00 GMT

조건 분기

조건 분기란, 특정한 조건에 부합하는 경우, 이하에 속하는 지시사항들의 실행 여부를 결정하는 일입니다.

이는 "예측 가능한" 조건 분기입니다.
예측할 수 없는 경우에 대해서는 그 분기지점을 마련할 수 없으며, 의도적으로 계획된 부분에 대해서 그 처리를 미리 정해놓음을 의미합니다.

조건 분기 - 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을 출력합니다. 컴퓨터 입장에서는 매우 단순하고 효율적인 방법이지만, 프로그래머 입장에서는 코드의 흐름이 복잡한 코드가 됩니다.

현재는 일부 시스템 프로그래밍을 제외하고는 거의 사용하지 않는 방법입니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.