저번엔 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와 중괄호의 조합이다.

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

에러를 회피할 수 있다.
많이 사용하지는 않는데, 가끔 아쉬울때가 있더라고..
4. 특정 컴파일러에서만 가능한 switch-case
이게 무슨 헛소린가 싶을꺼다.
혹시 다른 언어를 활용해 봤는가?
다른 언어에도 switch-case문이 존재하는데 참 부러웠던 것 중 하나가
switch(var)
{
case 1 ... 4: // 이런식으로 범위 지정이 가능함
break;
}
이런 식으로 범위 지정이 가능한 switch-case였다.
C에선 영영 못 볼줄 알았던 이 문법이 gcc계열 compiler에선 지원을 한다.

이런식으로 "연속적인 범위에 한정해서" 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 |