2015년 8월 16일 일요일

C 언어 - switch case 문

switch case


if, else if, else 문으로 여러 조건을 비교할 수 있었지만 코드가 보기 좋지 않다.

if 문은 되도록이면 최선을 다해 한 두가지 경우의 수가 나오는 경우에만 사용하는 편이 코드를 다시 읽게 될 때 이해하기가 편하다.

여러 경우의 수가 나오는 경우 swtich case 문을 사용할 수 있다.

문법:

switch (비교할 대상) {
case 비교값1:
    break;
case 비교값2
    break;
deafult:
    break;
}

switch (비교 대상)

비교할 대상으로 올수 있는 값은 기본 타입
char, short, int, long, float, double

case 비교값:

상수값만 올 수 있다.
case 문은 마치 if (비교대상 == 비교값) 같은 역할을 한다.
case 문의 끝은 반드시 break; 로 처리해야 한다.

default:

마치 if, else if 후 else 구문 같은 역할을 한다.
case 문에 모두 만족하지 않으면 default 구문이 실행된다.


예)

int done = 0;
char c = getchar();

switch (c) {
case 'q':
    done = 1;
    break;
default:
    break;
}


switch case 의 함정


break 문


case 조건문1:
case 조건문2:

조건문1 과 조건문2 사이에 break 문이 없다.
만약에 조건문1과 일치하여 조건문1이 수행되고 나면 조건문2가 실행된다.
break; 문을 만나지 않으면 계속 실행이 된다.
간혹 이러한 특성이 도움이 되기도 하지만 실수로 break; 문을 빠뜨리는 경우가 많다.
주의하자.

코드 가독성 문제


case 문에 코드를 너무 길게 적는 경우가 많다.
이런 경우 쉽게 코드 가독성이 떨어진다.
case 문이 길어지는 경우 해당 코드를 함수로 분리시키는 건 어떤지 고려해 보자.

switch (choice) {
case 'a':
    advanced_job();
    break;
}

...

void advanced_job() {
    // 코드
}

변수 선언


C 언어는 반드시 { } 영역 안에서는 반드시 초반에 변수 선언을해야 한다.
간혹 case 문 안에서만 필요한 변수를 필요할 때가 있다.
이럴 때 case 문 안에서 해결하고자 하면 case 문에 { } 영역을 만들어 주면 된다.

예)

switch (choice) {
case 'x':
    {
        int sum = 1 + 2;
        printf("sum:%d\n", sum);
    }
    break; 
case 'y':
    {
        int sum = 3 + 4;
        printf("sum:%d\n", sum);
    }
    break;}


코드 가독성


if 를 사용하나 switch 를 사용하나 같은 결과를 얻을 수 있는 경우가 있다.
실행 결과만 좋으면 코드가 어떻듯 상관없다는 관념은 잘못되었다고 인식되고 있다.
코드가 한번 작성되면 다른 사람에 의해 또는 자기 자신에 의해 여러 번 읽히게 된다.
코드를 한참 보지 않다가 오랜만에 다시 보게 되는 경우 코드를 보고 빠르게 이해하지 못한다면 문제를 빠르게 수정할 수가 없게 된다.
이런 부담감은 프로그램 유지 보수 및 기능 개선의 의지를 현저히 하락 시킨다.
이러한 자신감 하락은 결국 개발자들 스스로에게 우울감을 안겨주고는 한다.

가독성 좋은 코드란 코드를 작성한 사람의 의도를 쉽게 파악할 수 있는 코드이다.
가독성 좋은 코드란 코드에 기능을 추가하거나 수정하는데 따른 영향 범위가 뚜렷한 코드이다.

실행 결과가 같은 데 if 나 switch 중 뭘 사용하면 코드 가독성이 좋아질까?
  • if 는 조건이 하나 또는 두가지 경우에 한정될 때 사용한다.
  • switch case 는 조건이 두가지가 넘어가는 경우 사용한다.
물론 일반적인 경우에 한 한것이고 위 규칙이 맞지 않는 상황도 있다.
다만 코드 가독성을 위해 스스로 수련을 해야 한다.
이러한 선택 기준점은 개발하고 다시 수정하고를 반복함으로써 스스로 문제점을 파악해 자신의 기준점을 세워 나아갈 수 있다.

이러한 기준점은 다음 선택에 시간을 줄일 수 있다.


댓글 2개:

  1. switch문 case 문은 if처럼 A<=10같이 범위를 지정할 수 있나요?

    답글삭제
  2. switch case 문은 .....등치연산을 기본으로 합니다....
    그렇게 할려면 else if문이 더 자유로운표현이 가능하기때문에...

    if ~ else if ~ 문을 사용하시면 됩니다.

    답글삭제