자신에게 친절할 것 :)

Web Developing/Java

[Java] 조건문과 반복문: if, if else if, switch문 // for, while, do-while문

Tashapark 2024. 3. 29. 17:10
728x90

// 남궁 성의 자바의 정석 듣는 중//

 

- 반복문은 여러번 실행될 수도 아예 안될 수도 

- 조건문 , 반복문 => 제어문  flow control statement

 

- 블럭은 그 다음 문장 1개까지만 안 써도 포함 됨. 그 이상이면 블럭을 써줄 것. 

 

- 절대로 2개가 실행될 수는 없음

 

- 사실 'B'의 경우 조건식에 && score < 90 이 추가되어야 하지만, 나머지도 마찬가지로 위에서 벌써 거짓이라고 판단이 된 경우만 적용되기 때문에 굳이 식에 추가 안해줘도 됨. 

 

int score = 0; //점수 저장을 위한 변수
		char grade = ' '; // 학점 저장을 위한 변수. 공백으로 초기화
		// 값을 만약에 D로 넣어주면, 밑에 else코드 빼도 됨. 어차피 다 아니면 D가 될 테니깐.
		//else는 써도 되는 데 최대한 안쓰도록 고민해볼것. 
		System.out.print("점수를 입력하세요.");
		Scanner scanner = new Scanner(System.in);
		score = scanner.nextInt(); // 화면을 통해 입력받은 숫자를 score에 저장

		if (99>=90) { //score가 90점보다 같거나 크면 a학
			grade = 'A';
		}else if (score >= 80) {
			grade = 'B';
		}else if (score >= 70) {
			grade = 'C';
		}else {
			grade = 'D';
		}

		System.out.println("당신의 학점은" + grade + "입니다.");

 

- 리팩토링 시 else를 최대한 안 쓰도록 고민할 것.

 

- 괄호를 꼭 넣어줄 것. 어디에 해당되는 것인지 헷갈리니깐. 

- 변수 설정에서 비워놓지 말고 걍 else 값을 준다고 생각하면 맘이 편할 듯. 

 

- 처리해야 하는 경우의 수가 많을 땐 걍 switch 문을 쓰는 게 나음. 

- 각 case는 식이 아니라 값임. 

- case의 문장들은 break를 만날 때까지 계속 수행되는 데 다음에 다른 case가 있더라도 상관없이, break가 나올 때까지 수행됨. 

- break를 만나거나, switch문의 끝을 만나면 switch문 전체를 나가는 것. 

- default는 해당되는 case가 없을 때 실행되는 값임. 거의 마지막에 쓰기 때문에, break를 안 쓰고. 걍 default문 자체를 안 써도 됨. 

 

- if문은 불리안이라서 계속 조건식을 추가해가면서 원하는 형태로 만들어줘야 하는데 switch문은 정수나 문자열로도 가능해서 길게 브라켓 사용해서 만들지 않아도 괜찮음. 

- 다만 제약 조건이 있기 때문에...

- 일단 if else if 문으로 만들고 난 후에 너무 복잡하다 싶으면 switch문으로 정리가 가능한지를 고민해 보는 게 좋음.

- switch문은 언제나 if else if문이 될 수 있지만, 반대는 항상 되는 게 아니기 때문에

 

- 정수 또는 문자열만 되는데, 문자열은 JDK 1.7부터 되는 중. 

- 변수 무조건 안됨. 

- final 붙으면 상수가 되는 거라서 갠춘. 

 

System.out.print("현재 월을 입력하세요.>");

		Scanner scanner = new Scanner(System.in);
		int month = scanner.nextInt();  //화면에서 입력받은 숫자를 month에 저장 

		switch(month) {
		case 3: case 4: case 5:
			System.out.println("현재 계절은 봄입니다.");
			break; // 브레이크 없으면, 봄이랑 여름 까지 같이 찍힘. 여름 break까지 이어지니깐. 
		case 6: case 7: case 8:
			System.out.println("현재 계절은 여름입니다.");
			break;
		case 9: case 10: case 11:
			System.out.println("현재 계절은 가을입니다.");
			break;
		default:
			//		case 12:	case 1: case 2:
			System.out.println("현재 계절은 겨울입니다.");
		}

- 14 입력해보니깐, 겨울로 찍힘. case에 없는 경우 무조건 default라서 그런듯. 

 

- 곱하는 값이 개별 값의 개수임...

- 이게 실수여서 .. 곱해주는 것이었구나.. 그냥 지금까지 냅다 length를 곱했는데...

		int num = 0;
		int num2 = 0;

		// 괄호 {} 안의 내용을 20번 반복 

		// -5 ~+5 사이의 난수 20개 출
		for (int i = 1; i <= 20; i++) {
			num = (int) (Math.random() * 10) + 1;// 1-10
			num2 = (int) (Math.random()*11)-5; //-5~5 => 0이 포함되서 총 11개 
			System.out.println(num);
			System.out.println(num2);
		}

- 실수로 만들어주는 과정에서 해당 값의 범위가 1개씩 줄어드는 것을 잊으면 x

 

- 반복 횟수를 알면 for문, 모르면 while문이 적합

- 2개씩 증가하려면 i=i+2

- 2배씩 증가하려면 i=i*2 => 즉, 원하는 조건식으로 아무거나 만들면 됨. 

 
	for (int j = 10; j >= 1; j--) { //{}안의 문장 3번 반
				//10 -> 1까지 찍도록 조건식을 무조건 조심할 것. 
				System.out.println(j);
		}
	for (int c =1, d=10; c <=10; c++, d--) {
				System.out.println("c = "+c+", d ="+d);
		} //여러 인자를 넣을 수 있고 ,로 구별 하면 됨

 

=> 둘 다 변수가  for문 안에 있기 때문에 SOP가 {} 안에 있어야 함. 

 

- for문 밖에서도 sop를 적용하고 싶으면, 전역 변수로 범위scope를 넓혀 줘야 함.

 int i; 
 //  for (; true ;)로 조건식을 생략하면, true로 간주되어서 무한반복문이 됨. true안 써도 됨 
 // 그럼 1무한히... 찍힘.. 
	 for (i=1; i <=10; i++) {
		 System.out.println("i="+i);
	 }
	 System.out.println(i);

- but, 변수의 범위는 좁을 수록 좋음. 

- 범위가 넓을 수록 에러 떴을 때 확인해야 하는 값이 많아지기 때문에, 필요한 수준으로만 줄일 것. 

- scope범위: 선언 위치부터 선언된 블럭의 끝까지

- for문 모르겠으면 일단 냅다 써보고 나중에 for문으로 어떻게 바꿀지를 생각해보면 됨. 

 

- 무식하게 다 찍어도 되는 데 for문을 중첩되게 할 수 있음. 

- 붙였을 때는 print()고, block으로 만들 때는 println()인 것만 주의해서 할 것. 

	for(int i=2;i<=9;i++) {
			for(int j=1;j<=9;j++) {
				System.out.println(i+"*"+j+"="+(i*j));
			}
			System.out.println();
		} //구구단

 

- 위의 별 찍는 것 예제 

for (int i=1; i <=5; i++) { //줄 수 
			for (int j=1; j<=10; j++) { //옆으로 몇 개 
		System.out.print("*");
			}
			System.out.println();//아무것도 안넣으면 줄바꿈만 
		}

 

- 줄 개수당 늘어나게 하려면, i랑 j가 같게 해주면 됨. 

- 헷갈리면 직접 그려볼 것. 

for (int i=1; i <=10; i++) { //줄 수 
			for (int j=1; j<=i; j++) { //옆으로 몇 개 
		System.out.print("*");
			}
			System.out.println();//아무것도 안넣으면 줄바꿈만 
		}

 

 

- for문은 사실상 while문을 간결하게 한 것이라서 서로 100% 호환됨. 

- for문은 반복횟수를 알 때 사용이 가능함. while도 마찬가지긴 함. 

	int num = 0, sum = 0;
		System.out.print("숫자를 입력하세요.(:12345)>");

		Scanner scanner = new Scanner(System.in);
		String tmp = scanner.nextLine();  // 입력받은 내용 tmp 저장 
		num = Integer.parseInt(tmp);      // tmp를 숫자로 

		while(num!=0) {    
			// num을 10으로 나눈 나머지를 sum에 더함. 10으로 나누면 마지막 자리만 남음. 
			sum += num%10; 	// sum = sum + num%10; 
			System.out.printf("sum=%3d num=%d%n", sum, num);

			num /= 10;   // num = num / 10; 
		}

		System.out.println("각 자리수의 합:"+sum);
        
        //숫자를 입력하세요.(:12345)>12345 를 넣음
        //sum=  5 num=12345
        //sum=  9 num=1234
        //sum= 12 num=123
        //sum= 14 num=12
        //sum= 15 num=1
        //각 자리수의 합:15

 

- while문은 조건식이 먼저하고 블럭인데 do-while문은 블럭(do)을 앞으로 뺀 것. 

- while문은 조건을 충족하지 않으면 0번 실행임. 총 0~n번 블럭 실행

- but, do-while문은 1~n번 실행으로 충족하지 않아도 적어도 1번은 실행함. 

 

	int input  = 0, answer = 0;

		answer = (int)(Math.random() * 100) + 1; // 1~100 사이의 정수를 입력 
		Scanner scanner = new Scanner(System.in);

		do { //입력을 먼저 받고 
			System.out.print("1과 100사이의 정수를 입력하세요.>");
			input = scanner.nextInt();

			if(input > answer) {
				System.out.println("더 작은 수로 다시 시도해보세요.");	
			} else if(input < answer) {
				System.out.println("더 큰 수로 다시 시도해보세요.");			
			}
		} while(input!=answer); //값을 확인하는것 

		System.out.println("정답입니다.");

 

- 이런 경우 값을 처음에 입력 받아야 하는데 while문으로 만들면 조건을 보고 입력을 값을 출력하는 것을 2번 입력하게됨. 

- thus, 만약에 코드의 중복이 생긴다면 do-while문으로 바꾸는 것을 고려해볼 것. 

 

- sum 100 넘으면 break임.

- 언제 넘을 지 모르니깐 계속 반복하게 해놓고 브레이크시킴. 

- 브레이크는 자신이 속한 하나의 반복문을 벗어남

- while은 무조건 true를 써야 하지만, for는 (;;) 안 쓰거나, ;true; 써도 됨. 

 

 

- 특정 조건을 만족하면 건너 뜀. 그래서 3의 배수는 출력을 건너뛰고 다시 조건식으로 돌아간 것임. 

		int menu = 0;
		int num  = 0;

		Scanner scanner = new Scanner(System.in);

		while(true) { //무한 반복문 
			System.out.println("(1) square");
			System.out.println("(2) square root");
			System.out.println("(3) log");
			System.out.print("원하는 메뉴(1~3)을 고르세요. (종료:0)>");

			String tmp = scanner.nextLine(); // 화면에서 입력은 내용 tmp 저장 
			menu = Integer.parseInt(tmp);    // tmp 숫자로 변화 

			if(menu==0) {
				System.out.println("프로그램을 종료합니다.");
				break;
			} else if (!(1 <= menu && menu <= 3)) {
				System.out.println("메뉴를 잘못선택했습니다. (종료는 0)");
				continue;		
			}
			
			System.out.println("선택하신 메뉴는 "+ menu +"번입니다.");
		}

 

- 브레이크는 하나의 반복문만 벗어나기에, 반복문 앞에 이름을 붙여서 블레이크 뒤에 이름을 붙여줌. 

- 컨티뉴에도 쓸 수 있지만, 굳이 사용되지 않고, 대개 브레이크 뒤에 씀. 

- break인 경우엔 밖에 for문으로 넘어가니깐, j가 5 앞까지 i는 9가 될 때까지 반복해서 실행됨. 

2*1=2
2*2=4
2*3=6
2*4=8

3*1=3
3*2=6
3*3=9
3*4=12

4*1=4
4*2=8
4*3=12
4*4=16

5*1=5
5*2=10
5*3=15
5*4=20

6*1=6
6*2=12
6*3=18
6*4=24

7*1=7
7*2=14
7*3=21
7*4=28

8*1=8
8*2=16
8*3=24
8*4=32

9*1=9
9*2=18
9*3=27
9*4=36

 

728x90
반응형

'Web Developing > Java' 카테고리의 다른 글

[java] 배열2  (0) 2024.04.12
[Java] 배열  (0) 2024.04.02
[java] 비교연산자  (0) 2024.03.20
[java] 연산자 operator, 형변환, 사칙 연산자  (3) 2024.03.18
[java] 오버플로우, 타입 간 변화  (0) 2024.03.17