본문 바로가기
C 언어/실무

C언어 switch문 실무 사용법 (if문보다 switch문이 강력한 이유)

by Autosar 2026. 4. 21.
반응형

C언어를 처음 배울 때 가장 먼저 익히는 조건문은 if, else if, else이다.

특정 조건이 참인지 거짓인지 판단해서 동작을 나누는 방식이기 때문에 직관적이고 사용하기 쉽다.

 

하지만 실제 프로젝트에서는 단순히 참/거짓만 판단하는 코드보다,

특정 상태값이나 명령값에 따라 여러 동작 중 하나를 선택해야 하는 경우가 훨씬 많다.

 

하나의 변수 값에 따라 분기해야 하는 구조에서는 if문보다 switch문이 훨씬 읽기 쉽고 유지보수에 유리하다.

 

이번 글에서는 switch문의 기본 문법이 아니라,

실무에서 왜 switch문을 쓰는지 / 언제 쓰는지 / 어떻게 작성해야 좋은 코드가 되는지 중심으로 자세히 정리해보겠다.

 

1. if문만 계속 쓰면 코드가 왜 복잡해질까?

 

초보자 시절에는 대부분 아래처럼 코드를 작성한다.

if (mode == 0U)
{
    Stop();
}
else if (mode == 1U)
{
    Run();
}
else if (mode == 2U)
{
    Error();
}
else
{
    Default();
}

 

처음에는 전혀 문제 없어 보인다.

하지만 실제 프로젝트에서는 상태값이 3개가 아니라 10개, 20개, 많게는 수십 개까지 늘어난다.

 

그러면 아래 문제가 생긴다.

 

1) 가독성이 떨어진다.

조건이 길게 이어지면 어떤 값이 어떤 동작인지 한눈에 보기 어렵다.

else if (mode == 7)
else if (mode == 8)
else if (mode == 9)

 

이런 코드가 길게 이어지면 읽는 사람 입장에서 피로도가 커진다.

 

2) 수정할 때 실수하기 쉽다.

중간에 조건 하나를 추가하거나 순서를 바꾸는 과정에서 else if 위치를 잘못 넣는 실수가 자주 발생한다.

 

3) 상태 기반 구조가 명확하지 않다.

제어기 소프트웨어는 대부분 “현재 상태(State)” 중심으로 동작한다.

그런데 if문으로만 작성하면 상태 구조가 코드에서 잘 드러나지 않는다.

 

2. switch문은 무엇이 다른가?

 

switch문은 하나의 변수 값이 무엇인지 검사해서 해당 case로 이동하는 구조다.

 

즉,

 

mode가 0이면 여기 실행
mode가 1이면 여기 실행
mode가 2이면 여기 실행

 

처럼 값별 분기가 명확하게 드러난다.

 

기본 구조는 아래와 같다.

switch(변수)
{
    case 값1:
        실행문;
        break;

    case 값2:
        실행문;
        break;

    default:
        기본동작;
        break;
}

 

3. 같은 로직을 switch문으로 바꾸면?

 

아까 if문 코드를 switch문으로 바꾸면 아래처럼 된다.

switch(mode)
{
    case 0U:
        Stop();
        break;

    case 1U:
        Run();
        break;

    case 2U:
        Error();
        break;

    default:
        Default();
        break;
}

 

이 코드의 장점은 매우 명확하다.

각 값과 동작이 한 줄씩 정리되어 유지보수가 좋고, 추가/삭제도 쉬우며, 상태 구조가 눈에 잘 들어온다.

 

4. 실무에서 switch문을 가장 많이 쓰는 상황

 

4-1. 상태(State) 제어 로직

임베디드 시스템은 대부분 상태 머신 기반으로 동작한다.

예를 들어 전원 인가 후 시스템은 아래 순서로 움직일 수 있다.

 

- INIT (초기화)

- IDLE (대기)

- RUN (동작)

- ERROR (오류)

- SLEEP (절전)

 

이런 구조를 코드로 표현하면 switch문이 가장 자연스럽다.

switch(SystemState)
{
    case SYS_INIT:
        Init_Process();
        break;

    case SYS_IDLE:
        Idle_Process();
        break;

    case SYS_RUN:
        Run_Process();
        break;

    case SYS_ERROR:
        Error_Process();
        break;

    case SYS_SLEEP:
        Sleep_Process();
        break;

    default:
        break;
}

 

이 코드를 보면 현재 시스템이 상태 중심으로 설계되었다는 것이 바로 보인다.

4-2. 모터 제어 명령 처리

차량 제어기에서는 모더 제어 명령에 따라 처리한다.

예: Fold, Unfold, Stop, Reset

 

수신 데이터 값에 따라 동작을 나누는 구조이므로 switch문이 적합하다.

switch(MotorCmd)
{
    case CMD_FOLD:
        Mirror_Fold();
        break;

    case CMD_UNFOLD:
        Mirror_Unfold();
        break;

    case CMD_STOP:
        Mirror_Stop();
        break;

    case CMD_RESET:
        Mirror_Reset();
        break;

    default:
        break;
}

 

4-3. 진단 서비스 처리

UDS 진단에서도 서비스 ID에 따라 다른 함수가 실행된다.

 

대표적으로:

- 0x10 : Session Control
- 0x22 : Read Data By Identifier
- 0x2E : Write Data By Identifier
- 0x11 : ECU Reset

switch(ServiceId)
{
    case 0x10:
        DiagnosticSession();
        break;

    case 0x22:
        ReadDataByIdentifier();
        break;

    case 0x2E:
        WriteDataByIdentifier();
        break;

    case 0x11:
        ECU_Reset();
        break;

    default:
        NegativeResponse();
        break;
}

 

5. break를 왜 꼭 써야 하는가?

 

switch문에서 가장 많이 하는 실수가 break 누락이다.

switch(state)
{
    case 0U:
        Stop();

    case 1U:
        Run();
        break;
}

 

state가 0이어도 Stop() 함수를 실행하고, 다음 case로 계속 이동해서 Run() 함수를 실행하게 된다.

즉, 두 동작이 모두 실행된다. 이 현상을 fall-through라고 한다.

 

6. break 없이 일부러 쓰는 경우도 있다.

 

여러 case가 같은 동작을 해야 할 때 사용한다.

switch(key)
{
    case 'DRV':
    case 'AST':
        PrintA();
        break;
}

 

DRV, AST 일 경우 모두 같은 결과를 내게 할 수 있다.

 

7. if문과 switch문 선택 기준

 

if문이 더 좋은 경우


- 범위 비교

if (speed > 100)

 

- 복합 조건

if ((temp > 80) && (voltage < 10))

 

- 참/거짓 조건

if (flag == TRUE)

 


switch문이 더 좋은 경우

 

- 값 일치 비교

switch(mode)


- 상태 분기

switch(SystemState)


- 명령 코드 처리

switch(RxCmd)

 

 

정리

 

switch문은 아래 상황에서 가장 강력하다.

 

- 상태 머신
- ECU 제어 로직
- 모터 제어 명령 처리
- 진단 서비스 분기
- 모드 전환

 

그리고 실무에서는 반드시 아래 방식으로 사용하는 것이 좋다.

 

- enum과 함께 사용

- break 누락 주의

- default 작성

- case 내부는 짧게

- 긴 로직은 함수 분리

 

조건이 많아질수록 if문은 복잡해지고, switch문은 구조가 된다.

실무에서는 enum + switch 조합이 가장 많이 쓰인다.

반응형