코린이의 소소한 공부노트

제어문 (1) 조건문 - switch 본문

Java

제어문 (1) 조건문 - switch

무지맘 2022. 1. 5. 19:41

 

조건문이란 조건을 만족할 때만 해당 블록을 실행시키는 제어문이다. 

- 조건이 참일 경우 해당 블록 1번 실행

  - 조건이 거짓일 경우 해당 블록 실행 안 함

 

switch문의 기본 생김새는 이렇다.

switch (조건식){
	case 값1:
		// 조건식의 결과가 값1과 일치할 경우 수행
		// ...
		break; // switch문을 빠져 나온다.
	case 값2:
		// 조건식의 결과가 값2와 일치할 경우 수행
		// ...
		break; // switch문을 빠져 나온다.
	// ...
	default:
		// 조건식의 결과와 일치하는 case가 없을 때 수행
        // break;
}

1. switch

  - 경우의 수가 많을 때 유용하게 쓰이는 조건문이다.

  - 조건식을 계산해서 나온 결과와 일치하는 case를 찾아간다.

  - 이때 조건식의 결과는 정수 또는 문자열 이어야 한다.

  - break를 만날 때까지(또는 switch문이 끝날 때까지) 실행한다.

2. case

  - switch의 조건식을 계산해서 나올 수 있는 각각의 경우를 나타낸다.

  - case의 값은 정수 상수, 문자열만 가능하고, 중복되어서는 안 된다.

  - case문에서 수행할 내용이 끝나면 break를 넣어줘 switch문을 빠져나오게 해야 한다.

  - 때에 따라 break를 생략하는 경우도 있다.

    예) 여러 case에서 같은 내용을 수행할 경우 case문을 여러 개 쓰고 수행할 내용을 한 번만 쓰면 된다.

3. default

  - 조건식의 결과가 case에 없을 때 수행한다.

  - default는 if문의 else처럼 생략 가능하다.

  - 보통 default는 가장 마지막에 쓰기 때문에 break를 생략하기도 한다.

 

백문이 불여일견, 설명한 내용에 대한 예시를 들어보겠다. 예시를 위한 코드라 리팩터링 된 것은 아니다.

// month: 월을 나타내는 int 변수

switch(month) {
// 1)
	case 3:
		System.out.println("봄입니다.");
		break;
	case 4:
		System.out.println("봄입니다.");
		break;
	case 5:
		System.out.println("봄입니다.");
		break;
// 2)
	case 6: case 7: case 8:
		System.out.println("여름입니다.");
		break;
	case 9: case 10: case 11:
		System.out.println("가을입니다.");
		break;
	case 12: case 1: case 2:
		System.out.println("겨울입니다.");
		break;
// 3)
	default:
    	System.out.println("월을 잘못 입력하셨습니다.");
}

1) month=3이면 case 3에 해당하는 println()을 실행 후 break를 만나 switch문을 빠져나온다. case 4와 5도 마찬가지다.

2) 계절이 같을 때 수행하는 문장도 같으므로 위의 코드처럼 같은 문장을 수행하는 case끼리 이어서 쓸 수도 있다. 봄에 해당하는 case 3~5도 마찬가지다.

3) 1~12를 입력하지 않은 경우 default의 내용을 수행하게 된다. println() 실행 후 더 이상의 코드가 없기 때문에 switch문을 빠져나오게 된다. 그래서 break를 굳이 안 써도 된다는 것이었다.

4) 입력을 1~12까지만 한다고 하면, 마지막 부분을 바꿔 쓸 수 있다.

// month: 월을 나타내는 int 변수

switch(month) {
	// 생략
	case 9: case 10: case 11:
		System.out.println("가을입니다.");
		break;
	default:
		System.out.println("겨울입니다.");
}

이 코드를 if문으로 바꿔보면 다음과 같다.

// month: 월을 나타내는 int 변수

if (3 <= month < 6)
	System.out.println("봄입니다.");
else if (6 <= month < 9)
	System.out.println("여름입니다.");
else if (9 <= month < 12)
	System.out.println("가을입니다.");
else
	System.out.println("겨울입니다.");

만약 month=10이었다면 if문의 경우 조건식을 3번 계산해야 하지만 switch문은 조건식을 1번만 계산하면 된다. 그래서 처리해야 하는 경우의 수가 많을 때 if문보다는 switch문이 더 낫다.

 

이렇게 유용한 swith문은 if문으로 바꿔 쓸 수 있다. 하지만 모든 if문을 switch문으로 바꿀 수는 없다. switch문의 제약조건 때문이다.

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

  - if의 조건식의 결과는 true 또는 false이다.

  - 2가지 값으로 모든 경우를 표현하긴 힘들어서 switch문에서는 결과를 여러 개로 나눌 수 있는 타입을 선택했다.

  - 그래서 선택한 것이 바로 정수와 문자열이다.

  - 문자열의 경우 JDK 1.7부터 적용되었다.

2. case의 값은 정수 상수, 문자열만 가능하고, 중복되어서는 안 된다.

  - 정수 상수가 된다는 말은 문자('A'=65)도 된다는 뜻이다.

  - 상수만 된다는 말은 변수는 안 된다는 뜻이다.

  - case의 값이 중복될 경우, 어떤 case문을 수행할지 결정할 수 없기 때문이다.

int x, y; // 정수 변수 x, y
final int MAX = 200; // 상수 MAX
// 중략...
switch (x){
	case '0':	// OK. 문자
	case MAX:	// OK. 정수 상수
	case "Hi":	// OK. 문자열
	case y:		// 에러. 변수
	case 3.0:	// 에러. 실수
	// 생략...
}

조건문을 만들 때 if문으로 생각해본 후, switch의 제약조건에 위배되지 않으면 switch로 코딩하면 된다.

'Java' 카테고리의 다른 글

제어문 (2) 반복문 - while, do-while  (0) 2022.01.08
제어문 (2) 반복문 - for  (0) 2022.01.07
제어문 (1) 조건문 - if, else if, else  (0) 2022.01.04
제어문과 블록, 특별한 키워드  (0) 2022.01.03
조건 연산과 대입 연산  (0) 2022.01.01