Java

Java 기초(While, Do ~ While) - AWS 풀스택 과정 3일차

awspspgh 2024. 7. 17. 18:19

오늘은 while, do ~ while에 대해 배워보겠습니다.

 

목차
1. while
2. printf
3. do ~ while
4. 다중 for문
5. 예제 문제
6. 느낀점

 

 

1. while

		/* while문
		 * 횟수가 일정하지 않을 경우 사용
		 * while(조건식) {
		 *   실행문;
		 *  }
		 *  while문은 반드시 실행문 안에 조건식이 false가 될 수있는 식을 포함해야 함.
		 */
		
		// 1 ~ 10까지 출력
		for (int i = 1; i <= 10; i++) {
			System.out.print(i + " ");
		}
		System.out.println();
		
		//while
		int i = 1; // 사용할 변수 미리 초기화
		while(i <= 10) {   // true가 되어야 실행
			System.out.print(i + " ");
			i++;
		}
		System.out.println();

 

while문에서 사용할 변수는 for문과 다르게 변수를 while 밖에서 호출을 하기에 다른 while문에 사용할 변수는 그 전에 쓰인 변수와는 다른 이름으로 하거나 변수의 값을 초기화해야 합니다.

 

(1) 짝수 출력하기

		// while문을 이용한 1 ~ 10까지의 짝수 출력
		
		i = 1;
		while (i <= 5) {
			System.out.print((i * 2) + " ");
			i++;
		}
		System.out.println();
		
		// if문을 활용한 다른 방법
		
//		i = 1;
//		while (i <= 10) {
//			if (i % 2 == 0) {
//				System.out.print(i);				
//			}
//			i++;
//		}

 

		/* 1 ~ 50까지의 짝수
		 * 출력값은 아래의 예시처럼 표시해야함
		 * 2 4 6 8 10
		 * 12 14 16 18 20
		 * ...
		 * 42 44 46 48 50
		 */
		
		int i = 1;
		while(i <= 25) {
			System.out.print((i * 2) + " ");
			if ((i * 2) % 10 == 0) {
				System.out.println();
			}
			i++;
		}

 

2. printf

		/* println : 줄바꿈이 있는 출력
		 * print : 줄바꿈이 없는 출격, 출력값이 없으면 error <- System.out.print();
		 * printf : 지시자를 이용한 출력
		 * 
		 * 지시자
		 * %d(정수형), %f(실수형), $c(문자), %s(문자열), %n(줄바꿈)
		 * 소수점 설정 가능. 공백 추가 가능
		 */
		
		System.out.printf("%.2f%n", 1.6666666666);
		
		int num1 = 5;
		int num2 = 3;
		// 5 + 3 = 8
		System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));
		System.out.printf("%d + %d = %d%n", num1, num2, (num1 + num2));

 

3. do ~ while

		/* do {
		 *  실행문;
		 *  } while(조건식);
		 *  
		 *  - 실행문을 먼저 실행하고, 조건식을 비교하여 반복을 결정하는 구조
		 *  - for, while문은 조건식을 먼저 비교하기 때문에 조건식 false면 한 번도 실행되지 않을 수 있음.
		 *  - do ~ while문은 무조건 1번은 거치고 난 후 비교.
		 */
		
		Scanner scan = new Scanner(System.in);
		// 한 글자 입력 후 출력, y를 입력하면 종료
		
		char ch = 'a';
		
		do {
			System.out.println("한 글자 입력 > ");
			ch = scan.next().charAt(0);
			System.out.println(ch);
		} while(ch != 'y');
		System.out.println("종료~!!");
	
		
		scan.close();

do 안에 있는 변수(지역변수)는 while이 인지하지 못하기에 do ~ while에서 변수를 사용한다면 괄호 밖에서 변수를 선언하는 것이 편합니다. 

 

(1) 메뉴 구성하기

		/* 메뉴 구성
		 * do ~ while()문은 많이 사용함.
		 * menu
		 */
		
		Scanner scan = new Scanner(System.in);
		
		int menu = 0;
		
		do {
			System.out.println("--menu--");
			System.out.println("1.저장하기|2.새로만들기|3.종료하기");
			System.out.println("menu >>");
			menu = scan.nextInt();
			
			switch(menu) {
			case 1:
				// 실제 기능 처리
				System.out.println("저장되었습니다.");
				break;
			case 2:
				System.out.println("새로만들었습니다.");
				break;
			case 3:
				System.out.println("종료합니다.");
				break;
				default:
					System.out.println("잘못된 메뉴");
			}
		}while(menu !=3);
		System.out.println("종료!");
        
        scan.close();

 

(2) 계산기 만들기

    /* 숫자 2개를 입력 받고, 메뉴를 출력
     * menu
     * 1.+ | 2.- | 3.* | 4./ | 5.% | 6.종료
     * menu에 따라서 두 수의 연산 결과를 출력
     * num1 = 5 num2 = 3    
     * 1 => 5 + 3 = 8
     * 2 => 5 - 3 = 2
     */

    Scanner scan = new Scanner(System.in);

    // 정수 입력
    System.out.println("정수 2개를 입력해주세요.");
    int num1 = scan.nextInt();
    int num2 = scan.nextInt();
    int menu = 0;

    do {
        System.out.println("--menu--");
        System.out.println("1.+ | 2.- | 3.* | 4./ | 5.% | 6.종료");
        menu = scan.nextInt();
        int res = 0;
        char op = ' ';
        if (((menu == 4) || (menu == 5)) && num2 == 0) {                 // 0으로 나누려할 시
            System.out.println("0으로 나눌 수는 없습니다.");
        } else if (menu >= 1 && menu <= 6) {
            switch(menu) {
            case 1:
                res = num1 + num2;
                op = '+';
                break;
            case 2:
                res = num1 - num2;
                op = '-';
                break;
            case 3:
                res = num1 * num2;
                op = '*';
                break;
            case 4:
                res = num1 / num2;
                op = '/';
                break;
            case 5:
                res = num1 % num2;
                op = '%';
                break;
            case 6:
                continue;
            default:
                System.out.println("잘못된 입력값입니다.");
                continue;
            }
            System.out.println("1 => " + num1 + op + num2 + "=" + res);
        }
    }while(menu != 6); 

    System.out.println("종료합니다.");


    scan.close();

 

4. 다중 for문

		// 다중 for문
		
		
		for(int i = 1; i <= 5; i ++) {
			for(int j=1; j <= 5; j ++) {
				System.out.print(j + " ");
			}
			System.out.println();
			System.out.println("---------");
		}

 

◉ 다중 for문을 활용해서 출력하기

 

(1) 별 찍기

		// 별 찍기
		/* *****
		 * *****
		 * *****
		 * *****
		 * ***** 
		 */
		
		
		for(int i = 1; i <= 5; i ++) {
			for(int j=1; j <= 5; j ++) {
				System.out.print('*');
			}
			System.out.println();
		
		}

 

(2) 별 찍기

		/* *
		 * **
		 * ***
		 * ****
		 * ***** 
		 */
		
		for(int i = 1; i <= 5; i ++) {
			for(int j=1; j <= i; j ++) {
				System.out.print('*');
			}				
			
			System.out.println();
		
		}

 

(3) 별 찍기

		/* *****
		 * ****
		 * ***
		 * **
		 * *
		 */
		
		for(int i = 1; i <= 5; i ++) {
			for(int j=1; j <= (6 - i); j ++) {
				System.out.print('*');
			}				
			
			System.out.println();
		
		}
		
		
		System.out.println("---------------");

 

(4) 숫자 나열하기

		/* 1 2 3
		 * 4 5 6
		 * 7 8 9
		 * 3개씩 3줄 출력
		 */
		
		int count = 0;
		for(int i = 1; i <=3; i ++) {
			for(int j = 1; j <= 3; j ++) {
				count++;
				System.out.print(count + " ");
			}
			System.out.println();
		}

 

(5) 소수 출력하기

		Scanner scan = new Scanner(System.in);
        
        System.out.println("숫자를 입력해주세요. >> ");
		int num = scan.nextInt();
		
		int cnt = 0;
		for(int i = 1; i <= num; i ++) {
			if(num % 1 == 0) {
				cnt ++;
			}
		}
		
		if(cnt == 2) {
			System.out.println(num + "소수입니다.");
		} else {		
			System.out.println(num + "소수가 아닙니다.");
		}
        
        scan.close();

 

5. 예제 문제

◉ 문제 1번

		/* up/down game
		 * 1 ~ 50사이의 랜덤수를 생성하여 플레이어가 맞추는 게임.
		 * 컴퓨터가 랜덤수를 생성하였습니다. => 23
		 * 입력 > 10
		 * 결과 > up!
		 * 입력 > 30
		 * 결과 > down~
		 * 입력 > 23
		 * 정답!! 종료
		 */

 

◉ 문제 2번

		// 과제 제출
		/* 주사위 게임
		 * 주사위를 던져서 총 30칸을 이동 (Enter = 주사위 굴림)
		 * 주사위는 랜덤으로 생성(1~6까지 생성)
		 * 주사위 : 3
		 * 3칸 전진 => 27칸 남았습니다.
		 * ...
		 * 도착 ~ !! 총 횟수 : 10회 <= 주사위를 던진 횟수
		 */

 

◉ 문제 3번

		// 2부터 100까지 중 소수만 출력

 

정답:

◉ 문제 1번

		Scanner scan = new Scanner(System.in);
		
		// 랜덤수 생성
		int ran = (int)(Math.random()*50)+1;
		
		// 게임
		System.out.println("up / down game start~~!!");
		System.out.println("1 ~ 50사이의 숫자를 생성하였습니다.");
		
		while (true) {
			System.out.println("정답을 입력해주세요.");
			int msg = scan.nextInt();
			if (msg == ran) {
				System.out.println("정답!! 축하드립니다.");        // 정답
				System.out.println("게임을 종료합니다.");
				break;
			} else if ((msg > 50) || (msg < 0)) {
				System.out.println("입력된 숫자가 범위를 벗어났습니다.");     // 1 미만, 50 초과의 수를 입력할 시
			} else if (msg < ran) {
				System.out.println("Up!");
			} else if (msg > ran) {
				System.out.println("Down~");
			} else {
				System.out.println("잘못 입력되었습니다.");
				System.out.println("게임을 종료합니다.");
				break;
			}	
		}
		
		
		scan.close();

 

◉ 문제 2번

		Scanner scan = new Scanner(System.in);
		
		System.out.println("주사위 게임");
		System.out.println("주사위를 굴러 30칸까지 가세요!");
		
		int block = 0;   // 몇 칸
		int count = 0;   // 횟 수
		
		while(block < 30) {
			System.out.println("주사위 굴리기(Enter)");
			scan.nextLine();             // 주사위 굴리기
			int ran = (int)(Math.random()*6)+1;
			block += ran;
			count ++;
			System.out.printf("주사위 : %d", ran);
			System.out.println(" ");
			int res = (30 - block) < 0 ? 0 : (30 - block); // -n칸 방지용
			System.out.printf("%d칸 전진 => %d칸 남았습니다.", ran, res);
			System.out.println(" "); 				
		}
		
		if (block > 30) {
			System.out.printf("도착 ~ !! 주사위 굴린 횟수: %d번", count);
			System.out.println(" ");			
		}
		
		scan.close();

 

◉ 문제 3번

    Scanner scan = new Scanner(System.in);

    int count = 0;

    for (int i = 2; i <= 100; i ++) {
        for (int j = 1; j <= i ; j ++) {
            if (i % j == 0) {
                count ++;
            }		
        }		
        if (count == 2) {
            System.out.print(i + " ");
        }
        count = 0;
    }


    scan.close();

 

6. 느낀점

오늘 문제들을 풀면서 예전에 배웠던 개념들이 기억이 잘 안나서 문제들을 푸는 중간중간마다 어떻게 해결해야할 지 고민을 했었다. random, nextLine과 같은 많이 다루지 못했던 용어들을 위주로 복습을 해야 한다고 생각하게 되었다.