■ switch문 vs if문
- if문의 결과는 참과 거짓, 두 가지 박에 없기 때문에 경우의 수가 많아질수록 조건식이 많아져 복잡해지고, 여러 개의 조건식을 계산해야 하므로 처리시간도 많이 걸림
- switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 가독성도 좋음. 그래서 처리할 경우의 수가 많은 경우 if문보다 switch문으로 작성하는 것이 좋음.
- But, switch문은 제약 조건이 있기 때문에, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우가 있음.
■ switch문 작동 원리 및 형태
① 조건식 계산
② 조건식 결과와 일치하는 case문으로이동
③ 이후 문장들을 수행
④ break문이나 switch문이 끝을 만나면 switch문 전체 빠져나감
switch(조건식) {
case 값1:
// 조건식의 결과가 값1과 같은 경우 문장 수행
// ...
break;
case 값2:
// 조건식의 결과가 값2과 같은 경우 문장 수행
// ...
break;
// ...
default :
// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
// ...
}
※ break는 각 case문의 영역을 구분하는 역할을 하므로 잊지 말고 써야 함.
※ default문은 if문의 else블럭과같은 역할을 한다고 이해하면 쉬움. 위치는 어디든 상관없으나 보통 마지막에 넣기 대문에 break문을 쓰지 않아도 됨.
■ switch문의 제약 조건
1. 조건식의 결과는 정수 또는 문자열이어야 함.
2. case문의 값은 정수 상수(문자 포함), 문자열만 가능하며, 중복되지 않아야 함.
int num, result;
final int ONE = 1;
...
switch(result) {
case '1': // OK. 문자 리터럴 (정수 49와 동일)
case ONE: // OK. 정수 상수
case "YES": // OK. 문자열 리터럴. JDK 1.7부터 허용
case num: // 에러. 변수는 불가
case 1.0: // 에러. 실수도 불가
...
}
예제)
import java . util . Scanner ;
public class Review {
public static void main ( String [] args ) {
Scanner scanner = new Scanner ( System . in );
System . out . print ( " 현재 월 입력 : " );
int month = scanner . nextInt ();
switch ( month ) {
case 3 :
case 4 :
case 5 :
System . out . println ( " 현재 계절은 봄입니다. " );
break ;
case 6 : case 7 : case 8 :
System . out . println ( " 현재 계절은 여름입니다. " );
break ;
case 9 : case 10 : case 11 :
System . out . println ( " 현재 계절은 가을입니다. " );
break ;
default: //case 12: case 1: case 2:
System . out . println ( " 현재 계절은 겨을입니다. " );
break ;
} // end switch
scanner . close ();
} // end main
}
import java . util . Scanner ;
public class Review {
public static void main ( String [] args ) {
Scanner scanner = new Scanner ( System . in );
System . out . print ( " Minsoo와의 가족 관계: " );
String family = scanner . nextLine ();
switch ( family ) {
case " father " : case " Father " : case " mother " : case " Mother " :
System . out . println ( " 부모 " );
break ;
case " Brother " :
System . out . println ( " 남자 형제 " );
case " Sister " :
System . out . println ( " 여자 형제 " );
default: System . out . println ( " 누구쎼용? " );
}
scanner . close ();
} // end main
}
public class Review {
public static void main ( String [] args ) {
int value = 0 ;
String result = "" ;
switch ( value ) {
case 0 : result += " * " ;
case 1 : result += " ^ " ;
case 2 : result += " ^ " ;
case 3 : result += " * " ;
}
System . out . println ( result ); // 출력 결과 : *^^*
} // end main
}
■ switch문의 변형
※ Lambda 이용
(1)
import java . util . Scanner ;
public class Review {
public static void main ( String [] args ) {
String yoil = " 월 " ;
System . out . print ( yoil + " 요일 운동 : " );
switch ( yoil ) {
case " 월 " , " 수 " , " 금 " -> System . out . println ( " 요가 " );
case " 화 " , " 목 " , " 토 " -> System . out . println ( " 수영 " );
default -> System . out . println ( " 달리기 " );
}
} // end main
}
(2) switch 식 (switch문 블럭 끝에 꼭! 세미콜론(;)붙여야 함)
public class Review {
public static void main ( String [] args ) {
String yoil = " 월 " ;
String result = switch ( yoil ){
case " 월 " , " 수 " , " 금 " -> " 요가 " ;
case " 화 " , " 목 " , " 토 " -> " 수영 " ;
default -> " 달리기 " ;
}; // 세미콜론 필수 !!
System . out . println ( yoil + " 요일 운동 : " + result );
} // end main
}
(3) yield를 사용한 switch 식 (switch문 블럭 끝에 꼭! 세미콜론(;)붙여야 함)
public class Review {
public static void main ( String [] args ) {
String yoil = " 월 " ;
double calories = 0 ;
calories = switch ( yoil ){
case " 월 " , " 수 " , " 금 " :
System . out . println ( yoil + " 요일 운동 : 에어로빅 " );
yield 664.7 ;
case " 화 " , " 목 " , " 토 " :
System . out . println ( yoil + " 요일 운동 : 수영 " );
yield 700.1 ;
default:
System . out . println ( yoil + " 요일 운동 : 없음 " );
yield 0 ;
};
System . out . println ( " 소비 칼로리 : " + calories + " kcal " );
} // end main
}
□ [문제] 두 개의 정수를 입력 받고, 연산 종류를 입력 받아 결과 출력
① 선택 시 범위 이외의 값을 입력하지 않음을 가정.
import java . util . Scanner ;
public class Review {
public static void main ( String [] args ) {
Scanner scanner = new Scanner ( System . in );
int num1 , num2 , menu ;
double result = 0 ;
System . out . print ( " 정수 두 개 입력 : " );
num1 = scanner . nextInt ();
num2 = scanner . nextInt ();
System . out . println ( " -------------- " );
System . err . println ( " 1.덧셈 " );
System . err . println ( " 2.뺄셈 " );
System . err . println ( " 3.곱셈 " );
System . err . println ( " 4.나눗셈 " );
System . out . println ( " -------------- " );
System . out . print ( " 선택 > " );
menu = scanner . nextInt ();
switch ( menu ) {
case 1 -> result = num1 + num2 ;
case 2 -> result = num1 - num2 ;
case 3 -> result = num1 * num2 ;
case 4 -> result = num1 /( double ) num2 ;
}
System . out . println ( " 결과 > " + result );
scanner . close ();
} // end main
}
※ switch 식 사용한 경우
result = switch ( menu ){
case 1 -> num1 + num2 ;
case 2 -> num1 - num2 ;
case 3 -> num1 * num2 ;
default -> num1 /( double )( num2 );
};
② 선택 시 범위 이외의 값 등이 입력될 수 있는 경우
import java . util . Scanner ;
public class Review {
public static void main ( String [] args ) {
Scanner scanner = new Scanner ( System . in );
int num1 , num2 ;
System . out . print ( " \n 정수 두 개 입력 : " );
num1 = scanner . nextInt ();
num2 = scanner . nextInt ();
System . out . println ( " -------------- " );
System . err . println ( " 1.덧셈 " );
System . err . println ( " 2.뺄셈 " );
System . err . println ( " 3.곱셈 " );
System . err . println ( " 4.나눗셈 " );
System . out . println ( " -------------- " );
System . out . print ( " 선택 > " );
String menu = scanner . next ();
String result = switch ( menu ){
case " 1 " -> num1 + num2 + "" ;
case " 2 " -> num1 - num2 + "" ;
case " 3 " -> num1 * num2 + "" ;
case " 4 " -> num1 /( double )( num2 )+ "" ;
default -> " 키 잘못 입력함 " ;
};
System . out . println ( " 결과 > " + result );
scanner . close ();
} // end main
}
※ yield를 사용한 switch 식 사용한 경우
String result = switch ( menu ){
case " 1 " : yield ( num1 + num2 + "" );
case " 2 " : yield ( num1 - num2 + "" );
case " 3 " : yield ( num1 * num2 + "" );
case " 4 " : yield ( num1 /( double )( num2 )+ "" );
default : yield ( " 키 잘못 입력함 " );
};
□ while 반복문을 이용해서 사칙연산 프로그램 만들기
import java . util . Scanner ;
public class Review {
public static void main ( String [] args ) {
Scanner scanner = new Scanner ( System . in );
int num1 , num2 ;
while (true) {
System . out . println ( " \n -------------- " );
System . err . println ( " 1.덧셈 " );
System . err . println ( " 2.뺄셈 " );
System . err . println ( " 3.곱셈 " );
System . err . println ( " 4.나눗셈 " );
System . err . println ( " 0.종료 " );
System . out . println ( " -------------- " );
System . out . print ( " 선택 > " );
String menu = scanner . next ();
if ( menu . equals ( " 0 " )) {
System . out . println ( " ### 프로그램을 종료합니다. ### " );
break ;
}
if (!( menu . equals ( " 1 " ) | menu . equals ( " 2 " ) | menu . equals ( " 3 " ) | menu . equals ( " 4 " ))) {
System . out . println ( " ### 메뉴 선택을 올바르게 입력하세요. ### " );
continue ;
}
System . out . print ( " 정수 두 개 입력 : " );
num1 = scanner . nextInt ();
num2 = scanner . nextInt ();
String result = switch ( menu ){
case " 1 " -> num1 + num2 + "" ;
case " 2 " -> num1 - num2 + "" ;
case " 3 " -> num1 * num2 + "" ;
default -> num1 /( double )( num2 )+ "" ;
};
System . out . println ( " 결과 > " + result + " \n " );
} // end while
scanner . close ();
} // end main
}