반복문

TIL·2022년 12월 10일
0

Java (최은빈)

목록 보기
11/27

while(조건문;)

  • 증감문 없으면 무한루프
    • 프로그램이 종료되지 않고(InputMismatchException) 사용자가 정상 입력할때까지 무한루프 돌릴 수 있다. (입력 예외 관리)
  • 조건식에 함수 올 수 있지만 반환값이 boolean 이여야 한다.
  • 수행문, 증감문의 순서
package me.day05.whiles;

import java.util.Scanner;

public class WhileExample {
    public static void main(String[] args) {

        //// 반복문 : 초기값, 조건문, 증감문 (횟수)
        // 첫번째가 5 - 0 = 5번 으로 가독성 제일 좋음! (0 <= i < 5 -> range = 5 - 0)
        // i = 5 일때 while 블록 밖으로 나온다.
        // 1
        int i = 0; // 초기값 (iteration = 반복), j, k
        while(i < 5) { // 조건문 (횟수)
            System.out.println("hello"); // 수행문
            i++; // 증감문
        }
        // 반복문 종료
        System.out.println("i = " + i); // i = 5
        System.out.println();

        // 2
        i = 1;
        while(i <= 5) {
            System.out.println("hello");
            i++;
        }
        System.out.println("i = " + i); // 6
        System.out.println();

        // 3
        i = 5;
        while(i > 0) {
            System.out.println("hello");
            i--;
        }
        System.out.println("i = " + i); // 0
        System.out.println();


        //// 증감문 없으면 무한루프
        Scanner scanner = new Scanner(System.in);
        scanner.nextInt(); // 문자열 입력 하면 InputMismatchException -> 프로그램 종료
        // 프로그램이 종료되지 않고 사용자가 정상 입력할때까지 무한루프 돌릴 수 있다. (입력 예외 관리)
        // 또는 특정 시간 주기 마다의 센서 데이터 수집, 크롤링을 위해 무한루프를 사용하기도 한다.


        //// 1 부터 10 까지의 합
        int sum = 0;

        i = 1; // 초기값
        while (i <= 10) { // 조건식 (11 - 1 = 10회) // i가 11이 되면 아래 두문장 실행 안시키고 while 블록 밖으로 나온다
            sum += i; // 수행문
            i ++; // 증감문
        }
        System.out.println("sum = " + sum); // 55

        //// 수행문과 증감문의 순서를 바꾼다면?
        sum = 0; // 다시 초기화
        i = 1;
        while (i <= 10) {
            i ++;
            sum += i; // sum = 0 + 2 + 3 + ...... + 10 + 11 // i = 2, 3, 4, ..., 10
        }
        System.out.println("sum = " + sum); // 65

        // 아래의 두개는 왜 결과가 동일 할까 -> i 를 사용 하지 않았기 때문
        i = 1;
        while (i <= 10) {
            System.out.println("hello"); // 10
            i++;
        }

        i = 1;
        while (i <= 10) {
            i++;
            System.out.println("hello"); // 10
        }

        //// 조건식에 함수 올 수 있지만 반환값이 boolean 이여야 한다.
        // 조건식의 함수가 false 라면 해당 함수는 실행 된걸까 안된걸까?? - 실행됨
    }
}



for(초기값; 조건문; 증감문;)

package me.day05.fors;

import java.util.Scanner;

public class ForExample { // while 은 3가지의 문장이 필요. 귀찮음
    public static void main(String[] args) {
        // 0 ~ 4
        for(int i = 0; i < 5; i++) { // i = 5 일때 out (5-0=5회)
            System.out.printf("[%d] hello\n", i);
        }
        System.out.println();

        // 1 ~ 5
        for(int i = 1; i <= 5; i++) { // 5회
            System.out.printf("[%d] hello\n", i);
        }
        System.out.println();

        // 5 ~ 1
        for(int i = 5; i > 0; i--) { // 5회
            System.out.printf("[%d] hello\n", i);
        }
        System.out.println();

//        System.out.println(i); // 지역변수, scope

        // 무한루프
        for(;;) {

        }

//        whlie (true) { // 컴파일 에러 위의 무한루프에 의해 unreachable 하므로
//
//        }
    }
}



looping example

  • 여러번 입력받기
  • 덮어쓰기
package me.day05.examples;

import java.util.Scanner;

public class LoopingExample {
    public static void main(String[] args) {
        //// 사용자에게 입력받은 5개의 정수 평균을 구하는 프로그램
        Scanner scanner = new Scanner(System.in);
        double average = 0.0; // 평균 저장할 변수 필요
        final int NUM = 5; // 두 문제 다 5회 이므로 final로 상수 처리
        int sum = 0;
        for (int i = 0; i < NUM; i++) {
            System.out.print("input num: ");
            sum += scanner.nextInt();
        }
        average = (double) sum / NUM; // 정수와 정수를 연산하면 정수가 나오는데 하나라도 실수로 바꾸면 실수 나옴
        System.out.println("average = " + average);
        System.out.println();

        //// 사용자에게 입력받은 5개의 정수 중 가장 최솟값 / 최댓값
        // 구하라는 값을 저장할 변수 필요
//        int min = 0;
//        int max = 0; // 10 20 30 40 50 입력해도 최소값 0
        int num = 0; // 입력값

        // 1. 첫번째 입력(i==0)을 min, max 로 초기화
//        if (i == 0) {
//            min = num;
//            max = num;
//        }

        // 2. 최소/최대값을 가장 큰/작은 값으로 초기화
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;

        // 덮어 쓰기
        for (int i = 0; i < NUM; i++) {
            System.out.print("input num: ");
            num = scanner.nextInt();

            if (min > num) min = num;
            if (max < num) max = num;
        }
        System.out.println("min = " + min);
        System.out.println("max = " + max);

        scanner.close();
    }
}



do while

  • 여러번 출력하기
  • while 과의 차이점 : 첫 조건이 틀려도 무조건 한번은 실행됨
  • do while 보다 무한루프 + breake 를 더 많이 사용한다.
    • 조건이 참일때 반복문 빠져 나옴 (조건 반대로 작성)
package me.day05.dowhile;

public class DoWhileExample {
    public static void main(String[] args) {

        // 일단 조건 보지 않고, 먼저 실행 후 조건은 나중에 검사
        int i = 0;
        do {
            System.out.println("hello");
            i++;
        } while (i < 3);
        System.out.println("i = " + i); // 3회 실행, i == 3 // 일반 while 과 동일
        System.out.println();;

        // while 과의 차이점 : 첫 조건이 틀려도 무조건 한번은 실행됨
        i = 0;
        do {
            System.out.println("hello");
            i++;
        } while (i < 0); // 조건이 참일때 수행문 동작
        System.out.println("i = " + i); // i == 1
        System.out.println();;

        // do while문 보다 무한 루프 더 많이 사용
        i = 0;
        while (true) {
            System.out.println("hello");
            i++;
            if (!(i < 0)) break; // 조건이 참일때 반복문 빠져 나옴 (조건 반대로 작성)
        }
        System.out.println("i = " + i); // 1회 실행, i == 1
        System.out.println();
    }
}



for break / for continue / while(true) break

  • 특정 조건의 값 입력 받으면 종료
  • break : 조건에서 반복 블록 종료
  • continue : 조건에서 반복 블록 종료X -> 아래 문장 (블록안) 무시
package me.day05.breaks;

import java.util.Scanner;

public class BreakContinueExample {
    public static void main(String[] args) {

        //// 1 ~ 10 까지 도는 반복문에서 3의 배수가 나오면 종료
        // 3 출력 안되고 break (2번 출력)
        for (int i = 1; i <= 10; i++) {
            if (i % 3 == 0) break; // 조건문 아닌 반복문 종료 // i == 3 일때 15번 아닌 17번 문장 실행
            System.out.println("i = " + i);
        }
        System.out.println("out of for");

        // 3 출력 되고 break (3번 출력)
        for (int i = 1; i <= 10; i++) {
            System.out.println("i = " + i);
            if (i % 3 == 0) break;
        }
        System.out.println("out of for");


        //// continue = 밑에 있는 문장 무시해라
        // 3, 6, 9 출력X (7번 출력)
        for (int i = 1; i <= 10; i++) {
            if (i % 3 == 0) continue; // i ==3 일때 수행문 실행하지 않고 반복문의 i++
            System.out.println("i = " + i);
        }
        System.out.println("out of for");

        // 10번 출력
        for (int i = 1; i <= 10; i++) {
            System.out.println("i = " + i);
            if (i % 3 == 0) continue; // 무시할 문장 없으므로
        }
        System.out.println("out of for");


        //// 사용자한테 문자 하나를 계속 입력받다가 q 가 나오면 종료
        // 입력받은 문자들을 문자열 순서대로 / 순서 반대로 합치기 ('a', 'b', 'c' => "abc" / "cba")
        // StringBuilder(하나의 공간에 누적), StringBuffer, reverse() 사용하면 문자열 연산(계속 새로운 공간 생성) 보다 메모리 절약

        Scanner scanner = new Scanner(System.in);
        while (true) {
            char ch = scanner.next().charAt(0);
//            str += ch; // 밑이 아니라 여기에 있다면 q 도 str 에 들어오고 반복문 종료
            if (ch == 'q') break;

            // 문자열로 합치기
            String str = "";
            String str2 = "";
            str += ch; // str에 ch 누적 // str = str + ch // 내부적으로 문자가 더 큰 문자열로 변경 후 결합됨
            str2 = ch + str; // 앞으로 붙이기
            System.out.println("str = " + str);
            System.out.println("str2 = " + str2);
        }

        scanner.close();

//        Scanner sc = new Scanner(System.in);
//        while (true) {
//            char ch = sc.next().charAt(i);
//            if(ch == "q") break;
//            i++;
//        }

        // 피연산자의 데이터 타입이 다르면 더 큰 타입을 따라간다
        // "" + 'a' -> "" + "a" -> "a"
        // "a" + 'b' -> "a" + "b" -> "ab"

    }
}



이중 for문

  • 구구단, 일차함수, palindrome, checker
  • 실행속도에 안좋으므로 지양하는 것이 좋다
  • 내부 반복문 종료 : break
  • 외부 반복문 종료 : break 2번 / return 1번
package me.day05.nested;

public class NestedLoopExample {
    public static void main(String[] args) {
        //// 구구단 출력 (2단 ~ 9단) // 네모
        // for
        for (int i = 2; i < 10; i++) { // 2 ~ 9
            for (int j = 1; j < 10; j++) { // 1 ~ 9
                System.out.printf("%d x %d = %d\n", i, j, i * j);
            }
            System.out.println();
        }
        System.out.println("==========================\n");

        // while
        int i = 2;
        while (i < 10) {
            int j = 1;
            while (j < 10) {
                System.out.printf("%d x %d = %d\n", i, j, i * j);
                j++;
            }
            System.out.println();
            i++;
        }
        System.out.println("==========================\n");


        //// (1, 1), (2, 2), (3, 3) .... (9, 9) // 비례 그래프
        // 1. 9번 출력 되는데 81번 체크 (점)
        for (int k = 1; k < 10; k++) {
            for (int l = 1; l < 10; l++) {
                if (k == l) {
                    System.out.printf("(%d, %d)\n", k, l);
                }
            }
        }
        System.out.println("\n==========================\n");

        // 2. 이중 for문 필요없다 (9번 체크)
        int k = 1;
        for (int l = 1; l < 10; l++) {
            System.out.printf("(%d, %d)\n", k, l); // k, l 동시 시작
            k++;
        }
        System.out.println("\n==========================\n");

        // palindrome (mom, racar)
        // 얘도 단어의 앞과 뒤에서 동시 시작하면 되므로 이중 for문 필요없다.
        // 맨 앞의 r 고정해놓고 뒤에 r있나 체크 할 필요 없다. (이중 for문)


        //// Nested Loop Break
        // 1. 내부 for문 종료 : break
        for (int x = 2; x < 10; x++) {
            for (int y = 1; y < 10; y++) {
                if (y % 3 == 0) break;
                System.out.printf("%d x %d = %d\n", x, y, x * y);
            }
            System.out.println();
        }
        System.out.println("==========================\n");

        // 2. 외부 반복문 종료 : break 두번 (checker) // 이렇게 안쓰고 그냥 함수화 시킴
        boolean checker = false;
        for (int x = 2; x < 10; x++) {
            for (int y = 1; y < 10; y++) {
                if (y % 3 == 0) {
                    checker = true; // 내부가 break 됐을때만 외부도 break
                    break;
                }
                System.out.printf("%d x %d = %d\n", x, y, x * y);
            }
            // break; // -> [2 x 1 = 2, 2 x 2 =4] 만 출력됨 (외부 for문 한번 돔)
            if (checker) break;
            System.out.println();
        }
        System.out.println("\n==========================\n");

        // 3. 외부 반복문 종료 : return (외부 함수로 빼서 main 종료 되도록)
        for (int x = 2; x < 10; x++) {
            for (int y = 1; y < 10; y++) {
                if (y % 3 == 0) return;
                System.out.printf("%d x %d = %d\n", x, y, x * y);
            }
            System.out.println();
        }
        System.out.println("\n==========================\n");

    }
}

0개의 댓글

관련 채용 정보