✅ if...else if...else 문
if (x == 1) { ... }
else if (x == 2) { ... }
else if (x == 3) { ... }
else { ... }
- 조건을 위에서부터 순차적으로 검사
- 조건이 많을수록 하위 조건일수록 속도가 느려질 수 있음
- 조건이 다양하거나 부등호, 논리 연산 등 복잡할 때 사용
✅ switch 문
switch (x) {
case 1: ...; break;
case 2: ...; break;
case 3: ...; break;
default: ...;
}
- x의 값이 일치하는 case로 즉시 분기
- 조건이 정수형 상수이고 간단할 때 if보다 더 빠를 수 있음
- 컴파일러가 상황에 따라 다양한 방식으로 최적화
⚙️ switch 최적화 방식
컴파일러는 case 값의 개수와 분포에 따라 다음 중 하나로 최적화한다:
1. if-else 변환 (Linear Search)
- case 수가 적거나 값이 퍼져 있을 경우
- 성능: O(n)
2. 이진 탐색 트리 (Binary Search Tree)
- case 수가 많고 값이 일정 부분 정렬되어 있을 경우
- 성능: O(log n)
3. Jump Table ← 가장 빠름!
- case 값이 연속된 정수 범위일 경우
- 배열 인덱스처럼 빠르게 분기
- 성능: O(1)
📌 Jump Table이란?
case 값들이 연속된 정수일 때, 컴파일러가 각 case에 대한 분기 주소를 배열처럼 만들어두고,
변수 값을 인덱스처럼 사용해 분기하는 방식
✅ 예시
switch (x) {
case 0: func0(); break;
case 1: func1(); break;
case 2: func2(); break;
}
→ 컴파일러가 내부적으로 다음과 같이 처리 가능:
void (*table[3])() = { func0, func1, func2 };
table[x](); // x가 0~2일 때 유효
✅ 조건 검사 없이 바로 jump! → 매우 빠름
✅ 성능 비교 요약
구분 | if...else | switch (기본) | switch (Jump Table) |
조건 수 적을 때 | 빠름 | 거의 동일 | 거의 동일 |
조건 수 많을 때 | 느려짐 | 더 나음 | 가장 빠름 |
분기 방식 | 순차 검사 | 다양한 최적화 | 배열 인덱스처럼 분기 |
조건 종류 | 자유로움 (논리/비교 가능) | 정수 상수만 가능 | 정수 + 연속된 값일 때 |
✅ 언제 switch가 유리할까?
조건 | switch 추천 여부 |
case 값이 정수형 상수 | ✅ 가능 |
case 값이 연속된 정수 | ✅ Jump Table로 최적화됨 |
case가 많고 간단한 조건 | ✅ if보다 효율적 |
조건이 논리적/복합적 (ex. x > 10 && x < 20) | ❌ if 사용해야 함 |
✅ 실제 코드 비교
// if문: 순차 조건 비교
if (x == 0) func0();
else if (x == 1) func1();
else if (x == 2) func2();
// switch문: Jump Table 가능성
switch (x) {
case 0: func0(); break;
case 1: func1(); break;
case 2: func2(); break;
}
✅ 마무리 요약
항목 | 설명 |
if...else | 조건이 복잡하거나 다양한 경우 적합 |
switch | 조건이 정수 상수일 때 빠르게 최적화 가능 |
Jump Table | switch에서 case 값이 연속된 정수일 때 등장하는 O(1) 분기 방식 |
💡 실제로 어떤 방식으로 최적화되는지는 컴파일러가 판단하며, 컴파일 옵션, case의 개수/범위 등에 따라 다르다.
따라서, 성능이 중요한 코드에서는 switch를 의도적으로 Jump Table이 생성되도록 설계하는 것도 좋은 전략이다.
'프로그래밍 언어 > C' 카테고리의 다른 글
07. 공용체 (Union) (0) | 2025.07.01 |
---|---|
06. 구조체 (Struct) (0) | 2025.06.30 |
05. 함수 포인터 (Function pointer)와 void 포인터 (0) | 2025.06.27 |
04. 포인터와 문자열 (2) | 2025.06.26 |
03. 자료형 변환 (Type casting) (0) | 2025.06.24 |