스위치 명령문을 사용하여 프로그램 흐름 제어하기
switch 문은 Java 언어에서 사용할 수 있는 5가지 제어 흐름 명령문 중 하나입니다. 이 문은 실행 경로를 얼마든지 지정할 수 있습니다. switch` 명령문은 선택자 변수를 인수로 받고 이 변수 값을 사용하여 실행할 경로를 선택합니다.
선택자 변수의 타입은 다음 타입 중에서 선택해야 합니다:
byte,short,char,int원시 데이터 타입Character,Byte,Short,Integerwrapper 타입- 열거형(Enum) 타입
String타입을 지원합니다.
다음 기본 유형은 선택기 변수의 타입에 사용할 수 없다는 점에 유의할 필요가 있습니다: boolean, long, float 및 double.
switch 문의 첫 번째 예를 살펴보겠습니다.
int quarter = ...; // any value
String quarterLabel = null;
switch (quarter) {
case 0: quarterLabel = "Q1 - Winter";
break;
case 1: quarterLabel = "Q2 - Spring";
break;
case 2: quarterLabel = "Q3 - Summer";
break;
case 3: quarterLabel = "Q3 - Summer";
break;
default: quarterLabel = "Unknown quarter";
};switch 문의 본문을 switch 블록이라고 합니다. switch 블록의 문은 하나 이상의 case 또는 default 레이블로 레이블을 지정할 수 있습니다. switch 문은 해당 표현식을 평가한 다음 일치하는 case 레이블 뒤에 오는 모든 문을 실행합니다.
break 키워드가 사용된 것을 보셨을 것입니다. 각 break 문은 둘러싸고 있는 switch 문을 종료합니다. 제어 흐름은 switch 블록 뒤에 오는 첫 번째 명령문으로 계속됩니다. break 문이 없으면 switch 블록의 명령문이 통과하기 때문에break 문은 필수입니다. 일치하는 case 레이블 뒤의 모든 명령문은 break 문이 발생할 때까지 후속 case 레이블의 표현에 관계없이 순차적으로 실행됩니다.
다음 코드는 futureMonths 목록을 채우기 위해 fall through(통과)를 사용합니다.
int month = 8;
List<String> futureMonths = new ArrayList<>();
switch (month) {
case 1: futureMonths.add("January");
case 2: futureMonths.add("February");
case 3: futureMonths.add("March");
case 4: futureMonths.add("April");
case 5: futureMonths.add("May");
case 6: futureMonths.add("June");
case 7: futureMonths.add("July");
case 8: futureMonths.add("August");
case 9: futureMonths.add("September");
case 10: futureMonths.add("October");
case 11: futureMonths.add("November");
case 12: futureMonths.add("December");
break;
default: break;
}기술적으로 마지막 break는 switch 문에서 흐름이 빠져나가므로 필요하지 않습니다. 코드를 더 쉽게 수정하고 오류를 줄이기 위해 break를 사용하는 것이 좋습니다.
default 섹션은 case 섹션 중 하나에서 명시적으로 처리되지 않는 모든 값을 처리합니다.
다음 코드 예제는 명령문에 여러 개의 case 레이블을 가질 수 있는 방법을 보여줍니다. 이 코드 예제는 특정 월의 일 수를 계산합니다:
int month = 2;
int year = 2021;
int numDays = 0;
switch (month) {
case 1: case 3: case 5: // January March May
case 7: case 8: case 10: // July August October
case 12:
numDays = 31;
break;
case 4: case 6: // April June
case 9: case 11: // September November
numDays = 30;
break;
case 2: // February
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}이 코드에는 두 개 이상의 case에 대해 하나의 명령문이 있습니다.
switch 명령문과 if-then-else 문 중 선택하기
if-then-else 문을 사용할지, 아니면 switch 문을 사용할지는 가독성과 명령문이 테스트하는 표현식에 따라 결정됩니다. if-then-else 명령문은 값 범위 또는 조건에 기반한 표현식을 테스트할 수 있는 반면, switch 문은 단일 정수, 열거된 값 또는 String 객체만을 기반으로 하는 표현식을 테스트합니다.
예를 들어, 다음 코드는 switch 문으로 작성할 수 있습니다.
int month = ...; // any month
if (month == 1) {
System.out.println("January");
} else if (month == 2) {
System.out.println("February");
} ... // and so on반면에 다음은 switch 문으로 작성할 수 없는데, 이는 switch 문이 boolean 타입의 레이블을 지원하지 않기 때문입니다.
int temperature = ...; // any temperature
if (temperature < 0) {
System.out.println("Water is ice");
} else if (temperature < 100){
System.out.println("Water is liquid, known as water");
} else {
System.out.println("Water is vapor");
}
대/소문자 레이블의 타입으로 문자열 사용
Java SE 7 이상에서는 switch 문의 표현식에 String 객체를 사용할 수 있습니다. 다음 코드 예제는 월이라는 String 값을 기반으로 월의 숫자를 표시합니다.
String month = ...; // any month
int monthNumber = -1;
switch (month.toLowerCase()) {
case "january":
monthNumber = 1;
break;
case "february":
monthNumber = 2;
break;
case "march":
monthNumber = 3;
break;
case "april":
monthNumber = 4;
break;
case "may":
monthNumber = 5;
break;
case "june":
monthNumber = 6;
break;
case "july":
monthNumber = 7;
break;
case "august":
monthNumber = 8;
break;
case "september":
monthNumber = 9;
break;
case "october":
monthNumber = 10;
break;
case "november":
monthNumber = 11;
break;
case "december":
monthNumber = 12;
break;
default:
monthNumber = 0;
break;
}switch 표현식의 String은 String.equals() 메서드를 사용하는 것처럼 각 case 레이블과 연관된 표현식과 비교됩니다. 이 예제에서는 대소문자에 관계없이 모든 월을 허용하기 위해 toLowerCase() 메서드를 사용하여 월을 소문자로 변환하고 case 레이블과 연결된 모든 문자열을 소문자로 처리합니다.
Null 선택자 변수
switch 문의 선택자 변수는 객체일 수 있으므로 이 객체는 null일 수 있습니다. 이 경우 switch 명령문은 NullPointerException을 던지므로 선택자 변수가 널이 되지 않도록 코드를 보호해야 합니다.