코드 분석

switch문 완전 정복: if와는 무엇이 다를까?(5)

mynote6676 2025. 7. 1. 20:54

분기(branching)의 철학과 switch가 탄생한 진짜 이유

 

🧩1. 분기란 무엇인가?(복습 + 심화)

우리는 이전 글에서 if, else if, else를 통해

조건이 참인지 거짓인지에 따라 코드 흐름을 나누는 방식,

즉 **"분기( branching)"**를 배웠습니다.

하지만...분기가 늘 true/false만으로 끝나는 건 아니에요.

 

💥2. 문제가 생기기 시작한다 -- 조건이 많아질 때

예 : 사용자 메뉴 선택

int menu = 3;

if (menu == 1) {
    System.out.println("게임 시작");
} else if (menu == 2) {
    System.out.println("설정 열기");
} else if (menu == 3) {
    System.out.println("종료");
} else {
    System.out.println("잘못된 입력");
}

|   조건이 많아지니까 코드가 점점 지저분하고 복잡해지죠?

 

🧠 3. 여기서 탄생한 구조: switch문

✅ switch문 기본 구조

switch (menu) {
    case 1:
        System.out.println("게임 시작");
        break;
    case 2:
        System.out.println("설정 열기");
        break;
    case 3:
        System.out.println("종료");
        break;
    default:
        System.out.println("잘못된 입력");
}

- > 구조는 더 간단, 더 직관적, 더 일관성 있음

 

🔧4. switch문은 왜 생겼을까?(근본적 설계 철학)

✅ 이유 1: 성능 최적화

  • if-else if-else 는 조건을 위에서 아래로 하나하나 비교합니다.
  • 반면 switch값을 해시처럼 빠르게 찾아갈 수 있게 설계되었습니다. --->( 해시 란?)

| ** 컴파일 시 jump table(분기 테이블)** 최적화되는 경우도 많습니다.

 

✅이유 2: 명확한 비교 대상

  • if 는 다양한 조건 (비교, 범위, 복합 논리식 등)을 처리하지만
  • switch"정확히 일치"하는 값에만 반응합니다.

-> 즉 , swich선택지가 고정된 상황에 최적화된 분기 구조예요.

 

⚙️ 5. switch 문법 요소 완전 분석

키워드                                                             설명

switch(값) 분기 기준이 되는 값. int, String, enum 등이 가능
case 값: 해당 값일 때 실행할 코드
break 분기 종료. 없으면 아래 코드까지 실행됨
default: 아무 case에도 해당하지 않을 때 실행

 

6. 왜 break가 필요할까? (근본 기계 관점)

int number = 2;

switch (number) {
    case 1:
        System.out.println("One");
    case 2:
        System.out.println("Two");
    case 3:
        System.out.println("Three");
}

| 출력 결과 :

Two  
Three

이유: case2부터 진입한 후 break 없으면 계속 내려감 -> fall-through현상 --(?)

 

🧠컴퓨터 구조 관점(깊이 이해) -----> jump table이란 ? 알아보기 , 레이블이란?

  • switch는 내부적으로 jump table을 만들어 분기를 순차 검사 없이 빠르게 이동시켜요
  •  각 case는 **레이블(Lable)**로 처리되며, break는 jump 탈출 지점 역활을 합니다.

🧪 7. 실무 예시 

✔️ 예 : 요일 이름 출력

int day = 3;

switch (day) {
    case 1:
        System.out.println("월요일");
        break;
    case 2:
        System.out.println("화요일");
        break;
    case 3:
        System.out.println("수요일");
        break;
    default:
        System.out.println("알 수 없는 요일");
}

 

✔️ 예 : enum과 switch

enum UserRole {
    USER, ADMIN, MANAGER
}

UserRole role = UserRole.ADMIN;

switch (role) {
    case USER:
        System.out.println("일반 사용자");
        break;
    case ADMIN:
        System.out.println("관리자");
        break;
    case MANAGER:
        System.out.println("매니저");
        break;
}

 

🔄 8. if와 switch 비교 요약

항목                                            if                                                                         switch

조건 방식 논리식, 범위, 비교 가능 값이 정확히 일치할 때만 실행
가독성 조건이 많아지면 복잡함 선택지 형태로 정리됨
실행 구조 위에서 아래로 순차 비교 jump table 방식 (컴파일러 최적화)
활용 예시 로그인 검사, 범위 비교 메뉴 선택, enum 처리 등

 

📚 용어 정리

      용어                                                                                           설명

분기 (Branch) 실행 흐름이 조건에 따라 나뉘는 것
fall-through break 없이 다음 case까지 실행되는 현상
default 일치하는 case가 없을 때 실행되는 블록
jump table switch문에서 빠른 분기 처리를 위한 내부 테이블 구조

 

🎓 마무리 요약

  • if조건의 참/거짓 판단에 강점
  • switch값이 정해진 선택 상황에 강점
  • 두 구조 모두 "분기"를 위한 도구지만, 철학과 쓰임새가 다르다

| 조건이 복잡할 땐 if,

값에 따른 분기가 명확할 땐 switch!

 

추가 사항 필독 !!!!!

"default가 없으면 switch문은 어떻게 동작하느냐",
"예외(Exception)나 오류(Error)가 발생하는가?"
즉, switch의 본질적 실행 흐름과 안정성에 대한 질문

 

✅ 결론부터 말하면: 

❗ default를 생략해도 컴파일 오류나 예외는 발생하지 않습니다.

단지 ,일치하는 case가 없을 경우 아무 동작도 하지 않을 뿐이에요

 

🔍예시 코드

int menu = 5;

switch (menu) {
    case 1:
        System.out.println("게임 시작");
        break;
    case 2:
        System.out.println("설정 열기");
        break;
    case 3:
        System.out.println("종료");
        break;
}
  • 여기서 menu == 5 이기 때문에
  • case 1,2,3 어느 것도 일치하지 않음
  • 그런데 default도 없음

실행 결과 : 아무것도 출력되지 않음. 아무런 코드도 실행되지 않음

 

✅ 요약하면

항목                                                                                 default 없음 시 결과

일치하는 case 있음 해당 case 실행
일치하는 case 없음 아무 코드도 실행 안 됨 (조용히 넘어감)
오류 발생 여부 ❌ 오류 없음 (정상 컴파일됨)
예외 발생 여부 ❌ 예외 없음 (런타임 예외 없음)

💡 왜 그럴까? (switch문 내부 동작 관점)

  • switch는 내부적으로 값을 평가해서 해당 case로 jump합니다.
  • 해당 case가 없으면 -> jump할 곳이 없으므로 아무 일도 안 하고 종료
  • default는 말 그대로 **"그 외 나머지 전부"**에 대한 예외 처리 구조일 뿐, 필수 블록은 아닙니다.

👀 실무에서는 어떻게?

✅ default는 일반적으로 "넣는 것이 좋다"

728x90