switch(비교대상변수){
case ... :
statement
break;
case ... ;
statement
break;
default: // 필수는 아님
statement
}
비교대상변수가 case 조건에 일치하면 해당 절의 로직이 실행됩니다.
비교대상변수가 일치하는 case 조건이 없으면 아무일도 일어나지 않습니다.
=> default 절이 명시되어 있으면 일치하는 조건이 없을때 default 절이 실행됩니다.
fall through : case 문 내에 break를 명시하지 않으면 해당 case 이후 case들은 조건비교 없이 항상 실행됩니다.
=> 이후 case 중 break가 명시되어있는 것이 있으면 switch문을 빠져나옵니다.
public class ExtandSwitchTest {
public static void main(String[] args){
ExtandSwitchTest extandSwitchTest = new ExtandSwitchTest();
System.out.println("input age : 20");
extandSwitchTest.traditionalSwitch(20); // case 20: 절에 break가 없으므로 case 10: 절도 실행됨
System.out.println("input age : 10");
extandSwitchTest.traditionalSwitch(10); // break절이 있으므로 switch문을 빠져나옴.
// => if(age==20 || age == 10) 과 같은 논리가 됨
System.out.println("input age : 17");
extandSwitchTest.traditionalSwitch(17); // case 조건에 해당하지 않는 값이므로 default로 빠짐
System.out.println();
System.out.println("input name : jerry");
extandSwitchTest.stringSwitch("jerry"); //java 7부터는 String로 비교대상변수로 사용 가능
}
public void traditionalSwitch(int age){
switch (age){
case 30:
System.out.println("age : 30");
break;
case 20:
System.out.println("age : 20");
// break;
case 10:
System.out.println("age : 10");
break;
case 5:
System.out.println("age : 5");
break;
default:
System.out.println("age : default");
}
}
public void stringSwitch(String name){
switch (name){
case "kim":
System.out.println("name : kim");
break;
case "lee":
System.out.println("name : lee");
break;
default:
System.out.println("not fount");
}
}
}
[output]
input age : 20
age : 20
age : 10
input age : 10
age : 10
input age : 17
age : defaultinput name : jerry
not fount
java 12 : JEP - 325 (Preview)
조건절에 복수개의 값 사용 가능
화살표 표현식 이용 가능 : no fall throught
case ... -> labels
=> 기존 swtich문과 달리 case에 해당하는 절만 실행되고, 그 이후 case들은 실행되지 않음
break 키워드를 이용하여 값 리턴 가능
화살표 표현식을 이용하여 값 리턴 가능
=> 화살표 표현식 사용할 경우, 값 리턴 전에 다른 처리를 하려면 블록으로 코드를 묶고 break로 마지막에 리턴
=> 블록의 중간에서 break로 리턴하면
java 13 : JEP - 354 (Second Preview)
break 키워드로 리턴하는 대신 yield 사용 (java 13에서는 break 사용하면 컴파일 오류)
// jdk 16 기반으로 테스트
public class ExtandSwitchTest {
public static void main(String[] args){
ExtandSwitchTest extandSwitchTest = new ExtandSwitchTest();
System.out.println("---- without result test ---");
System.out.println("input name : kim");
extandSwitchTest.arrowSwitchWithoutResult("kim"); // 기존 switch문과 달리 조건에 해당하는 구문만 실행
System.out.println("input name : jerry");
extandSwitchTest.arrowSwitchWithoutResult("jerry"); // 기존 switch문과 달리 조건에 해당하는 구문만 실행
System.out.println("---- with result test ---");
System.out.println("input name : lee");
extandSwitchTest.arrowSwitchWithResult("lee");
System.out.println("input name : jerry");
extandSwitchTest.arrowSwitchWithResult("jerry");
System.out.println("input name : lucy");
extandSwitchTest.arrowSwitchWithResult("lucy");
}
public void arrowSwitchWithoutResult(String name){
switch (name){
case "kim" -> System.out.println("name : kim");
case "lee" -> System.out.println("name : lee");
case "jerry" -> {
System.out.println("before yield");
// yield 0; // 리턴 받지 않는 경우는 yield 사용하지 않
}
default -> System.out.println("not fount");
}
}
public void arrowSwitchWithResult(String name){
String result= switch (name){
case "kim" -> "called kim";
case "lee" -> "called lee";
case "jerry" -> {
System.out.println("before yield jerry");
yield "jerry";
}
case "lucy" ->{
System.out.println("before yield lucy");
yield "lucy";
// System.out.println("after yield lucy"); // unreachable statement. yield 이후에 statement가 있으면 컴파일 오류
}
default -> "not found";
};
System.out.println("result : "+result);
}
}
[output]
---- without result test ---
input name : kim
name : kim
input name : jerry
before yield
---- with result test ---
input name : lee
result : called lee
input name : jerry
before yield jerry
result : jerry
input name : lucy
before yield lucy
result : lucy
[참고]
openjdk
[mkyoung.com - switch expression](