# switch\~case 구문

## switch\~case

이 문서에서는 switch\~case 구문에 대해서 살펴본다.

### 형태

```java
switch(변수){
case 값1: /* 실행할 코드 */
case 값2: /* 실행할 코드 */
case 값3: /* 실행할 코드 */
...
default: /* 실행할 코드 */
}
```

switch 구문은 if문과 다르게 변수의 값을 이용하여 이동 지점을 탐색하는 구문이다.\
변수 자리에는 `byte`, `short`, `char`, `int`, `String` 형태의 변수만 사용할 수 있다.

### 데모 1 : 홀짝 판정 프로그램

```java
import java.lang.*;

public class SwitchExample01 {
    public static void main(String[] args){
        int number = 50;
        
        switch(number % 2){
        case 0:
            System.out.println("짝수");
            break;
        case 1:
            System.out.println("홀수");
            break;
        }
    }
}
```

if구문으로도 구현이 가능한 홀짝 판정 프로그램이다. switch의 경우 값을 기준으로 이동 위치를 판정하기 때문에 논리식이 아닌 `number % 2`와 같은 값이 나오는 식을 작성하였으며, 각각의 나올 수 있는 값들의 경우를 `case`라는 키워드 뒤에 정의하여 이동 지점을 명시하였다.

`break`가 없을 경우 구문이 끝나지 않고 계속 실행되며, 원치 않는 결과가 나올 수 있으므로 case가 종료된 뒤 사용하여 **탈출**을 지시하였다.

if문으로 동일하게 구현하면 다음과 같다.

```java
if(number % 2 == 0){
    System.out.println("짝수");
}
else{
    System.out.println("홀수");
}
```

### 데모 2 : 계절 판정 프로그램

```java
import java.lang.*;

public class SwitchExample02{
    public static void main(String[] args){
        int month = 11;
        
        switch(month){
        case 12: case 1: case 2:
            System.out.println("겨울");
            break;
        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:
            System.out.println("잘못된 입력");
        }
    }
}
```

월을 3개씩 묶어 계절을 판정하는 프로그램이다. 별도의 처리를 하지 않을 경 다음과 같이 12개의 `case`를 모두 구현해야 한다.

```java
switch(month){
case 1:
    System.out.println("겨울");
    break;
case 2:
    System.out.println("겨울");
    break;
case 3:
    System.out.println("봄");
    break;
case 4:
    System.out.println("봄");
    break;
case 5:
    System.out.println("봄");
    break;
case 6:
    System.out.println("여름");
    break;
case 7:
    System.out.println("여름");
    break;
case 8:
    System.out.println("여름");
    break;
case 9:
    System.out.println("가을");
    break;
case 10:
    System.out.println("가을");
    break;
case 11:
    System.out.println("가을");
    break;
case 12:
    System.out.println("겨울");
    break;
default:
    System.out.println("잘못된 입력");
    break;
}
```

위의 코드는 중복된 내용이 너무 많기 때문에, 탈출에 사용되는 `break`를 의도적으로 없에 다음과 같이 바꿀 수 있다.

```java
switch(month){
case 12:
case 1:
case 2:
    System.out.println("겨울");
    break;
/* 이하 생략 */
}
```

`switch` 구문은 `break`가 없을 경우 계속 실행된다는 특징을 이용하여 몇 개의 `case`를 그룹처럼 묶을 수 있다.\
모든 코드는 가로로 늘어놓을 수 있으므로 가독성을 위하여 다음과 같이 변경한다.(하지 않아도 좋다)

```java
switch(month){
case 12: case 1: case 2:
    System.out.println("겨울");
    break;
/* 이하 생략 */
}
```

마지막 `break`는 생략이 가능하므로 코드가 많이 감소되어 예제처럼 구현된다.

### 데모 3 : 월별 날짜 계산 프로그램

```java
import java.lang.*;

public class SwitchExample03{
    public static void main(String[] args){
        int month = 5;
        
        switch(month){
        case 2:
            System.out.println("28일");
            break;
        case 4: case 6: case 9: case 11:
            System.out.println("30일");
            break;
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            System.out.println("31일");
            break;
        default:
            System.out.println("잘못된 입력");
        }
    }
}
```

1월부터 12월까지의 달을 다음 세 가지로 구분한다.

* 2월 : 28일까지 존재(윤년 제외)
* 4, 6, 9, 11월 : 30일까지 존재
* 1, 3, 5, 7, 8, 10, 12월 : 31일까지 존재

if문으로 작성할 경우 규칙이 없어 조건을 작성하기가 매우 까다롭다.

```java
if(month == 2){
    
}
else if(month == 4 || month == 6 || month == 9 || month == 11){

}
else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){

}
else{

}
```

이럴 경우 switch를 사용하면 좀 더 간결한 코드 작성이 가능하다.

### 주의사항

switch\~case 구문을 사용할 경우 주의할 점은 다음과 같다.

* 변수 위치에는 `byte`, `short`, `char`, `int`, `String` 형태의 변수만 사용 가능하다.
* `case` 에는 식을 적을 수 없고 값만 적을 수 있다.
* `break`를 사용하여 탈출할 수 있으며, 사용하지 않을 경우 종료 시점까지 계속 진행된다.
* `default`는 case를 제외한 나머지 경우를 처리한다


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sysout.co.kr/base-language/java/beginner/control-statement/switch-case-statement.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
