내일배움캠프/TIL

JAVA 입문 _ 김영한의 자바 입문 강의 - Day 7[반복문2]

austindynasty 2024. 10. 22. 17:11

1. 중첩 반복문

public class Nested {
    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            System.out.println("외부 for 시작 i:" + i);
            for (int t = 0; t <3; t++) {
                System.out.println("-> 내부 for " + i + "-" + t);
            }
            System.out.println("외부 for 종료 i:" + i);
            System.out.println(); //라인 구분
        } //외부 for 2번, 내부 for 3번 진행

 

예제1) 처음 10개의 자연수를 출력하는 프로그램을 작성해 보세요. 이 때, count라는 변수를 사용해야 합니다. while문과 for문 2가지 버전의 프로그램을 작성하세요.

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

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

        for(int count = 1; count <= 10 ; count++) {
            System.out.println(count);
        }
    }
}

 

2. 문제 풀이 

1) 반복문을 사용해 처음 10개의 짝수를 출력하는 프로그램을 작성하세요. 이 때, num이라는 변수를 사용해 수를 표현해야 합니다. while문과 for문 두 가지 버전의 프로그램을 작성하세요.

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

        int num = 1;
        while ( num <= 20 ) {
            num++;
            if ( num % 2 == 0) {
                System.out.println(num);
            }
        }
    }
}
public class WhileEx2_2 {
    public static void main(String[] args) {

        for(int num = 1; num <= 20; num++) {
            if ( num % 2 == 0) {
                System.out.println(num);
            }
        }
    }
}

-> 해설에서는 count라는 변수를 2로 초기화한 후 while문과 for문의 조건식에 count <= 10 범위를 적용, num += 2 연산식을 대입해 10번씩 반복하는 방법을 설명했다. 하지만 나는 짝수를 표현할 때에 % 연산자를 이용해 2로 나눴을 때 나머지가 0 인점을 이용하는 것이 더 편리하다고 생각해 다른 방식으로 문제를 풀었다. 실행결과는 정답과 같았다!

 

2) 반복문을 사용해 1부터 max까지의 합을 계산하고 출력하는 프로그램을 작성하세요. 이 때, sum이라는 변수를 사용해 누적합을 표현하고, i라는 변수를 사용해 카운트(1부터 max까지 증가하는 변수)를 수행해야 합니다.

while문과 for문 두 가지 버전의 프로그램을 작성하세요. 

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

        int sum = 0;
        int i = 1;
        int max = 100;

        while ( i <= max ) {
            sum = sum + i; // sum+= i 로 수정 가능 
            System.out.println("max = " + i + " 합 = " + sum);
            i++;
        }
    }
}
public class WhileEx3_2 {
    public static void main(String[] args) {
        int sum = 0;
        int max = 100;

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

-> 처음에는 while문 안의 조건을 적을 때 i<=100이라고 했다가 무한 반복되는 코드를 보고 굉장히 당황했다. 가만히 생각하다가 조건 범위를 i <= max로 바꾸니 예상했던 실행결과가 나왔다. 또한 출력코드의 위치에 따라서 실행결과가 달라지는 것을 알아냈다! 위 문제에서는 출력코드가 반복문 안에 있어 모든 합산 과정을 확인할 수 있지만 반복문 밖에 작성하면 마지막 합계 결과만 확인할 수 있다. 

 

3) 중첩 for문을 사용해 구구단을 완성하세요.

public class WhileEx4_1 {
    public static void main(String[] args) {
        for(int a = 1; a <= 9 ; a++) { //단수 (외부)
            for(int b = 1; b <= 9 ; b++) { //곱해지는 수 (내부)
                System.out.println(a + " * " + b + " = " + a*b);
            }
        }
    }
}

 

4) int rows를 선언하고 이 수만큼 다음과 같은 피라미드를 출력하세요.

참고 : system.out.println()은 출력 후 다음 라인으로 넘어간다. 라인을 넘기지 않고 출력하려면 ...print()를 사용하면 된다. 

//rows = 2
*
**
//rows = 4
*
**
***
****

 

public class WhileEx5_1 {
    public static void main(String[] args) {
        int rows = 7; //출력할 피라미드의 줄 수 

        for(int i = 1; i <= rows; i++) { //i = 현재 몇 번째 줄을 출력할 지(외부)
            for(int t = 1; t <= i; t++) {//t <= i는 그 줄에서 출력할 별 수를 의미(내부)
                System.out.print("*");//print()는 t값에 의해 별을 한 줄에 계속 출력
            }
            System.out.println();//새로운 줄 시작 
        }
    }
}

 

-> system.out.print() 를 통해 줄을 넘어가지 않고 한 줄에 결과값을 출력하는 방법을 배웠다. 처음에는 문제풀이는 고사하고 해설을 보고도 이해가 잘 안돼서 애를 먹었는데, 하나하나 뜯어가면서 생각해보니 이해가 됐다. 원리 자체는 구구단 출력과 비슷했는데 출력되는 형태를 나누는 것이 어려웠다. 다른 응용문제가 나오면 풀 수 있을 것 같다!

 

3. 반복문 정리

1)for문

- 초기화, 조건식, 반복 후의 작업을 한 눈에 알아보기 쉽게 표현할 수 있다.

- 정해진 횟수만큼의 반복을 수행하는 경우에 사용하기 적합하다

- 루프 변수의 범위가 for루프 블럭에 제한되므로 다른 곳에서 이 변수를 실수로 변경할 가능성이 적다.

- 하지만 루프의 조건이 루프 내부에서 변경되는 경우 관리가 어렵다.

 

2)while문

- 복잡한 조건과 시나리오에 적합하다.

- 조건이 충족되는 동안 계속 루프를 실행하며, 종료 시점을 명확하게 알 수 없는 경우에 유용하다.

- 루프 변수가 while 블럭 바깥에서도 접근 가능하므로, 이 변수를 실수로 변경하는 상황이 발생할 수 있다. 

- 루프의 조건이 루프 내부에서 변경되는 경우 관리하기 쉽다.

 

 

Opinion

확실히 강의가 진행될 수록 앞의 내용을 머릿 속에서 가져와서 활용해야 하기 때문에 복습이 얼마나 잘 되어있는 지를 확인할 수 있다. 나의 경우 기억하고싶은 것만 기억했는지 전에 배웠던 내용인데도 처음 배우는 것처럼 어려울 때가 많다. 공부하면서 웃긴 점은 모두 java에서 쓰이는 것들인데도 재밌게 배울 때도 있고 재미가 없을 때도 있다는 것이다. 물론 입맛 가려가며 공부할 때가 아니지만.. 반복문은 여태 배웠던 것 중에 가장 재미있게 배웠다!