본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

JavaScript switch — 커피 주문 완전 정리

by 왕진 2026. 7. 3.
반응형

 

 

Web Development · JavaScript

JavaScript switch 문 —
커피 주문으로 배우는 값 분기

if-else 여러 개 대신 switch 하나로 — case, break, fall-through, default 완전 정리
시작 오늘 분석할 코드

사용자가 prompt()로 커피 이름을 입력하면, switch 문이 그 값을 여러 case와 비교해서 가격을 정하는 코드다. 특히 espresso에스프레소 두 case가 break 없이 연달아 붙어서 같은 처리를 공유하는 부분이 이번 글의 핵심이다.

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>switch</title> </head> <body> <h3>switch 문으로 커피 주문</h3> <hr> <script> let price = 0; let coffee = prompt("무슨 커피 드릴까요?", ""); switch(coffee) { case "espresso" : case "에스프레소" : price = 2000; break; case "카푸치노" : price = 3000; break; case "카페라떼" : price = 3500; break; default : document.write(coffee + "는 없습니다."); } if(price != 0) document.write(coffee + "는 " + price + "원입니다."); </script> </body> </html>
실제 출력 미리보기

switch 문으로 커피 주문


prompt 창에 카페라떼 입력 → 확인 클릭

카페라떼는 3500원입니다.

용어 용어 정리
switch하나의 값을 여러 case와 비교해 분기하는 조건문
case비교할 값 하나를 지정하는 라벨 (콜론으로 끝남)
break현재 case 실행을 멈추고 switch 블록을 즉시 빠져나가는 명령
default어떤 case에도 걸리지 않았을 때 실행되는 기본 처리
fall-throughbreak가 없어 다음 case 코드로 실행이 흘러 내려가는 현상
prompt()사용자에게 입력을 받는 브라우저 내장 함수, 반환값은 항상 문자열
엄격 비교switch의 case 비교는 === 방식 — 값과 타입이 모두 같아야 매칭
document.write()문서에 즉시 문자열을 출력하는 함수

1 switch가 언제 유리한가
if-else를 여러 번 쓰는 것과 뭐가 다른가?

이 코드를 if-else로 쓰면 if(coffee == "espresso" || coffee == "에스프레소") {...} else if(coffee == "카푸치노") {...} else if(coffee == "카페라떼") {...} else {...} 처럼 비교 대상(coffee)을 매번 반복해서 써야 한다. switch는 "이 값(coffee)을 기준으로 비교한다"고 맨 위에서 한 번만 선언하고, 아래는 "그 값이 뭐면 어떻게" 라는 case만 나열하면 된다.

※ 하나의 변수를 여러 "고정된 값"과 비교할 때 — switch가 훨씬 읽기 쉽다. 반대로 범위 비교(가격 > 1000 등)가 필요하면 if-else를 써야 한다 (아래 6번 참고).

2 switch(coffee) — 무엇을 기준으로 비교하는가
괄호 안의 값이 "기준"이다

switch(coffee)는 "이제부터 coffee 변수의 값을 기준으로 아래 case들과 하나씩 비교하겠다"는 선언이다. 브라우저는 이 값을 들고 내려가면서 case 라벨에 적힌 값과 순서대로 맞춰본다. 일치하는 case를 찾으면 그 지점부터 코드를 실행한다.

switch(coffee) { case "espresso" : ... ← coffee === "espresso" 인지 확인 case "카푸치노" : ... ← coffee === "카푸치노" 인지 확인 ... }
검사 흐름을 그림으로 보면
coffee 값 확보
case 순서대로 비교
일치 지점부터 실행
break 만나면 종료

이 네 단계가 switch 전체의 동작 원리다. 이후 섹션들은 결국 이 네 단계 중 어디에서 무슨 일이 벌어지는지를 하나씩 뜯어보는 것이다.


3 case 라벨 — 콜론까지가 조건, 그 아래가 실행문
case는 if문의 조건 한 줄과 같은 위치다

case "카푸치노" : 에서 콜론(:) 앞은 "비교할 값"이고, 콜론 뒤에 오는 코드가 "일치했을 때 실행할 문장"이다. 즉 case 라벨 자체는 실행되는 코드가 아니라 이정표 역할만 한다. 실제 실행은 일치하는 이정표를 찾은 지점부터 아래로 순서대로 흘러간다.

※ 순서의 의미
  • switch는 case를 위에서부터 순서대로 검사한다
  • 일치하는 case를 찾으면 그 지점부터 실행 시작
  • break가 없으면 그 아래 case까지 계속 실행(다음 섹션)

 

반응형

 

4 브라우저가 switch를 실행하는 순서
"카푸치노"를 입력했을 때 실제로 무슨 일이 일어나는가

코드를 눈으로만 읽으면 헷갈리기 쉬우니, 사용자가 카푸치노를 입력했다고 가정하고 브라우저가 처리하는 순서를 단계별로 풀어보자.

1
prompt() 실행입력창에서 "카푸치노" 입력 → coffee 변수에 문자열로 저장
2
switch(coffee) 진입coffee 값 "카푸치노"를 들고 case를 위에서부터 검사 시작
3
case "espresso" 검사"카푸치노" !== "espresso" → 불일치, 다음 case로 이동
4
case "에스프레소" 검사불일치, 다음 case로 이동
5
case "카푸치노" 검사"카푸치노" === "카푸치노" → 일치! 이 지점부터 실행 시작
6
price = 3000 실행가격 변수에 3000 대입
7
break 만남switch 블록을 즉시 탈출 — 아래 카페라떼·default는 검사조차 안 함
8
if(price != 0) 확인price가 3000이라 조건 참 → "카푸치노는 3000원입니다." 출력
※ 핵심은 7번이다. break를 만나는 순간 그 아래 남은 case들은 검사조차 하지 않고 통째로 건너뛴다.

5 break가 없으면? — espresso와 에스프레소가 가격을 공유하는 원리
fall-through(흘러내림)를 의도적으로 이용한 경우

이 코드에서 가장 중요한 부분이다.

case "espresso" : case "에스프레소" : price = 2000; break;

case "espresso" : 라벨 바로 아래에는 실행문이 하나도 없다. 그래서 coffee가 "espresso"와 일치해도, 실행할 코드가 없으니 그대로 다음 줄(다음 case)로 흘러내려간다(fall-through). 다음 줄이 마침 case "에스프레소" :이고, 그 아래 price = 2000;이 있으니 결국 두 case 모두 같은 처리(2000원 책정)를 하게 되는 것이다.

※ 즉 "espresso"를 입력해도, "에스프레소"를 입력해도 결과는 똑같이 price = 2000. break가 없는 case는 "나는 실행문이 없으니 아래 case를 그대로 이어받겠다"는 뜻이다.

반대로 price = 2000; 다음에 오는 break;는 "여기서 끝, switch 밖으로 나가라"는 명령이다. break가 있기 때문에 카푸치노 case로 흘러가지 않고 switch 블록을 즉시 탈출한다.


6 default — 아무 case에도 안 걸렸을 때
default는 왜 맨 아래에 있는가?

default는 if-else의 마지막 else와 같은 역할이다. coffee 값이 "espresso", "에스프레소", "카푸치노", "카페라떼" 어느 것과도 일치하지 않으면 default 블록이 실행되어 coffee + "는 없습니다."를 출력한다.

※ default는 문법상 아무 위치에나 둘 수 있지만, "다른 case에 다 안 걸리면"이라는 의미를 코드 읽는 사람이 자연스럽게 이해하려면 관례적으로 맨 마지막에 둔다. 이 코드도 마지막에 두어 관례를 따르고 있다.

7 prompt() 입력값과 switch — 그리고 case가 못 하는 것
prompt는 항상 "문자열"을 돌려준다

prompt("무슨 커피 드릴까요?", "")는 사용자가 입력창에 무엇을 입력하든 문자열(string)로 coffee 변수에 저장한다. 그래서 case 값들도 "espresso", "카푸치노"처럼 전부 문자열로 맞춰져 있다. 만약 case에 숫자 2000처럼 다른 타입을 써두면 절대 일치하지 않는다(다음 섹션 참고).

또한 switch의 case는 정확히 같은 값 하나만 비교할 수 있다. "가격이 3000원 이상이면" 같은 범위 조건은 case에 쓸 수 없다 — 그런 경우는 if-else가 필요하다.

// 불가능한 예 switch(price) { case price >= 3000 : ... // ✗ 문법 오류에 가까움, 의도대로 동작 안 함 } // 범위 비교는 if로 if(price >= 3000) { ... }

8 switch는 === 엄격 비교를 쓴다
"2"와 2는 다른 값 취급

switch의 case 비교는 ==(느슨한 비교)가 아니라 ===(엄격 비교) 방식으로 동작한다. 즉 값뿐 아니라 타입까지 같아야 일치로 인정한다. 그래서 coffee가 문자열 "2000"이고 case가 숫자 2000이면 겉보기엔 같아 보여도 매칭되지 않는다.

일치 (문자열 vs 문자열)
coffee = "카푸치노"
case "카푸치노" → 매칭 ✓
불일치 (타입 다름)
coffee = "2000" (문자열)
case 2000 (숫자) → 매칭 ✗
※ prompt는 항상 문자열을 주기 때문에, 숫자를 비교하고 싶다면 Number(coffee)로 변환하거나 case 값도 문자열로 통일해야 한다.

9 자주 하는 실수
실수 증상 해결
case 안에 break 빠뜨림 의도치 않게 다음 case까지 전부 실행됨(fall-through) 공유 처리가 목적이 아니라면 각 case 끝에 break 추가
default를 중간에 둠 동작은 하지만 가독성 떨어짐 — "다 안 걸리면"이라는 의미가 헷갈림 관례대로 default는 맨 마지막에 배치
타입 다른 값 비교 ("2000" vs 2000) case가 절대 일치하지 않아 default로만 빠짐 prompt 결과는 문자열임을 기억, 필요하면 Number()로 변환
case에 범위 조건(>=, < 등) 시도 원하는 대로 동작하지 않음 범위 비교는 switch 대신 if-else 사용
default 안에 break 없이 그 뒤 코드 이어짐 큰 문제는 없지만(default가 보통 마지막) 헷갈릴 수 있음 다른 case 뒤에 default를 둘 땐 반드시 break로 마무리

핵심 한 줄 요약

switch한 변수를 여러 고정값과 비교할 때 if-else보다 간결
case비교할 값 하나 + 콜론, 일치하면 그 지점부터 실행
break 없음fall-through — 다음 case로 실행이 흘러내려감(espresso 예시)
break여기서 switch 종료, 밖으로 탈출
default모든 case 불일치 시 실행되는 기본 처리, 관례상 마지막
prompt()사용자 입력을 항상 문자열로 반환
엄격 비교switch의 case는 === 방식 — 값과 타입 모두 같아야 매칭

Tags

#JavaScript #switch #case #break #default #조건문 #분기 #fallthrough #fall-through #prompt #자바스크립트기초 #JS #엄격비교 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
JavaScript, switch, case, break, default, 조건문, 분기, fallthrough, fall-through, prompt, 자바스크립트기초, JS, 엄격비교, 웹개발, 티스토리
반응형

댓글