Coding(Java)/Java(이론)2021. 8. 23. 20:00
반응형

[Java] 8. switch문

 

 

switch문은 다양한 처리문을 두고 조건값에 의해 하나에서 여러개의 처리문을 한 번에 실행하는데 유용한 분기문이다. 

if문이 boolean(true 또는 false)인 반면 switch문은 정수형(byte, short, int)과 문자형(char, string)이고, long형이나 공백이 포함된 문자열, boolean과 실수형은 사용할 수 없다.

switch문은 식과 case문의 값을 비교해서 일치하면 해당 case문의 실행문장을 실행하고 그렇지 않다면(일치하는 것이 없다면) default문을 실행한다. 

break를 만나면 switch문을 벗어난다.

 

다음은 switch문이 갖는 구조를 나타낸 것이다.

switch(인자값) {
                case 조건값1:    //세미콜론(;)이 아니라 콜론(:)이다!
                       실행문장; break;
                case 조건값2:    //break문은 보통 하나의 조건문마다 넣어주고, 없으면 다음 break문을 만날 때까지
                       실행문장; break; //모든 실행문장 처리 
                case 조건값3:   
                       실행문장; break;
                default:
                       실행문장;

 

다음의 예는 광물을 입력하면 그 광물의 특징을 출력하는 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package mymain;
 
import java.util.Scanner;
 
public class _2_switch문1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Scanner scan=new Scanner(System.in);
        String mine;//광물이름
        String result;
        
        System.out.print("광물 이름을 입력하시오(금(Au), 은(Ag), 동(Cu), 철(Fe), 한글로 입력할 것!):");
        mine=scan.next();
        
        switch(mine) {
        
        case "금": result="값비싸고 가치있는 광물이지!"break;
        case "은": result="은빛 광물"break;
        case "동": result="구릿빛 광물"break;
        case "철": result="철은 단단한 광물"break;
        default:   result="어떤 광물일까요?";
        }
        
        System.out.printf("%s은 %s", mine, result);
 
    }
 
}
cs

case문에는 각각 금, 은, 동, 철 네 가지의 광물들이 설정되어있고, 이들 중 하나를 입력하면 result에 입력된 각 광물들의 특징들이 출력된다. 만약 이 네 개의 광물 이외의 것을 입력하면 default문에 있는 "어떤 광물일까요?"가 출력된다.

다음은 이 프로그램을 실행시킨 결과이다.

광물 이름을 입력하시오(금(Au), 은(Ag), 동(Cu), 철(Fe), 한글로 입력할 것!):금
금은 값비싸고 가치있는 광물이지!
광물 이름을 입력하시오(금(Au), 은(Ag), 동(Cu), 철(Fe), 한글로 입력할 것!):1
1은 어떤 광물일까요?

금을 입력한 결과, mine은 "금", result는 "값비싸고 가치있는 광물이지!"로 설정되고, break문이 실행되 switch문을 빠져나왔다. 그 밑에 있는 System.out.printf에서 mine과 result가 출력된다.

1을 입력한 결과, 1은 case문 어디에도 없어서 default문에 있는 "어떤 광물일까요?"가 result로 설정되어 출력된다.

 

다음은 점수에 따라 미적분학 성적을 부여하는 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package mymain;
 
import java.util.Scanner;
 
public class _2_switch문2 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Scanner scan=new Scanner(System.in);
        
        int math;
        String grade;
                
        System.out.print("미적분학 성적:");
        math=scan.nextInt();
        
        //유효성 체크
        if(math>=0 && math<=100) {
            //정상코드
        switch(math/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.printf("미적분학 %d점 등급은 %s입니다.\n", math, grade);
            
            
        }else {
            //비정상코드
            System.out.println("점수는 0~100사이값만 입력하시오.");
        }
 
    }
 
}
 
cs

특징이라면 switch문이 if문 안에 있다는 것이다. 여기서 if문은 제대로 입력했는가를 체크하기 위해 있는 것이다. 

다음은 위 프로그램을 실행시킨 결과다.

미적분학 성적:100
미적분학 100점 등급은 A입니다.
미적분학 성적:40
미적분학 40점 등급은 F입니다.

앞에서 break문이 없으면 break문을 만날 때까지 실행문장을 실행한다고 했다. case문에서 10일 때 아무것도 작성되어있지 않아서 9일 때 grade를 A로 지정하라는 명령을 수행하고 break되었고, 그 결과 A가 출력되었다.

10부터 6까지는 case문 다음으로 실행명령이 있으나 5 이하로는 없다. default로 F가 설정되어 있고, 40일 때 10으로 나눈 나머지는 4이고, 어느 case문에도 4가 없기 때문에 default인 F가 출력되었다. 

 

다음은 윤년을 고려하지 않고 월별 일수를 출력하는 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package mymain;
 
import java.util.Scanner;
 
public class _2_switch문3 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Scanner scan = new Scanner(System.in);
        int month;
        int last_day; // 월의 마지막 날
 
        System.out.printf("월을 입력하시오(그 월의 일(日) 수 출력):");
        month = scan.nextInt();
 
        //월(月)      1  2  3  4  5  6  7  8  9 10 11 12
        //일(日)수:  31 28 31 30 31 30 31 31 30 31 30 31
 
        /*
         * if(month==1) last_day=31; else if(month==2) last_day=28; else if(month==3)
         * last_day=31;
         * 자동정렬: Ctrl+Shift+F
         */
 
        if (month >= 1 && month <= 12) {
 
            switch (month) {
            case 2:last_day = 28;break;                                
            case 4:
            case 6:
            case 9:
            case 11:last_day = 30;break;                                
            default:last_day = 31;                
 
            }
            System.out.printf("%d월은 %d일까지 있다.\n", month, last_day);
        } else {
            System.out.println("month는 1~12월 입력하세요.\n,");
        }
 
    }
 
}
 
cs

월별 일수는 위 코드의 주석부분에 있다. 

case문에서 4, 6, 9 부분은 비어있고, 11 부분에 last_day=30으로 설정하고 break로 되어있다. 이것은 4, 6, 9, 11을 입력하면 그 결과는 last_day=30이 된다는 뜻이다. 

이 프로그램을 실행하면 다음과 같은 결과를 얻는다. 

월을 입력하시오(그 월의 일(日) 수 출력):6
6월은 30일까지 있다.
월을 입력하시오(그 월의 일(日) 수 출력):12
12월은 31일까지 있다.

 

반응형

'Coding(Java) > Java(이론)' 카테고리의 다른 글

[Java] 10.while문  (0) 2021.08.25
[Java] 9. for문  (0) 2021.08.24
[Java] 7. if문  (0) 2021.08.23
[Java] 6. 시프트, 관계, 이진논리, 일반논리, 3항, 대입연산자  (0) 2021.08.20
[Java] 5. 단항연산자, 산술연산자  (0) 2021.08.20
Posted by skywalker222