C언어 이야기

C언어 - 조건문(3)

개발자 월하광인 2025. 7. 9. 00:00

저번엔 if에 관하여 이야기를 하였다면,

이번엔 switch-case문으로 이야기를 해 보려 한다.


1. 기본적인 사용법

기본적으로 사용하는 방법은 아래와 같다.

switch(상태를 보고자 하는 변수)
{
case 상태1:
상태1에 대한 실행
break;
case 상태2:
상태2에 대한 실행
break;
case 상태3:
상태3에 대한 실행
break;
...
default:
그 외의 상태에 대한 실행
break;
}

상태를 보고자 하는 변수를 입력해서 "해당 값이 case와 일치"하면 case아래의 문장들을 실행하게 된다.

그래서 이러한 특성 때문에 원칙적으론 한 가지의 상태만을 가지고 실행하게 된다.

2. case와 break의 관계

case와 break는 세트메뉴와 같다.

case와 일치하더라도 break가 없으면 break를 만날 때 까지

아래 문장""을 실행시킨다.

그래서 아래 코드와 같이 씽크빅 터지는 코드들도 은근 볼 수 있다.

switch(var)
{
case 0:
0일 때 실행할 내용
break;
case 1:
1일 때 실행할 내용
case 2:
2일 때 실행할 내용 // 2일때는 이 line만 실행하고, 1일 땐 1과 2를 다 실행한다.
break;
}

3. switch-case와 중괄호의 결합

보통 switch아래의 전체를 감싸는 중괄호를 생각할 수 있는데,

이 부분에서는 case 아래에 대한 중괄호를 이야기 하려고 한다.

case 아래에 중괄호는 실행 구분을 위한 block을 나누는 역할도 있긴 하지만,

case 내부에 변수를 선언할 때, 그 case안에서만 유효하도록 도와주는게

case와 중괄호의 조합이다.

중괄호를 사용하지 않고 case 밑에 변수를 선언하면 redefinition of 변수 라는 에러를 출력한다.

위와 같은 코드를 중괄호로 감싸게 되면

에러를 회피할 수 있다.

많이 사용하지는 않는데, 가끔 아쉬울때가 있더라고..

4. 특정 컴파일러에서만 가능한 switch-case

이게 무슨 헛소린가 싶을꺼다.

혹시 다른 언어를 활용해 봤는가?

다른 언어에도 switch-case문이 존재하는데 참 부러웠던 것 중 하나가

switch(var)
{
case 1 ... 4: // 이런식으로 범위 지정이 가능함
break;
}

이런 식으로 범위 지정이 가능한 switch-case였다.

C에선 영영 못 볼줄 알았던 이 문법이 gcc계열 compiler에선 지원을 한다.

실제로 회사서 사용하는 switch-case

이런식으로 "연속적인 범위에 한정해서" case를 만들어 사용할 수 있다.

사용방법은 간단하다.

case 상태시작 ... 상태끝:
내용물
break;

이렇게 구현하면 되는데, 조심해야 할 점은

 

상태시작과 ... 사이에 공백 하나가 필요하고

...과 상태끝 사이에 공백 하나가 필요하단 것만 기억하고 활용하면 된다.

 

그리고 이것을 지원하는 gcc version도 따로 있는데,

반드시 C11 이상에서만 사용해야 한다는 점 유의하도록 하자.

 

이 문법은 표준 C에서는 한참 벗어난 문법이다. 하지만 요즘 임베디드계에선 대부분이

gcc를 사용하고 있기 때문에 유용할 것이라 생각하고 공유한다.

(시험에서 이거 된다고 정답 쓰지 마라.)

5. 그래서 if와 동작은 같은거 아냐?

이 글을 작성하는 내내 이것을 말하고 싶었다.

정말 같을까?

일단 답부터 이야기를 하면,

"아니오. 둘의 실행 메커니즘이 다르다"

이다.

먼저 if를 상태확인으로 코드를 구현하면 아래와 같다.

if(var == 0)
{
}
else if(var == 1)
{
}
else if(var == 3)
{
}
else
{
}

if의 첫 조건이 "거짓"이라면 그 다음 else if에서 "다른 값과 비교 후 참 거짓을 판단"한다.

언제까지? 이 조건문의 구문이 끝날 때 까지다.

즉 계속 반복해서 비교후 참/거짓을 판단하는 것이 if문이라면

switch-case는 "상태확인후 해당 라벨로 점프"라는 것이다.

한번의 비교만으로 원하는 라인으로 이동 후 실행을 한다는 것이다.

이러한 특성때문에 최적화와 관련한 고민을 하게 되면

가장 고구마 같은 부분이 if로 상태구문을 만드는 코드들이다.

그래서 이것에 꽂혀서 이것 저것 실험해 본 많은 분들이 이런 짓까지 해서 분석한 결과이다.

https://justdoprogram.blogspot.com/2021/12/if-vs-switch-performance-comparision.html

 

if vs switch, 성능 / 메모리 사용량 비교

 

justdoprogram.blogspot.com

으음...

티스토리 블로거중에 ns까지 측정해서 

if-else구문 4개 이상 쓸 꺼면 switch-case로 전환하라는 결론까지 내린

블로거가 있었는데 지금은 못 찾겠네...

엄청 옛날 블로거였는데

 

여튼 이러한 성능 차이가 있으니 꼭 자신만의 원칙을 잡아서

if와 switch를 적절히 안배하도록 하자.

6. 그리고 더 이야기 하고 싶었던거...

사실 switch-case의 활용은 정말 다양하다.

나만 하더라도 상태머신을 만드는데, 특정 조건을 만족하지 못하면

(거의 대부분은 flash의 prefetch기능 유무다...)

함수포인터 대신 switch-case로 만드니 말이다..

이거 얘기하려면 포인터를 이야기해야 되서 뒤로 미루고

아쉬움 한 스푼을 담아 적는다.

'C언어 이야기' 카테고리의 다른 글

C언어 - 반복문, while과 do-while  (4) 2025.07.23
C언어 - 반복문, for  (1) 2025.07.16
C언어 - 조건문(2)  (0) 2025.07.02
C언어 - 조건문(1)  (0) 2025.06.25
C언어 - 연산자  (1) 2025.06.18