대괄호 표현 → 생략가능
switch 문(switce ~ case문)
- if문처럼 특정 조건에 대해 여러가지 판별을 수행하는 조건문 => 단, if문과는 달리 범위에 대한 판별 등이 불가능하며 값에 대한 동등 비교만 가능함
- switch문의 조건식에는 연산식 또는 변수, 리터럴 등이 올 수 있으나 반드시 정수 또는 문자열 (또는 enum 타입 변수) 만 사용 가능 => 이 중 정수는 byte, short, char, int만 사용 가능
- switch문에서 지정한 조건에 맞는 값을 case 문에서 탐색하여 일치하는 값을 갖는 case문의 문장을 실행함 이 때, case문에는 조건식 결과를 비교할 리터럴 1개만 명시함
- 일치하는 case문이 없을 경우 default문을 찾아서 실행함 => else문과 유사하며, 생략도 다능
- case문의 문장 실행 후 break문을 만나면 switch문을 빠져나감 단, break문이 없을 경우 다음 break문을 만나거나 switch문이 종료될 때까지 현재 문장의 아래쪽 모두 실행 문장을 실행 (다른 case문과 default문의 실행문까지 모두 실행)
- case문끼리의 순서는 상관없다.
- < 기본 문법 >
switch(조건식) { // 조건식에는 정수, 문자열(또는 enum타입 상수) 사용
case 값1:
// 조건식 결과가 값1과 일치하는 경우 실행할 문장들..
[break] // [생략 가능]
case 값2:
// 조건식 결과가 값2과 일치하는 경우 실행할 문장들...
[break]
case 값n:
// 조건식 결과가 값n과 일치하는 경우 실행할 문장들..
[break]
[default : // case문 중 일치하는 값이 없을 경우 실행할 문장들..]
- default문 없는 switch~case문
int num = 2;
switch(num) { //break문을 만나기전까지 계속 실행함!
case 1: System.out.println("num = 1");
case 2: System.out.println("num = 2");
// num이 2일때 case2의 문장을 실행하고 break문이 없기 때문에
// 아래쪽 case3의 문장도 모두 실행한다!
case 3: System.out.println("num = 3");
}
- deafult문이 있는 switch~case문
num = 4;
switch(num) {
case 1: System.out.println("num = 1");
case 2: System.out.println("num = 2");
case 3: System.out.println("num = 3");
default : System.out.println("일치하는 case문이 없음!");
// break문이 없을때 case문과 default문 모두 실행 대상에 포함됨
}
- break문 있는 switch~case문
num = 2;
switch(num) { //정수 또는 문자열
case 1:
System.out.println("num = 1");
break;
case 2:
System.out.println("num = 2");
// num이 2일때 case2의 출력문 실행 후 break문을 만나므로
// 아래쪽 나머지 문장을 실행하지 않고 switch문을 빠져나감
break;
case 3:
System.out.println("num = 3");
break;
default : System.out.println("일치하는 case문이 없음!");
// dedault문 아래쪽에는 다른 실행문이 없으므로 break문 생략 가능
}
- switch문에 문자열 데이터 전달시
switch("KOREA" ) {
case "대한민국" : System.out.println("대한민국!"); break;
case "KOREA" : System.out.println("KOREA!"); break;
case "한국" : System.out.println("한국!"); break;
default :System.out.println("다른 나라!");
}
- switch문에는 연산식도 사용 가능하지만, 연산 결과가 정수, 문자열 타입이어야만 한다!
switch(10 / 2) {} // (10/2)는 결과가 정수이므로 사용 가능
switch(10 * 3.14) {} // 결과가 실수이므로 사용 불가
// => Cannot switch on a value of type double.
// Only convertible int values, strings or enum variables are permitted
- 달의 일수 계산
int month = 2;
switch(month) {
case 1: System.out.println(month+"월 한달은 31일!");
break;
case 3: System.out.println(month+"월 한달은 31일!");
break;
case 5: System.out.println(month+"월 한달은 31일!");
break;
case 7: System.out.println(month+"월 한달은 31일!");
break;
case 8: System.out.println(month+"월 한달은 31일!");
break;
case 10: System.out.println(month+"월 한달은 31일!");
break;
case 12: System.out.println(month+"월 한달은 31일!");
break;
case 4: System.out.println(month+"월 한달은 30일!");
break;
case 6: System.out.println(month+"월 한달은 30일!");
break;
case 9: System.out.println(month+"월 한달은 30일!");
break;
case 11: System.out.println(month+"월 한달은 30일!");
break;
case 2: System.out.println(month+"월 한달은 28일!");
break;
}
⇒ 너무 복잡! 줄여보자~
switch(month) {
case 1: //결과값이 1,3,5,7,8,10,12 일 때
case 3: // 모든 case문에서 "한 달은 31일" 문자열을 출력하는데
case 5: // 출력문이 중복이므로
case 7: // 각 case문에서 모두 출력하지 않고
case 8: // 마지막 case문에서만 출력하고 나머지는 비워두면
case 10: // break문이 없으므로 12월까지 내려가서 출력문을 실행
case 12: System.out.println(month+"월 한달은 31일!");
case 4: // 결과값이 4,6,9,11일 때
case 6: // 출력문이 중복되므로
case 9: // 마지막 11월에서만 출력문을 실행하면 된다!
case 11: System.out.println(month+"월 한달은 30일!");
break;
case 2: System.out.println(month+"월 한달은 28일!");
}
위의 내용을 다음과 같이 표현 가능
switch(month) {
case 1: case 3: case 5: case 7: case 8: case 10:
case 12: System.out.println(month+"월 한달은 31일!");
case 4: case 6: case 9:
case 11: System.out.println(month+"월 한달은 30일!");
case 2: System.out.println(month+"월 한달은 28일!");
}
위의 switch문 코드를 줄이기 위해 연산식 활용 => 각 학점에 해당하는 점수의 공통점을 추출
A 학점 : 90점대와 100점(= 10의 자리 숫자가 9 또는 10) B 학점 : 80점대와 90점(= 10의 자리 숫자가 8) C 학점 : 70점대와 80점(= 10의 자리 숫자가 7) D 학점 : 60점대와 70점(= 10의 자리 숫자가 6) F 학점 : 나머지 점수 => 점수에서 10의 자리 값을 추출하여 switch문에 전달
score = 88;
switch(score/10) {
case 10:
case 9: System.out.println(score + ": A학점"); break;
case 8: System.out.println(score + ": B학점"); break;
case 7: System.out.println(score + ": C학점"); break;
case 6: System.out.println(score + ": D학점");break;
default: System.out.println(score + ": F학점");
}
⇒ B학점
⇒ 문제점 : 101 ~ 109 점수도 A학점으로 취금됨
⇒ 해결책 : if문을 사용해서 0~100사이일때만 학점계산
- switch~case + if
score = 105;
if(score>=0 && score<=100) {
switch(score/10) {
case 10:
case 9: System.out.println(score + ": A학점"); break;
case 8: System.out.println(score + ": B학점"); break;
case 7: System.out.println(score + ": C학점"); break;
case 6: System.out.println(score + ": D학점");break;
default: System.out.println(score + ": F학점");
}
} else {
System.out.println(score + ": 점수 입력 오류!");
}
'JAVA' 카테고리의 다른 글
[JAVA] 중첩 for문 (1) | 2023.09.11 |
---|---|
[JAVA] 반복문 - for문 (0) | 2023.09.11 |
[JAVA] 중첩 if문 (0) | 2023.09.08 |
[JAVA] 조건문(if, if-else, 다중if -else if문) (0) | 2023.09.08 |
[JAVA] 6가지 연산자(논리, 증감, 삼항) (0) | 2023.09.08 |