Java

04. 선택문 - switch문

yeonny_do 2024. 1. 19. 09:49

■ 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
}