08. switch vs if...else if...else

2025. 7. 2. 18:08·프로그래밍 언어/C

✅ 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
'프로그래밍 언어/C' 카테고리의 다른 글
  • 07. 공용체 (Union)
  • 06. 구조체 (Struct)
  • 05. 함수 포인터 (Function pointer)와 void 포인터
  • 04. 포인터와 문자열
coding-l7
coding-l7
  • coding-l7
    coding-l7rl0
    coding-l7
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기타
      • 유니티
        • OfficeWorkerRunning
      • 프로그래밍 언어
        • C
        • C#
        • C++
      • CS
        • 컴퓨터 구조
        • 운영체제
      • 물리 기반 시뮬레이션
        • 기초
        • Cloth Simulation
        • Fluid Simulation
      • 코딩 테스트
        • 프로그래머스
        • 백준
      • 독서
        • [ 뇌를 자극하는 윈도우즈 시스템 프로그래밍 ]
        • [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]
        • [ CUDA 기반 GPU 병렬 처리 프로그래밍 ]
      • 영어
        • Basic Grammar In Use
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
    • 포트폴리오
  • 공지사항

  • 인기 글

  • 태그

    입자 기반 방법
    fluid implicit particle
    그리드 기반 방법
    물리 기반 시뮬레이션
    cloth simulation
    screen-space rendering
    surface turbulence
    position based dynamics
    GLSL
    실수
    narrow range filter screen-space fluid rendering
    screen space fluid rendering
    명령어
    fluid simulation
    컴퓨터 구조
    wave simulation
    액체 시뮬레이션
    정수 승격
    Flip
    bilateral blur
    pbd
    collision
    OpenGL
    C언어
    jump table
    유체 시뮬레이션
    RAM
    시스템 프로그래밍
    파동 난류
    상수
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
coding-l7
08. switch vs if...else if...else
글쓰기
상단으로

티스토리툴바