3. 자바 조건문 (2) switch-case
Switch case는 조건에 따라 코드를 실행한다는 점에 있어서 if-else와 매우 유사하다. 만약 if-else를 모른다면 if-else를 먼저 학습한 후 switch-case를 공부하는 것을 추천한다.
예상 독자
- 자바를 배우고 싶은 누구나
- JDK와 IDE를 설치한 자바 학습자. ( 1. 자바 설치 및 개발환경 설정 )
- char를 공부한 자바 학습자. ( 2. 자바 변수와 자료형 (1) char )
- boolean을 공부한 자바 학습자. ( 2. 자바 변수와 자료형 (2) boolean )
- byte, short, int, long을 공부한 자바 학습자. ( 2. 자바 변수와 자료형 (3) byte, short, int, long )
- float과 double을 공부한 자바 학습자. ( 2. 자바 변수와 자료형 (4) float, double )
- if-else를 공부한 자바 학습자. ( 3. 자바 조건문 (1) if-else )
목표
- Switch Case 기본
- Default case
- 한 Case 문만 실행 시키는 방법
- enum을 이용한 switch-case
Switch Case 기본
Switch-Case문은 어떻게 생겼는지 아래의 예제를 통해 알아보자.
public class Main {
public static void main(String args[]) {
String str = "Hello";
switch (str) {
case "Hello":
System.out.println("Case1 : Hello");
}
}
}
위 예제에서 switch는 str을 검사한다. (str == case에 걸린 값)가 참이라면 해당 케이스부터 switch의 끝까지 실행한다.
switch (variable) {
case condition: { // case 블록 }
}
- variable == condition인 경우 매칭되는 case블록 부터 스위치 블록의 끝까지 실행한다.
- condition에는 constant값만 들어갈 수 있으며 논리식(>,<,==)은 지원되지 않는다.
- variable과 condition의 자료형은 같아야 한다.
- char, byte, short, int, Character, Byte, Short, Integer, String, enum 자료형만 사용할 수 있다.
스위치 블록의 끝까지 실행한다는 것은 무슨 뜻인가? 아래의 switch-case문을 실행시켜보자.
public class Main {
public static void main(String args[]) {
String str = "Hello";
switch (str) {
case "Hi":
System.out.println("Case0 : Hi");
case "Hello":
System.out.println("Case1 : Hello");
case "World":
System.out.println("Case2 : World");
}
}
}
그 결과는 다음과 같다.
Case1 : Hello
Case2 : World
Hello 뿐만 아니라 World까지 출력되었다! Hi는 str과 다르니 출력되지 않았다고 하지만 World는 왜 출력되었을까? Switch-case는 case에 해당하는 블록만 실행하는게 아니라, 참인 case 아래로 전부 실행한다.
switch-case의 이러한 특성이 if-elseif-else와 가장 큰 차이점이라 할 수 있다.
Default Case
default case는 항상 참인 케이스이다. switch에 들어오는 변수가 무엇이 되었든 default case는 항상 실행된다. 그래서 사람들이 모든 케이스에 해당되지 않을 경우 실행시키기 위해 많이 사용한다.
public class Main {
public static void main(String args[]) {
String str = "-";
switch (str) {
case "Hi":
System.out.println("Case0 : Hi");
case "Hello":
System.out.println("Case1 : Hello");
case "World":
System.out.println("Case2 : World");
default:
System.out.println("Default Case");
}
}
}
// 실행 결과
//Default Case
다만 주의할 점은 위에서 말했듯이 default case는 항상 참인 케이스일 뿐이며 동작 원리는 다른 case와 동일하다는 점이다. 예를들어 default를 case문의 맨 위에 놓으면 아래와 같은 결과를 확인 할 수 있다.
public class Main {
public static void main(String args[]) {
String str = "-";
switch (str) {
default:
System.out.println("Default Case");
case "Hi":
System.out.println("Case0 : Hi");
case "Hello":
System.out.println("Case1 : Hello");
case "World":
System.out.println("Case2 : World");
}
}
}
결과
Default Case
Case0 : Hi
Case1 : Hello
Case2 : World
결과가 왜 이렇게 나왔을까 한번 생각 해 보도록 하자. 위에서 switch 변수 == case 값이 참이라면 해당 케이스부터 switch문 끝까지 실행시킨다고 설명했다. default 케이스는 항상 참이므로 default 케이스부터 아래까지 전부 실행시킨 것이다.
한 Case문만 실행시키는 방법
Break
한 케이스만 실행시키고 싶다면 break문을 사용해 case를 빠져나오는 방법을 사용할 수 있다.
public class Main {
public static void main(String args[]) {
String str = "Hello";
switch (str) {
case "Hi":
System.out.println("Case0 : Hi");
break;
case "Hello":
System.out.println("Case1 : Hello");
break;
case "World":
System.out.println("Case2 : World");
break;
default:
System.out.println("Default Case");
}
}
}
//결과
Case1 : Hello
break문을 사용하면 case에 해당하는 블록을 실행시킨 후 switch문을 빠져나온다.
return
switch-case문 실행 후 해당 매서드 내에서 더 실행 할 것이 없다면 메서드를 바로 return하는 방법도 있다.
public class Main {
public static void main(String args[]) {
String str = "Hello";
switch (str) {
case "Hi":
System.out.println("Case0 : Hi");
return;
case "Hello":
System.out.println("Case1 : Hello");
return;
case "World":
System.out.println("Case2 : World");
return;
default:
System.out.println("Default Case");
}
}
}
Enum을 이용한 switch-case
public class Main {
public enum Greeting { HI, HELLO, WORLD };
public static void main(String args[]) {
Greeting greeting = Greeting.HELLO;
switch (greeting) {
case HI:
System.out.println("Case0 : Hi");
break;
case HELLO:
System.out.println("Case1 : Hello");
break;
case WORLD:
System.out.println("Case2 : World");
break;
default:
System.out.println("Default Case");
}
}
}