Java

Java 기초(Switch, For) - AWS 풀스택 과정 2일차

awspspgh 2024. 7. 16. 18:10

이번에는 switch, for문에 대해서 배워보도록 하겠습니다.

 

목차
1. switch
2. Math
3. for문
4. break
5. continue
6. 예제 문제
7. 느낀점

1. switch

/* 조건문 : if, switch문
		 * switch : 값에 따라 케이스를 달리주는 형식
		 * switch(변수/식) {
		 * case 값1: 실행문;
		 *  break;
		 * case 값2: 실행문;
		 *  break;
		 * case 값3: 실행문;
		 *  break;
		 *  ...
		 * default: 실행문;
		 *  break;
		 * }
		 * break; switch문을 빠져나갈 때 사용
		 */
		
		int num = 5;
		switch(num % 2) {
		case 0:
			System.out.println("짝수");
			break;
		case 1:
			System.out.println("홀수");
			break;
		default:
			System.out.println("잘못된 입력!!");
			break;
		}
		
		// week 월화수목.. 요일을 나타내는 변수 (1~7)
		int week = 1;
		switch(week) {
		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;
		default:
			System.out.println("error");
			break;
		}
		
		// 12, 1, 2 => 겨울 / 3,4,5 => 봄 / 6, 7, 8 => 여름 / 9, 10, 11 => 가을
		int month = 3;
		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;
		}

 

Switch의 경우에는 if문과 유사한 방식입니다. 하지만 Switch의 경우에는 break가 필요합니다. (default 제외)

 

2. Math

	public static void main(String[] args) {
		// Math 클래스 : 수학과 관련된 함수
		// Math.round(값) : 반올림 (소수 자리는 무조건 0)
		// Math.ceil(울림) / Math.floor(버림)
		
		double num = 3.14159;
		
		int res = (int)Math.round(num); // return long
		System.out.println(res);
		
		double res1 = Math.ceil(num); // return double
		System.out.println(res1);
		
		int res2 = (int)Math.floor(num);
		System.out.println(res2);
		
		// Math.max(최대값) Math.min(최솟값)
		
		int a = 5;
		int b = 10;
		
		System.out.println(Math.max(a, b));
		System.out.println(Math.min(a, b));

 

Math.random()

 

		// Math.random(); : 0과 1사이의 아무값을 출력
		// (int)(Math.random()*10)+1
		// (int)(Math.random()*개수)+시작값
		System.out.println((int)(Math.random()*10)+1);
		// 0~9까지의 랜덤수 추출

Python과는 다르게 Java에서는 random에 개수와 시작값을 조정해야 정수로 출력할 수 있습니다.

 

3. for문

// 반복문 : for, while, do~while
		/* for, while 동작 방식이 같음.
		 *  - 조건이 맞지 않으면 1번도 실행되지 않을 수 있음.
		 * do while : 비교 순서가 다름.
		 *  - 조건에 맞지 않아도 1번은 실행됨.
		 *  
		 *  for(1초기화; 258조건식; 47증감식){
		 *  36실행문;
		 *  }
		 *  반복문을 빠져나온 후 처리 값;
		 *  
		 *  - 초기화 : 조건식이나, 실행문에서 사용할 변수 초기화(생락가능)
		 *            여러 변수 초기화 가능. 처음 1번만 실행
		 *  - 조건식 : 반복을 결정하는 식 (true = 반복) (생략가능)
		 *  - 증감식 : 조건식에서 사용할 변수를 증감시켜 반복횟수를 결정 (생략가능)
		 */
         
		int i = 0;
		for(; i <= 10; i++) {
			System.out.println(i + " ");
		}
		System.out.println(); //줄바꿈
		System.out.println(i);

		for(int i = 10; i >= 1; i--) {
			System.out.print(i + " ");
		}

for문에 사용되는 변수는 for문 안({...})에서만 이용되고 밖에서는 이용되지 않습니다.

 

반복문

 

 

for문을 활용해서 구구단, 약수, 최대 공약수, 최소 공배수를 출력해도록 하겠습니다.

 

(1) 구구단

		// dan을 입력 받아 해당 단의 구구단을 출력
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println("몇 단?");
		int dan = scan.nextInt();
		
		for (int i = 1; i <= 9; i++) {
			int mul = dan * i;
			System.out.println(dan + " * " + i + " = " + mul);
		}

 

(2) 약수

		/* num의 약수를 출력
		 * 약수 : 나누어 떨어지는 수
		 */
		
		int num = 12;
		for (int i = 1; i <= num; i++) {
			if (num % i == 0) {
				System.out.print(i + " ");
			}
		}

 

(3) 최대 공약수

		/* 공약수 : 공통된 약수
		 * 최대 공약수 : 공약수 중에 가장 큰 수
		 */
		
		int a = 6;
		int b = 12;
		int c = 0;
		for (int i = 1; i <= a; i++) {
			if ((a % i == 0) && (b % i == 0)) {
				System.out.print(i + " ");
				c = i;					
			}
		}
		System.out.println("최대 공약수: " + c);

 

(4) 최소 공배수

		/* 최소 공배수 구하기
		 * 10 배수 : 10 20 30 ...
		 * 15 배수 : 15 30 45 ...
		 * 공통된 배수 : 30 60 90 ...
		 */
		
		int a = 10;
		int b = 15;
		
		for (int i = 1; ; i++) {
			if ((a * i) % b == 0) {
				System.out.println("최소 공배수: " + (a * i));
				break;
			}
		}

 

 

4. break

기존의 break;는 break;를 직접적으로 감싸고 있는 반복문만 빠져 나올 수 있었습니다. 하지만 반복문에 이름 붙이면 break; 감싸고 직접적으로 감싸고 있는 반복문이 아닌 간접적으로 감싸고 있는 반복문 즉, 다른 반복문을 빠져 나올 수 있습니다.

		/* break; 문은 자신을 감싸고 있는 가장 안쪽 반복문만 벗어남.
		 * 중첩 for문일 경우 for문에 이름을 붙일 수 있음.
		 * break는 원하는 for문의 이름으로 벗어날 수 있음.
		 */
		
		int i = 0;
		f: for(;;) {
			for(;;) {
				for(;;) {
					i++;
					if(i==10) {
						System.out.println(i);
						break f;
					}
				}
			}
		}

 

 

5. continue

		// continue : skip 개념
		
		// 1 ~ 10까지 출력 5는 빼고 출력
		
		for(int i = 1; i <= 10; i++) {
			if(i == 5) {
				continue;	//조건에 맞다면 뒷 문장으로 건너뛰어라.			
			}
			System.out.print(i + " ");
		}

출력값은 1 2 3 4 6 7 8 9 10으로 5를 제외한 정수가 나옵니다. 그렇다면 continue를 활용하여 짝수를 구해보겠습니다.

 

		// 1 ~ 10까지중 짝수만 출력
		for(int i = 1; i <= 10; i++) {
			if(i % 2 ==1) {   // i % 2 != 0
				continue;				
			}
			System.out.print(i + " ");
		}

 

 

 

 

6. 예제 문제

◉ 문제 1번

// 과제 제출
		/* 정수 2개와 연산자 1개를 입력받아 두 정수의 연산을 출력
		 * ex) 2 3 + => 2 + 3 = 5
		 * ex) 2 0 / => 2 / 0 => 입력값 잘못 메세지 출력
		 * 연산자는 + - * / % 나머지는 잘못된 연산자로 처리
		 * String == 비교 불가능, char == 비교 가능
		 */

 

◉ 문제 2번

		/* 한 글자를 입력 받아 글자를 출력
		 * 종료하시겠습니까? (Y/N) => 반복문 종료
		 */

 

정답:

◉ 문제 1번

System.out.println("두 정수 와 연산자를 입력해주세요. (정수 연산자 정수) >> ");
		int num1 = scan.nextInt();
		char op = scan.next().charAt(0);
		int num2 = scan.nextInt();
		int res = 0;
		
		if((op == '/' || op == '%') && num2 == 0) {
			System.out.println("잘못된 입력값입니다.");
		} else {
			switch(op) {
			case '+': res = num1 + num2; break;
			case '-': res = num1 - num2; break;
			case '*': res = num1 * num2; break;
			case '/': res = num1 / num2; break;
			case '%': res = num1 % num2; break;
			default : System.out.println("잘못된 연산자");
			}
			System.out.println("" + num1 + op + '=' + res);

※ String에 대하여

int로 String에 있는 숫자를 찾아낼려고 해도 문자가 있다면 String에 아무리 숫자가 많아도 문자로 판정이 되기에 오류가 생깁니다. String이 같은지 물어보는 것은 String의 주소를 물어보는 것과 같다는 것입니다. 또한 출력할 때의 " "와 ' '의 차이점도 알아두셔야 합니다. " "은 String, ' '은 Char입니다. 예시를 들자면  "+" 은 문자를 나타내고, '+'은 char이기에 유니코드에 있는 숫자로 바꿉니다. 따라서 숫자로 나오게 됩니다. 이

//		String a1 = new String("ab");
//		String a2 = new String("ab");
//		String a ="ab";
//		String b ="ab";
//		System.out.println(a1==a2);  //false 처음부터 주소지가 다르기에
//		System.out.println(a1.equals(a2)); // true 객체의 값만 비교함
//		System.out.println(a==b);    //true  값이 같기에 주소를 복붙

 

◉ 문제 2번

		Scanner scan = new Scanner(System.in);
		
		int i = 0;
		
		f: for (;;) {
		    // 글자 입력
			System.out.println("한 글자를 입력하시오.");
			char msg1 = scan.next().charAt(0);
			System.out.println("입력된 글자 >> " + msg1);
			
			// 종료
			System.out.println("종료하시겠습니까? (Y/N)");
			char msg2 = scan.next().charAt(0);
				if ((msg2 == 'y') || (msg2 == 'Y')) {
					System.out.println("종료합니다.");
					break f;
				} else if ((msg2 == 'n') || (msg2 == 'N')) {
					continue;
				} else {
					System.out.println("잘못 입력되어 종료합니다.");
					break f;
				}
		}

 

7. 느낀점

String과 char의 차이점을 명확하게 알지 못하여 예제 문제에서 연산자를 이용한 Switch 활용한 문제를 풀 때 발생한 오류의 정확한 원인이 무엇인지 찾지 못했었던 점이 너무 아쉬웠다. 하지만 원인을 알게 되면서 String과 char의 정확한 차이점을 알게 되었다. 앞으로는 print를 통해서 출력을 할 때  " "와 ' '를 잘 구분해서 사용해야 겠다는 생각을 하게 되었다.