분기(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는 일반적으로 "넣는 것이 좋다"
'코드 분석' 카테고리의 다른 글
2025.06.30 팀 프로젝트 – 로그인/헤더 구조 정리 요약 (0) | 2025.06.30 |
---|---|
조건문 완전 마스터: if , else if , else 흐름 구조와 실전 예제까지 (0) | 2025.06.30 |
자바논리형 완전정복(boolean 완전 정복-boolean에서 if까지: 판단이 코드로 이어지는 철학과 구조): 비전공자부터 시니어까지 (3) | 2025.06.29 |
자바 논리형 완전 정복(boolean의 모든 것: 비전공자부터 시니어 개발자까지) (0) | 2025.06.28 |
자바 정수 자료형 완전 정복: long, BigInteger, Integer를 실무와 면접까지 통달하기 (0) | 2025.06.27 |