1. 소개
상황을 상상해 봅시다. 당신은 카페용 프로그램을 작성하고 있습니다. 사용자가 음료를 선택하면 그 선택에 따라 반응해야 합니다. 물론 if-else if-else를 잔뜩 사용할 수도 있지만, 보기가 썩 좋진 않죠:
if (choice == 1)
{
System.out.println("에스프레소를 선택하셨습니다.");
}
else if (choice == 2)
{
System.out.println("카푸치노를 선택하셨습니다.");
}
else if (choice == 3)
{
System.out.println("라떼를 선택하셨습니다.");
}
else
{
System.out.println("해당하는 음료가 없습니다.");
}
동의하신다면, 이것은 너무 장황합니다. 선택지가 10개나 20개라면 어떨까요? 이럴 때 switch 문이 도움을 줍니다. 변수의 값에 따라 많은 선택지 중 하나를 우아하고 간결하게 처리할 수 있게 해줍니다.
클래식 switch의 문법
switch의 Java 문법은 다음과 같습니다:
switch (vyrazhenie)
{
case znachenie1:
// 표현식이 znachenie1과 같다면 수행할 동작
break;
case znachenie2:
// 표현식이 znachenie2와 같다면 수행할 동작
break;
...
default:
// 어떤 case와도 일치하지 않으면 수행할 동작
break;
}
switch 문법
핵심 요소:
- switch (표현식) — 표현식의 결과를 각 case와 비교합니다.
- case 값: — 표현식과 비교될 분기 값입니다.
- break; — switch 블록의 실행을 종료합니다(없으면 다음 case로 “폴스루”).
- default: — 어떤 case와도 일치하지 않을 때 실행됩니다.
2. switch 사용 예시
예제 1: 정석 — 음료 선택
카페 메뉴를 구현해 봅시다:
import java.util.Scanner;
public class CoffeeShop
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("음료를 선택하세요:");
System.out.println("1 - 에스프레소");
System.out.println("2 - 카푸치노");
System.out.println("3 - 라떼");
int choice = console.nextInt();
switch (choice)
{
case 1:
System.out.println("에스프레소를 선택하셨습니다.");
break;
case 2:
System.out.println("카푸치노를 선택하셨습니다.");
break;
case 3:
System.out.println("라떼를 선택하셨습니다.");
break;
default:
System.out.println("해당하는 음료가 없습니다.");
break;
}
}
}
무슨 일이 일어나나요:
- 사용자가 음료 번호를 입력합니다.
- choice 변수의 값이 각 case와 비교됩니다.
- 일치하면 해당 블록이 실행되고, 이어서 break가 switch 실행을 종료합니다.
- 어느 것과도 일치하지 않으면 default가 실행됩니다.
예제 2: 문자열로 전환하기
switch에서 사용할 수 있는 타입은 많지 않지만, 문자열은 가능합니다! 명령형 메뉴에 유용합니다:
import java.util.Scanner;
public class CommandMenu
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("명령을 입력하세요 (start, stop, pause):");
String command = console.nextLine();
switch (command)
{
case "start":
System.out.println("프로그램을 시작합니다!");
break;
case "stop":
System.out.println("프로그램을 중지합니다.");
break;
case "pause":
System.out.println("일시 정지.");
break;
default:
System.out.println("알 수 없는 명령입니다.");
break;
}
}
}
주의: switch에서의 문자열 비교는 대소문자를 구분합니다! "Start"와 "start"는 서로 다른 문자열입니다.
3. 클래식 switch가 지원하는 타입은?
클래식 switch에서는 다음 타입만 사용할 수 있습니다:
- 원시 정수형: byte, short, char, int
- 열거형: enum (자세한 내용은 다음 강의에서 다룹니다)
- 문자열: String — 대소문자를 구분하여 비교
사용할 수 없음: boolean, float, double, 배열, 임의의 클래스 객체(enum과 String 제외).
char 예제
char grade = 'B';
switch (grade)
{
case 'A':
System.out.println("매우 좋음!");
break;
case 'B':
System.out.println("좋음.");
break;
case 'C':
System.out.println("보통.");
break;
default:
System.out.println("다시 시도하세요.");
break;
}
4. break의 필수성: 잊으면 어떻게 될까?
초보자의 가장 흔한 실수 — break;를 빼먹는 것입니다. 무엇이 일어나는지 살펴봅시다:
int day = 2;
switch (day)
{
case 1:
System.out.println("월요일");
break;
case 2:
System.out.println("화요일");
case 3:
System.out.println("수요일");
break;
default:
System.out.println("알 수 없는 요일");
break;
}
결과:
화요일
수요일
왜일까요? case 2 뒤에 break가 없기 때문에 실행이 다음 case로 “폴스루”되기 때문입니다(이를 fall-through라고 합니다). 때로는 유용하지만, 대부분의 경우엔 실수입니다.
5. case 묶기: 여러 값이 동일하게 동작할 때
여러 값에 대해 동일한 동작이 필요하다면, 값을 연달아 나열할 수 있습니다:
int month = 1;
switch (month)
{
case 12:
case 1:
case 2:
System.out.println("겨울");
break;
case 3:
case 4:
case 5:
System.out.println("봄");
break;
case 6:
case 7:
case 8:
System.out.println("여름");
break;
case 9:
case 10:
case 11:
System.out.println("가을");
break;
default:
System.out.println("알 수 없는 월");
break;
}
설명: month가 12, 1, 2 중 하나라면 프로그램은 "겨울"을 출력합니다.
6. 비교: switch vs if-else
| 시나리오 | if-else | switch |
|---|---|---|
| 선택지가 많음 | 긴 체인으로 가독성 떨어짐 | 간결하며 모든 선택지가 한눈에 보임 |
| 범위 비교 | 사용 가능 (if (x > 5 && x < 10)) | 불가, 특정 값만 가능 |
| 지원 타입 | 제한 없음 | 일부만 (위 참조) |
| break 관련 함정 | 아니오 | 예, 반드시 break를 확인해야 함 |
7. switch 사용 시 흔한 실수
오류 1: break를 잊음
가장 흔한 버그의 원인입니다. break를 빼먹으면 기대하지 않은 case까지 코드가 실행됩니다.
오류 2: 지원되지 않는 타입 사용
double, float, boolean을 사용하려 하면 컴파일러가 “불가”라고 합니다.
오류 3: 대소문자가 다른 문자열
사용자가 "Start"를 입력했는데, 여러분은 "start"를 기대했다면 switch는 동작하지 않습니다. 미리 문자열을 한 가지 케이스로 맞추는 것이 좋습니다:
switch (command.toLowerCase())
{
case "start":
// ...
}
오류 4: case에 변수를 사용함 (상수만 가능)
case에서는 상수만 허용됩니다. 변수를 사용하면 컴파일 오류가 발생합니다.
오류 5: 중복된 case
동일한 값의 case가 두 개 이상이면 컴파일 오류가 발생합니다.
GO TO FULL VERSION