- 자바 조건문 ( switch - case )
조건문이란?
조건에 따라 코드의 실행 흐름을 다르게 동작하도록 제어하는 기능을 함
조건문의 종류로는 if문과 switch문 두가지가 있다.
우선 이번포스팅에서는 switch문을 다뤄보자.
switch - case
switch (조건식) {
case 1 :
실행문;
break;
case 2 :
실행문;
break;
case 3 :
실행문;
break;
default :
실행문;
}
✅ default 는 if문의 else와 같은느낌으로 '그 밖의 다른경우' 에 실행된다
❗ switch문은 if문과 다르게 제약조건이 있는데
switch문의 조건식은 반드시 결과값이 정수 또는 문자열 이어야하며
case문의 값 역시 정수,상수 이어야하고 변수,실수,문자열은 불가능하다.
public static void main(String[] args){
int num, result ;
final int ONE = 1;
switch(result){
case '1' : // OK. 문자 리터럴 (정수 상수 49와 동일)
case ONE : // OK. 정수 상수
case "YES" : // OK. 문자열 리터럴
case num : // Error. 변수 불가능
case 1.0 : // Error. 실수 불가능
}
}
public class Main {
public static void main(String[] args) {
byte i = 127;
switch(i) {
case -128:
System.out.println("byte의 음수최대값");
break;
case 127:
System.out.println("byte의 양수최대값");
break;
default :
System.out.println(i);
}
}
}
❗ 정수형만 들어간다고 했지만 long은 못들어가지못하고 byte,short,int, char 타입은 가능하며
case의 상수는 입력되는 변수의 범위까지만 사용할 수 있다.
변수 i의 타입이 byte니까 case의 값으로 -128 ~ 127 까지 만들 수 있다.
마찬가지로 변수의 타입을 int로 하면 +- 21억개까지 등등
char i = 'A';
switch(i) {
case 'A':
System.out.println();
break;
case 65:
System.out.println();
break;
}
// 둘중 어디로가야할지 모르기 때문에 Error 발생
String s = "Hello";
switch(s) {
case "Hello" :
System.out.println("인사");
break;
}
// 이렇게 문자열도 가능하다
break
✅ break는 switch, for, while 문 모두 마찬가지로 가장 가까이에있는 제어문을 벗어나는 역할을 해준다.
public class Main{
public static void main(String[] args){
int i = 3;
switch(i){
case 1 :
System.out.println("i의 값은 "+ i+" 이므로 case1이 실행되었습니다.");
case 2 :
System.out.println("i의 값은 "+ i+" 이므로 case2이 실행되었습니다.");
case 3 :
System.out.println("i의 값은 "+ i+" 이므로 case3이 실행되었습니다.");
case 4 :
System.out.println("i의 값은 "+ i+" 이므로 case4이 실행되었습니다.");
default :
System.out.println("i의 값은 "+ i+" 이므로 default가 실행되었습니다.");
}
}
}
/* output
i의 값은 3 이므로 case3이 실행되었습니다.
i의 값은 3 이므로 case4이 실행되었습니다.
i의 값은 3 이므로 default가 실행되었습니다.
*/
✅ int의 값은 3이므로 case3 에 부합해 case3이 실행되었다 하지만 멈춰줄수있는 break문이 없기때문에
더이상 실행될 문장이 없을때까지 즉 제일아래까지 모두 실행시키게된다.
아래 학점구하기 예시로 한번 더 짚어보도록하자
// 학점구하기
public class Main{
public static void main(String[] args){
int score = 90;
String grade;
switch(score/10){
case 10 :
case 9 :
grade = "A";
case 8 :
grade = "B";
case 7 :
grade = "C";
case 6 :
grade = "D";
default :
grade = "F";
}
System.out.println(grade);
}
}
// output : F
✅ 나는 90점을 맞았다 하지만 성적표에는 F가 찍혀있다. 어떻게된일일까 break가 없기때문이다.
순서를 살펴보자면 90/10 = 9 이므로 case 9 에 만족하니 처음에는 나의학점 "A" 가 grade에 잘 들어갔다.
하지만 break로 탈출시켜주지 않았기때문에 case8, case7... 쭉쭉 내려가서 결국 마지막 default문까지 실행되고말았다.
break문은 필요에따라 작성하지 않는경우도 있긴하므로 조건에 따라 잘 사용해야한다.
// 학점구하기
public class Main {
public static void main(String[] args) {
int score = Integer.parseInt(args[0]);
String grade;
if( -1 <score && score < 101) {
switch(score/10) {
case 10 : case 9 :
grade = "A";
break;
case 8:
grade = "B";
break;
case 7:
grade = "C";
break;
case 6:
grade = "D";
break;
default:
grade = "F";
}
System.out.println("당신의 학점은 "+grade+"학점 입니다.");
}else {
System.out.println("올바른 점수가 아닙니다.");
}
}
}
✅ if문이었다면 score를 10으로 나누지않고 90<=score 이런식으로 사용할 수 있지만
switch문에서 10으로 나누는 과정이 없었더라면
case 100 : case99 : case98 : case97 : case96 : case95 : 이런식으로 case가 과도하게 많아졌을것이다.
하지만 이렇게 10으로 나눈다면 이전포스팅에서 언급했던것처럼 정수끼리의 나눗셈연산은 실수가아닌
소수점이 없는 정수형으로 나오기때문에 99를 10으로나누어도 9.9가 아닌 9가 나온다.
즉 90점대는 10으로 나누면 모두 결과값이 9 가 나오기때문에 이렇게 case의 수도 확 줄일 수 있는것이다.
❗ 조건문을 작성할 때 주의할점은 경우의수들, 연산결과 등 관계들을 잘 파악해
조건문과 경우의 수를 간단하게 만드는게 중요하다.
'Java' 카테고리의 다른 글
| JAVA - 반복문 ( while, do-while ) (0) | 2022.07.06 |
|---|---|
| JAVA - 반복문 ( for ) (0) | 2022.07.05 |
| JAVA - 조건문 ( if, else if, else ) (0) | 2022.07.02 |
| JAVA - 문자열 분리 ( StringTokenizer ) (0) | 2022.06.29 |
| JAVA - 문자열 분리 ( split ) (0) | 2022.06.28 |