자바(Java) 강의

3. 자바 조건문 (2) switch-case

삐멜 2020. 3. 16. 14:03

Switch case는 조건에 따라 코드를 실행한다는 점에 있어서 if-else와 매우 유사하다. 만약 if-else를 모른다면 if-else를 먼저 학습한 후 switch-case를 공부하는 것을 추천한다.

예상 독자

목표

  • 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

switch-case는 enum과 함께 자주 이용된다. 아래의 예제는 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");
}
}

}

이 포스트에서는 자바의 조건문 중 하나인 switch-case를 알아보았다. 다음 포스트에서는 배열과 반복문에 대해 설명하도록 한다.