프로그래밍

[c언어/c++] 분기문(switch) 제거

업글 2021. 1. 21. 01:03

안녕하세요 업글입니다. 이번 포스팅에서는 분기문(switch)를 제거하는 방법에 대해서 설명해보도록 하겠습니다.

 

분기문에 대한 설명

분기문은 조건에 따라서 각각 다른 코드를 실행하도록 합니다. if문, switch문이 조건에 따라서 실행되는 코드가 달라지기 때문에 분기문이라고 생각하시면 됩니다. 이러한 분기문은 코드 작성 시 필수적으로 사용해야하는 문법입니다. 그러나 분기 조건이 많아질수록 코드를 이해하기 어려워지므로 가독성이 떨어지게 됩니다.

분기문 코드

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int32_t data, result;

    result = 0;
    data = rand() % 4;

    switch (data) {
        case 0:
            result = data * 2;
            break;
        case 1:
            result = data * 3;
            break;
        case 2:
            result = data * 4;
            break;
        case 3:
            result = data * 5;
            break;
        default:
            break;
    }

    printf("data = %d, result = %d\n", data, result);

    return 0;
}

분기문 제거 이유

위의 분기문에 대한 설명과 같이 분기 조건이 많아질수록 코드가 복잡해져서 이해가 힘들어져서 코드의 가독성이 떨어지게됩니다. 분기문의 조건이 많아 복잡한 경우 분기문을 제거하여 코드 가독성을 증가시킬 수 있습니다.

 

분기문 제거 코드

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int32_t data, result;

    result = 0;
    data = rand() % 4;

    int32_t table[] = { data * 2, data * 3, data * 4, data * 5 };

    result = table[data];

    printf("data = %d, result = %d\n", data, result);

    return 0;
}

위에서 예시로 보여드린 분기문 코드를 참조테이블을 사용하여 제거한 코드입니다. 코드가 간결해졌으며, 분기 조건이 추가되는경우에도 table배열에 추가하고자 하는 로직을 넣어 쉽게 추가할 수 있습니다.

 

위의 예시에서는 분기 조건에 따라서 result함수의 값이 달라지게됩니다. 이와 다르게 분기 조건에 따라서 실행되는함수가 달리지게 되는 경우에는 함수포인터를 사용하여 분기문을 제거할 수 있습니다.

 

분기조건에 따라 실행되는 함수가 달라지는 코드

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define NO (0)
#define YES (!NO)

void FunctionA(void)
{
    printf("A\n");
}

void FunctionB(void)
{
    printf("B\n");
}

void FunctionC(void)
{
    printf("C\n");
}

void FunctionD(void)
{
    printf("D\n");
}

int main()
{
    int32_t data;
    data = rand() % 4;

    switch (data) {
        case 0:
            FunctionA();
            break;
        case 1:
            FunctionB();
            break;
        case 2:
            FunctionC();
            break;
        case 3:
            FunctionD();
            break;
        default:
            break;
    }

    return 0;
}

함수포인터를 이용한 분기문 제거 코드

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define NO (0)
#define YES (!NO)

void FunctionA(void)
{
    printf("A\n");
}

void FunctionB(void)
{
    printf("B\n");
}

void FunctionC(void)
{
    printf("C\n");
}

void FunctionD(void)
{
    printf("D\n");
}

int main()
{
    int32_t data;
    data = rand() % 4;

    void(*pFunc[])(void) = {FunctionA, FunctionB, FunctionC, FunctionD};
    
    pFunc[data]();

    return 0;
}

통신으로 데이터를 수신하는 경우에 메시지에 따라서 실행되는 함수가 달라지게 되는데 이러한 경우에 "함수포인터를 이용하여 분기를 제거하는 코드"를 유용하게 사용할 수 있습니다. 메시지의 개수가 많기 때문에 코드가 복잡해지며 메시지가 추가되는 경우에 메시지에 해당하는 처리 함수를 구현하고 함수포인터에 추가만 해주면 되기 때문입니다.

 

이상 분기문 제거에 대한 설명을 마치도록 하겠습니다.

'프로그래밍' 카테고리의 다른 글

TCP/IP 패킷 수신(패킷 분리 및 합침)  (0) 2021.12.15
[c/c++] 프로세스 우선순위 변경  (0) 2021.12.10
[c언어] 스택(Stack)  (0) 2021.01.14
[c언어] 링크드리스트(Linked List)  (0) 2021.01.13
[c언어] 큐(Queue)  (0) 2021.01.01