본문 바로가기
국비 교육/백엔드(Java, Spring)

[자바] 연산자 Operator -2, Switch

by 육츠 2024. 1. 17.
Contents 접기

+ 다양한 역할을 하는 연산

연산자 역할 예시
+ 단항 = 부호 유지
이항 = 덧셈
문자열 = 결합
10 + " " = "10" 
"내 나이" + 25 = "내 나이25 " 
"12"+"13" = "1213"
10-20+"30" == "1030"
x+y -10 = "1213"-10 // 오류
- 단항 = 부호 변경
이항 = 뺄셈
-
++ / -- 변수의 값을 1 증가/ 1 감소 (예시 : + 의 경우)
++x  = 우선순위 : 2순위
x ++ = 우선순위 : 최하위 

증감연산자 예시 문제

문제 정답 문제 정답
int x = 1;
int y = 0;
y = ++x;
x = 2, y = 2 int x = 1;
int y = 0;
y = x++;
x = 2, y = 1
y > ++x; 증가 후 비교 y > x++; 비교 후 증가

특징

- if문과 유사하지만 그 결과가 일치할때 사용할 수 있다.
- switch문의 괄호 안에는 정수형과 문자열만 가능하다.

#1 전통적인 swich 문

public class SwitchTest01 {

	public static void main(String[] args) {
		int score = 100;
		String clz = ""; // 데이터를 무언가(주소값) 참조하고 있다   // = String s2 = new String();
		//  null :아무것도 참조하고 있지 않다. 
		
		switch (score / 10) {
		// 100 점은 F가 된다. 옆에 코드를 없애 case 9의 코드를 공유하게 된다.
		
		case 10: case 9: clz = "A학점"; break; 
		//  break : 스위치 { } 밖으로 빠져 나감
		case 8: clz = "B학점"; break;
		case 7: clz = "C학점"; break;
		case 6: clz = "D학점"; break;
		default : clz = "F학점"; 
		
		}
		System.out.println(clz);
		
		
	}

}
코드 특징
case 10: case 9: clz = "A학점"; break;  case 9: clz = "A학점"; break; 
이렇게만 case문이 존재한다면 100 점은 F가 된다.
case 10: 의 코드를 없애 case 9: 의 코드를 공유하여 사용해서 100점도 'A학점'을 받게 하는 것이다.

 

# 2 여러가지 경우의 수 +  break 유무 체크

만약 전부 대문자인 경우도 넣고 싶다면 case 를 추가하는 것이 아닌 전부 소문자로 만들어 한 경우만을 체크.

public class SwitchTest02 {

	public static void main(String[] args) {
		String family = "Father";
		
		switch (family) {
		case "father" : case "Father" : System.out.println("아버지");break;
		case "Mother" : System.out.println("어머니");break;
		case "Brother" : System.out.println("남자형제");break;
		case "Sister" : System.out.println("여자형제");break;
		default : System.out.println("Who?");
		
		}
		
		int value = 0;
		String result = "";
		
		switch(value) {
		case 0 : result += "*";
		case 1 : result += "^";
		case 2 : result += "^";
		case 3 : result += "*";
		}
		System.out.println(result);  // 문자열에 + 니까 *^^* 전부 결합됨
	}

}

 

# 3 lambda 와 yield

switch 연산 (자바 12버전에서 추가됨)
lambda 연산자와 함께 사용할 때에는 break가 필요없다.
switch문을 연산식으로 사용할 때에는 문장 끝에 세미콜론(;)을 삽입해야한다.

1) lambda 연산식(->) 사용

public class SwitchTest03 {

	public static void main(String[] args) {
		String yoil = "월";
		
		switch(yoil) {
		case "월", "수","금" -> System.out.println("요가");
		case "화", "목","토" -> System.out.println("수영");
		default -> System.out.println("달리기");
		}

요가

 

2) 연산식으로 사용

		String result = switch(yoil) {
		case "월", "수","금" -> "요가";    // 값만 지정
		case "화", "목","토" -> "수영";
		default -> "달리기";
		};
		
		System.out.println(yoil + "요일 운동: " + result);

월요일 운동: 요가

 

3) yield 문 사용

yield 는 switch 식의 변수에 대입할 값이 있을 때 치환하는데 사용한다.

		double calories = 0;
		calories = switch(yoil) {
		case "월", "수","금" : 
			System.out.println(yoil + "요일 운동: 에어로빅"); 
			yield 664.5;
		case "화", "목","토" :
			System.out.println(yoil + "요일 운동: 수영");
			yield 528;
		default : 
			System.out.println(yoil + "요일 운동: 없음"); 
			yield 1200;
		};
		 System.out.println("소비칼로리"+ calories + "kcal");
         
   	}
	
}

월요일 운동: 에어로빅
소비칼로리664.5kcal

 

[문제] 두 개의 정수값을 입력받고, 연산 종류를 입력 받아 결과를 출력

<실행 예시>
두개의 정수 입력: 10 20
1. 덧셈
2. 뺄셈
3. 곱셈
4. 나눗셈
------------
선택 : 2
 
결과 : -10

 

기본 상태

import java.util.Scanner;

public class Exam12 {

	public static void main(String[] args) {
		
		int num1, num2;
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("두 개의 정수 입력: ");
		num1 = scanner.nextInt();
		num2 = scanner.nextInt();
		
		System.out.println("\n1. 덧셈");
		System.out.println("2. 뺄셈");
		System.out.println("3. 곱셈");
		System.out.println("4. 나눗셈");
		System.out.println("------------");
		System.out.print("선택: ");

 

#1 lambda

scanner.next(); : 문자열 입력받는 방법이다.

result 값이 초기화되지 않은 경우가 생길 수 있다.
때문에 처음에 선언 + 초기화를 함께하면 된다.

		String choice;
		double result=0;
		choice = scanner.next(); //문자열 입력
		
		switch(choice) {
		case "1" -> result = num1 + num2;
		case "2" -> result = num1 - num2;
		case "3" -> result = num1 * num2;
		case "4" -> result = num1 / (double)num2;
		default -> {
			System.out.println("키 입력이 잘못 되었습니다.");
			System.exit(0);
			// result 값이 초기화되지 않은 경우가 생길 수 있다. 때문에 처음에 선언 + 초기화를 함께하면 됨
			}
		}
		System.out.println("결과: "+ result);

 

#2 연산

default  없으면 오류 (반드시 필요!)

		int choice;
		double result;
		
		choice = scanner.nextInt();
		
		result = switch(choice) {
		case 1 -> num1 + num2;
		case 2 -> num1 - num2;
		case 3 -> num1 * num2;
		case 4 -> num1 / (double)num2;
		default -> 0; // 없으면 오류 
		};
		
		System.out.println("결과: "+ result);

 

#3 yield

case 2 와 같은 값을 갖는 경우 오류인지 결과물인지 알 수 없음. 

		String choice;
		choice = scanner.next();
		String result;
		
		result = switch(choice) {
		case "1" -> ((num1 + num2) + "");
		case "2" -> ((num1 - num2) + "");
		case "3" -> ((num1 * num2) + "");
		case "4" -> ((num1 / (double)num2) + "");
		default -> "오류"; // 없으면 오류 
		};
		
		System.out.println("결과: "+ result);

 

오류 임을 알려주려면? 

>> 결과 값을 String으로 받아온다.

'국비 교육 > 백엔드(Java, Spring)' 카테고리의 다른 글

[자바] 입력 버퍼 (Buffer)  (0) 2024.01.18
[자바] 반복문 -1 (While)  (0) 2024.01.17
[자바] 키보드로부터 입력  (0) 2024.01.16
[자바] 자바 기초 -2  (0) 2024.01.16