Java

JAVA - 조건문 ( switch - case )

비망노트 2022. 7. 2. 15:22

- 자바 조건문 ( 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