switch?
if문은 조건식의 결과가 참, 거짓 두가지 밖에 없기 때문에
경우의 수가 많아질수록 else-if를 계속 추가해야 해서 조건식이 많아져 복잡해진다.
하지만 switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있다.
다만 switch문은 제약 조건이 있어 경우의 수가 많아도 if문으로 작성해야 하는 경우가 있다.
1. 조건식을 계산.
2. 조건식의 결과로 일치하는 case문으로 이동.
3. 이후의 문장을 수행
4. break문이나 switch문의 끝을 만나면 switch문 전체를 종료
switch (조건식){
case 값1 :
// 조건식의 결과 == 값1 : 실행
break;
case 값2 :
// 조건식의 결과 == 값2 : 실행
break;
default :
// 조건식과 일치하는 case문이 없을 때 실행
}
만일 조건식의 결과와 일치하는 case문이 없는 경우 default문의 코드를 실행한다.
default문은 if문의 else블럭과 같은 역할을 한다고 보면 쉽다.
default문의 위치는 어디라도 상관없지만 보통 마지막에 놓기 때문에 break문은 쓰지 않아도 된다.
고의적 break문의 생략
만약 case문의 마지막 문장에 break문을 사용하지 않는다면 case문 사이의 구분이 없어져
다른 break문을 만나거나 switch문 블럭{}의 끝을 만날 때까지 모든 문장을 수행한다.
이를 이용하여 고의적인 break문을 생략하는 경우가 있다.
예를 들어 변수 level의 값이 2라면, 다음과 같은 흐름으로 진행된다.
int level = 2;
switch (level){
case 3 :
grantDelete();
case 2 : //← level의 값이 2
grantWrite(); //← 실행
case 1 : // 멈추지 않는다.
grantRead(); //← 실행
}
코드에 대한 설명
- 변수 level의 값이 2이므로 이와 일치하는 case문인 'case 2 :'로 이동
- break문이 없으므로 'case 2: '에 속한 문장을 실행
- 'case 1'에 속한 문장까지 수행
- 더이상의 문장이 없으므로 switch 종료
이런식의 사용을 의도하기 위해 고의적으로 break문을 생략하는 경우가 있다.
switch문의 제약조건
- switch문의 조건식은 결과값이 반드시 정수 또는 문자열이어야한다.
- case문의 값은 정수, 정수형 타입의 상수, 문자열이 가능하며, 중복되지 않아야 한다.
int num, result;
final int ONE = 1;
swtich(result){
case '1': // OK. 문자 리터럴(정수 상수 49와 동일)
case ONE: // OK. 정수 상수
case "YES": // OK. 문자열 리터럴. (JDK 1.7부터 허용)
case num: // 에러. 변수는 불가
case 1.0: // 에러. 실수도 불가
}
switch문도 if문처럼 중첩으로 사용하는게 가능하지만
switch문과 if문을 함께 사용 하는걸 좋아했었다.
이게 훨신 깔끔한거 같음
아님 말구 입니다.😉
swtich (조건식) {
case 1 :
if(조건식){
//...
} else {
//...
}
break
case 2 :
if(조건식){
//...
} else {
//...
}
break
default :
if(조건식){
//...
} else {
//...
}
}
댓글