ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • switch 문, switch문의 제약조건
    Java/조건문 & 반복문 2020. 10. 22. 15:40

     

     

     

     

    switch 문

     

    if문은 조건식의 결과가 참과 거짓, 두 가지 밖에 없기 때문에 경우의 수가 많아질수록 else - if를 계속 추가해야된다. 그러면 조건식이 많아지고, 그 구조가 복잡해져서 여러개의 조건식을 계산해야 할 때 처리시간도 많이 소요된다.

     

    그래서 이러한 문제점을 피할 수 있는 방법은 switch문을 사용하는 것이다. switch문은 if문과 달리 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하기 때문에 알아보기도 쉽다. 그래서 처리할 경우의 수, 조건이 많을 때에는 if문보다 switch문으로 작성하는 것이 좋다. 하지만 switch문은 제약조건이 있어서, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우도 있다.

     

    switch문은 조건식을 먼저 계산한 다음, 그 결과와 일치하는 case문으로 이동한다. 이동한 case문 아래에 있는 문장들을 수행하면서 break문을 만나면 전체 switch문을 빠져나가게 된다.

     

    switch ( 조건식 1 ) {

             case 값1  : 

                     // 조건식의 결과가 값1과 같을 경우 수행될 문장들

                     // ...

                    break;

             case 값2  :

                     // 조건식의 결과가 값2와 같을 경우 수행될 문장들

                     // ...

                    break;

             case 값3  :

                     // 조건식의 결과가 값3과 같을 경우 수행될 문장들

                     // ...

                    break;  //switch문을 벗어난다.

             default :

                     // 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들

                     // ...

    }

     

     

    만일 조건식의 결과와 일치하는 case문이 하나도 없을 경우에는 default문으로 이동하게된다.

    default문은 if문의 else {  }과 같은 역할을 한다고 보면 이해하기 쉽다. default문의 위치는 어디에 와도 상관없지만 보통 마지막에 놓기 때문에 break문을 쓰지 않아도 된다.

     

    switch문에서 break문은 각 case 영역을 구분하는 역할을 한다. 만일 break문을 생략하면 case문 사이의 구분이 없어지므로 다른 break문을 만나거나 switch문 {  }의 끝을 만날 때 까지 나오는 모든 문장들을 수행해야 된다. 그래서 이러한 이유 때문에 각 case문의 마지막에 break문을 빼먹는 실수를 하지 않도록 꼭 주의해야 된다.

     

     

     

     

     

     

    switch문의 제약조건

     

    switch문의 조건식은 결과값이 반드시 정수이어야 한다. 이 값과 일치하는 case문으로 이동하기 때문에 case문의 값 또 한 정수이어야 한다. 그리고 중복되는 정수가 오면 안 된다. 

    같은 값의 case문이 여러개가 되면, 어디로 이동해야되는지를 알 수 없기 때문이다.

     

    정리>

        1. switch문의 조건식 결과는 정수 or 문자열이어야 한다.

        2. case문의 값은 정수, 상수(문자 포함), 문자열만 가능하고, 중복이 되면 안 된다.

     

     

     

    case문의 몇 가지 예를 아래의 코드를 통해 살펴보자.

     

    package com.jy.controlstatement;
    
    import java.util.Scanner;
    
    public class Ex4_6 {
    
    	public static void main(String[] args) {
    
    		int num, result;
    		final int ONE = 1;
    
    		Scanner scanner = new Scanner(System.in);
    		result = scanner.nextInt();
    
    		switch (result) {
    			case '1':
    				System.out.println("OK 문자 리터럴 - 정수 49와 동일하다.");
    				break;
    	
    			case ONE:
    				System.out.println("OK 정수 상수");
    				break;
    	
    			case "YES":
    				System.out.println("OK 문자열 리터럴 - JDK 1.7부터 허용한다.");
    				break;
    	
    			case num:
    				System.out.println("error 변수는 불가");
    				break;
    	
    			case 1.0:
    				System.out.println("error 실수는 불가");
    				break;
    	
    			default:
    				System.out.println("default");
    		}
    	}
    }

     

    위의 코드를 보면 문자 '1'은 정수 49와 동등하므로 문제가 없다. ONE은 정수가 아닌 것처럼 보이지만 'final'을 붙여서 상수로 만들어 놨으므로 case문의 값으로 적합하다. 그러나 변수, 실수 리터럴은 case문의 값으로 적합하지 않다!

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    [참고 도서 Java의 정석_기초편] http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788994492049&orderClick=LEa&Kc=

Designed by Tistory.