본문 바로가기
IT/김영한의JAVA입문_inFlearn

5. 반복문 - while문 / do-while문 / break, continue / for문 / 중첩 반복문 / 문제와 풀이1~2

by for-learn 2024. 12. 26.

반복문은 while, do-while, for 이 있다. 

5-1. 반복문 시작

While1_1.java

package loop;

public class While1_1 {
    public static void main(String[] args) {
        int count = 0;

        count = count + 1;
        System.out.println("현재 숫자는:" + count);
        count = count + 1;
        System.out.println("현재 숫자는:" + count);
        count = count + 1;
        System.out.println("현재 숫자는:" + count);
    }
}

  • 특정 코드를 반복해서 실행할 때 사용하는 것이 반복문이다. 

 

5-2. while문1

조건에 따라 코드를 반복해서 실행할 때 사용

while (조건식) {
    // 코드
}
  • 조건식이 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다. 

While1_2.java

package loop;

public class While1_2 {
    public static void main(String[] args) {
        int count = 0;
        while (count < 3) {
            count++;
            System.out.println("현재 숫자는:" + count);
        }
    }
}

 

 

5-3. while문2

문제: i 부터 하나씩 증가하는 수를 3번까지 더해라 (i ~ i+2 더하기)

While2_1.java

package loop;

public class While2_1 {
    public static void main(String[] args) {
        int sum = 0;

        sum = sum + 1; // sum(0) + 1 -> sum(1)
        System.out.println("i=" + 1 + " sum=" + sum);
        sum = sum + 2; // sum(1) + 2 -> sum(3)
        System.out.println("i=" + 2 + " sum=" + sum);
        sum = sum + 3; // sum(3) + 3 -> sum(6)
        System.out.println("i=" + 3 + " sum=" + sum);
    }
}
  • 1부터 하나씩 증가하는 수를 3번 더해라
  • 개선할 점이 많이 있는데, 무엇보다 변경에 유연하지 않다.

While2_2.java

package loop;

public class While2_2 {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        sum = sum + i; // sum(0) + i(1) -> sum(1)
        System.out.println("i=" + i + " sum=" + sum);
        i++; // i=2
        sum = sum + i; // sum(1) + i(2) -> sum(3)
        System.out.println("i=" + i + " sum=" + sum);
        i++; // i=3
        sum = sum + i; // sum(3) + i(3) -> sum(6)
        System.out.println("i=" + i + " sum=" + sum);
    }
}
  • 변수 i 를 사용한 덕분에 i 의 값만 변경하면 나머지 코드를 변경하지 않아도 된다.
  • 변경 사항이 발생했을 때 변경해야 하는 부분이 적을수록 좋은 코드이다.

 

문제: i 부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더해라 (i ~ endNum 더하기)

While2_3.java

package loop;

public class While2_3 {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        int endNum = 3;

        while (i <= endNum) {
            sum = sum + 1;
            System.out.println("i=" + i + " sum=" + sum);
            i++;
        }
    }
}
  • while 문을 사용하면 원하는 횟수 만큼 같은 코드를 반복 실행할 수 있다.

 

5-4. do-while문

조건에 상관없이 무조건 한 번은 코드를 실행

do {
    // 코드
} while (조건식);

 

DoWhile1.java

package loop;

public class DoWhile1 {
    public static void main(String[] args) {
        int i = 10;
        while (i < 3) {
            System.out.println("현재 숫자는:" + i);
            i++;
        }
    }
}

DoWhile2.java

package loop;

public class DoWhile2 {
    public static void main(String[] args) {
        int i = 10;

        do {
            System.out.println("현재 숫자는:" + i);
            i++;
        } while (i < 3);
    }
}

 

5-5. break, continue

break: 반복문을 즉시 종료하고 나간다.

while(조건식) {
    코드1;
    break; // 즉시 while문 종료로 이동한다.
    코드2;
}
//while문 종료
  • break 를 만나면 코드2 가 실행되지 않고 while문이 종료된다.

continue: 반복문의 나머지 부분을 건너뛰고 다음 반복을 진행한다. 

while(조건식) {
    코드1;
    continue; // 즉시 조건식으로 이동한다.
    코드2;
}
  • continue 를 만나면 코드2 가 실행되지 않고 다시 조건식으로 이동한다. 조건식이 참이면 while 문을 실행한다.

문제: 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값은 얼마인가?

Break1.java

package loop;

public class Break1 {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;

        while(true) {
            sum = sum + i;
            if (sum > 10) {
                System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
                break;
            }
            i++;
        }
    }
}

 

문제: 1부터 5까지 숫자를 출력하는데, 숫자가 3일 때는 출력을 건너뛰어야 한다.

Continue1.java

package loop;

public class Continue1 {
    public static void main(String[] args) {
        int i = 1;

        while(i <= 5) {
            if(i == 3){
                i++;
                continue;
            }
            System.out.println(i);
            i++;
        }
    }
}

 

5-6. for문1

for문은 주로 반복횟수가 정해져 있을 때 사용

for (1.초기식; 2.조건식; 4.증감식) {
    // 3.코드
}

for문은 다음 순서대로 실행된다.

  1. 초기식이 실행된다. 주로 반복 횟수와 관련된 변수를 선언하고 초기화할 때 사용한다. 초기식은 딱 1번 사용된다. 
  2. 조건식을 검증한다. 이면 코드를 실행하고, 거짓이면 for문을 빠져나간다.
  3. 코드를 실행한다.
  4. 코드가 종료되면 증감식을 실행한다. 주로 초기식에 넣은 반복 횟수와 관련된 변수의 값을 증가할 때 사용한다.
  5. 다시 2. 조건식부터 시작한다. (무한 반복)

For1.java

package loop;

public class For1 {
    public static void main(String[] args) {
        for (int i = 1; i < 10; i++) {
            System.out.println(i);
        }
    }
}

 

For2.java

package loop;

public class For2 {
    public static void main(String[] args) {
        int sum = 0;
        int endNum = 3;

        for (int i = 1; i <= endNum; i++) {
            sum = sum + i;
            System.out.println("i=" + i + " sum=" + sum);
        }
    }
}

 

 

for vs while

For2.java 코드

더보기
package loop;

public class For2 {
    public static void main(String[] args) {
        int sum = 0;
        int endNum = 3;

        for (int i = 1; i <= endNum; i++) {
            sum = sum + i;
            System.out.println("i=" + i + " sum=" + sum);
        }
    }
}

While2_3.java 코드

더보기
package loop;

public class While2_3 {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        int endNum = 3;

        while (i <= endNum) {
            sum = sum + 1;
            System.out.println("i=" + i + " sum=" + sum);
            i++;
        }
    }
}
  • for문은 초기화, 조건 검사, 반복 후 작업 등이 규칙적을 한줄에 모두 들어 있어 코드 이해가 쉬움
  • 반복을 위해 값이 증가하는 카운터 변수(=인덱스 변수)를 다른 부분과 명확히 구분 가능
  • for (int i = 1; i <= endNum; i++) 에서 변수 i 가 카운터 변수 
  • 덕분에 루프 횟수와 관련된 코드와 나머지 코드를 명확히 구분 가능
  • while문은 변수 i 선언과 i++로 증가하는 코드가 분산되어 있다

 

5-7. for문2

for문에서 초기식, 조건식, 증감식은 선택이기에 모두 생략해도 된다. 조건없는 무한반복 코드가 된다. 

for (;;) {
    // 코드
}

 

문제: 1부터 시작하여 숫자를 계속 누적해서 더하다가 합계가 10보다 큰 처음 값은 얼마인가?

Break3.java

package loop;

public class Break3 {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; ; i++) {
            sum += i;
            if (sum > 10) {
                System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
                break;
            }
        }
    }
}

 

5-8. 중첩 반복문

반복문 내부에 또 반복문이 있는 것 (for 또는 while)

Nested1.java

package loop;

public class Nested1 {
    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            System.out.println("외부 for 시작 i:" + i);

            for (int j = 0; j < 3; j++) {
                System.out.println("-> 내부 for " + i + "-" + j);
            }
            System.out.println("외부 for 종료 i:" + i);
            System.out.println(); //라인 구분을 위해 실행
        }
    }
}

 

5-9. 문제와 풀이1

WhileEx1.java

package loop.ex;

public class WhileEx1 {
    public static void main(String[] args) {
        int count = 1;
        while(count <= 10){
            System.out.println(count);
            count++;
        }
    }
}

ForEx1.java

package loop.ex;

public class ForEx1 {
    public static void main(String[] args) {
        for (int count = 1; count <= 10; count++) {
            System.out.println(count);
        }
    }
}

 

 

WhileEx2.java

package loop.ex;

public class WhileEx2 {
    public static void main(String[] args) {
        int num = 1;
        int count = 0;
        while (true){
            if(num % 2 == 0){
                System.out.println(num);
                count++;
            }
            if(count == 10){
                break;
            }
            num++;
        }
    }
}

 

강의풀이

public class WhileEx2 {
    public static void main(String[] args) {
        int num = 2;
        int count = 1;
        while (count <= 10) {
            System.out.println(num);
            num += 2;
            count++;
        }
    }
}

ForEx2.java

package loop.ex;

public class ForEx2 {
    public static void main(String[] args) {
        int num = 2;
        for (int count = 1; count <= 10; count++) {
            System.out.println(num);
            num += 2;
        }
    }
}

 

강의풀이

public class ForEx2 {
    public static void main(String[] args) {
        for (int num = 2, count = 1; count <= 10; num += 2, count++) {
            System.out.println(num);
        }
    }
}

 

WhileEx3.java

package loop.ex;

public class WhileEx3 {
    public static void main(String[] args) {
        int i = 1;
        int max = 100;
        int sum = 0;

        while(i <= max) {
            sum += i;
            i++;
        }
        System.out.println(sum);

    }
}

ForEx3.java

package loop.ex;

public class ForEx3 {
    public static void main(String[] args) {
        int max = 100;
        int sum = 0;

        for (int i = 1; i <= max; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}

 

 

5-10. 문제와 풀이2

NestedEx1.java

package loop.ex;

public class NestedEx1 {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                System.out.println(i+" * "+j+" = "+i*j);
            }
        }
    }
}

 

NestedEx2.java

package loop.ex;

public class NestedEx2 {
    public static void main(String[] args) {
        int rows = 5;

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}