3-4. 반복문 For

CodingHoon·2021년 6월 19일
0

java-basic

목록 보기
13/13
post-thumbnail

✅ 반복문: For

▶ 기본 구조: for(초기식; 조건식; 증감식) { 실행할 문장; }

▶ 초기식에서는 for문에서 사용할 변수를 초기화한다.

▶ 조건식에서는 반복 조건을 결정한다. while문과 마찬가지로, 조건식이 true이면 실행할 문장을 반복하여 수행하고, 조건식이 false이면 반복문의 수행을 멈춘다.

▶ 증감식에서는 반복 횟수를 설정한다. (주로 변수를 1씩 증가/감소 한다.)

▶ for문을 주로 사용하는 경우? 반복 횟수가 확실히 정해져 있는 경우!

package loop;

public class ForTest {
    public static void main(String[] args) {
        /**
         * 1부터 100까지의 합을 계산하는 프로그램
         */
        int sum = 0;

        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        
        System.out.println("1부터 100까지의 합은 " + sum + "입니다.");
    }
}

[실행 결과]
1부터 100까지의 합은 5050입니다.

▶ 위 예제의 for문은 아래의 과정으로 진행된다.

(1) for문에서 사용할 변수 i를 1로 초기화한다. (초기식)
(2) i가 100 이하인지 확인한다. (조건식)
(3) i가 100 이하인 경우, sum에 num 값을 대입한다. (본문)
(4) num을 1씩 증가시킨다. (증감식)
(5) i가 100 이하인지 다시 확인한다. (조건식)
(...)

▶ (2) ~ (5) 의 과정을 계속 반복하다가, num이 101이 되는 순간 조건식이 false가 되어 for문을 빠져 나오게 되고, sum에는 1부터 100까지의 합이 담겨 있다.

for문에서 가장 많이 사용되는 변수 이름은 i 입니다. 반복자를 뜻하는 영단어 iterator의 앞글자를 딴 변수 이름으로, 이중 for문의 경우, i의 다음 알파벳인 j를, 삼중 for문의 경우 j 다음 알파벳인 k를 주로 사용합니다!


✅ 중첩 반복문

반복문 안에 또 다른 반복문을 중첩하여 사용하는 경우가 있다.

package loop;

public class NestedForTest {
    public static void main(String[] args) {
        /**
         * 2단부터 5단까지의 구구단을 출력하는 프로그램
         */
        for (int i = 2; i <= 5; i++){
            for (int j = 1; j <= 9; j++){
                System.out.println(i + " X " + j + " = " + (i * j));
            }
            System.out.println(); // 단이 바뀔때 마다 줄바꿈
        }
    }
}

[실행 결과]
2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18

3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27

4 X 1 = 4
4 X 2 = 8
4 X 3 = 12
4 X 4 = 16
4 X 5 = 20
4 X 6 = 24
4 X 7 = 28
4 X 8 = 32
4 X 9 = 36

5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45

▶ (단) X (숫자) = (결과)가 반복되어야 한다. 하나의 '단'에 대한 모든 결과를 출력한 다음, 다음 '단'으로 넘어가야 하기 때문에, 바깥 for문에서 '단'을, 안쪽 for문에 '숫자'를 출력해야 한다.

▶ '단'을 표현하는 변수 i는 2부터 시작을 한다. i = 2인 동안, 안쪽 for문에서 '숫자'를 표현하는 변수 j가 1부터 9까지 증가하고, j가 10이 되는 순간 안쪽 for문의 조건식은 false가 되어 종료된다. 이후, 바깥 for문의 증감식을 실행하여 i는 3이 되고, 위 과정을 다시 반복한다. i가 6이 되는 순간 바깥 for문의 조건식은 false가 되어 이중 for문이 모두 종료된다.

▶ 가독성 향상을 위해서, 바깥 for문이 한 번 돌면 (= 하나의 '단'의 '결과'가 모두 출력되면) System.out.println()으로 줄바꿈을 실행한다.

▶ 위 이중 for문은 바깥쪽 for문이 한 번 실행되는 동안 안쪽 for문이 9번 실행되므로, 총 4 * 9 = 36 번의 for문이 실행된다고 볼 수 있다.

👉 여기서 잠깐!

'3-3. 반복문 While'에서 한 번 설명했듯이, System.out.println은 줄바꿈이 자동으로 적용됩니다. 이를 활용하여, System.out.println()과 같이 괄호 안에 아무런 값을 대입하지 않으면 단순 줄바꿈만 실행할 수 있습니다 😊


✅ 중첩 반복문에서의 break문

▶ 중첩 반복문에서 break를 사용하는 경우, break문을 감싸는 반복문만을 빠져나온다.

package loop;

import java.util.Scanner;

public class BreakTest {
    public static void main(String[] args) {
        /**
         * 사용자로부터 정수를 입력 받아, 1부터 해당 정수까지의 합을 출력한다.
         * (단, 사용자가 콘솔 창에 0을 입력하기 전까지 무한히 프로그램을 반복한다.)
         */
        Scanner scanner = new Scanner(System.in);
        int sum = 0; // 합을 담을 변수
        int num = 0; // 사용자로부터 입력 받는 정수

        while (true){
            System.out.print("정수를 입력하세요: ");
            num = scanner.nextInt();
            if (num == 0)
                break;

            for (int i = 1; ; i++) {
                if (i > num)
                    break;
                sum += i;
            }
            System.out.println("1부터 " + num + "까지의 합은 " + sum + "입니다.");

            sum = 0; // 변수 sum 을 0으로 다시 초기화
        }

        scanner.close();
    }
}

[실행 예시]
정수를 입력하세요: 10
1부터 10까지의 합은 55입니다.
정수를 입력하세요: 5
1부터 5까지의 합은 15입니다.
정수를 입력하세요: 0

Process finished with exit code 0

▶ 사용자가 콘솔 창에 0을 입력하기 전까지 프로그램을 무한 반복해야 하므로 바깥 반복문은 while문, 1부터 n까지의 합을 계산하는 안쪽 반복문은 for문으로 구성한다.

▶ 사용자가 콘솔 창에 0을 입력한 경우, 전체 반복문을 빠져나와야 한다. 첫 번째 break문은 while문에 소속되어 있으므로, for문에 접근하지 않고 while문을 바로 빠져나와 프로그램을 종료한다.

for문에 조건식을 작성하지 않고 생략하면, 무한히 반복하는 for문이 되는데, 이 for문은 i가 num과 같아질 때까지 sum += i; 식을 실행해야 한다. 따라서, i가 num보다 커지는 순간 break문을 활용해서 안쪽 for문을 빠져나와서 while문의 나머지 문장을 실행해야 한다.

▶ 사용자가 새로운 정수를 입력할 때마다 매번 새로운 sum 계산을 해야하므로, while문의 마지막에는 반드시 sum을 0으로 다시 초기화시켜줘야 한다.

▶ 이 예제를 통해서, 안쪽 반복문에서 break문을 사용한다고 해서 바깥 반복문까지 빠져나오지는 않는다는 것을 알 수 있다.

👉 여기서 잠깐!

사실 안쪽 for문을 for(int i = 1; i <= num; i++) 로 구성하면 코드 수를 줄일 수 있고 가독성이 향상되지만, break문의 작동 원리를 살펴 보기 위해 조금 더 복잡한 코드를 구성했습니다 😊


✅ 별 찍기

👉 여기서 잠깐!

별 찍기는 이중 for문을 연습해볼 수 있는 아주 좋은 예제입니다! 코드와 주석을 참고하시고, 이해가 안되는 점이 있으신 분들은 덧글로 남겨주시면 감사하겠습니다 😊

1) 우측 방향 계단

package make_star;

import java.util.Scanner;

public class Star1 {
    public static void main(String[] args) {
        /**
         *   사용자로부터 정수를 입력 받아, 해당 정수의 줄 개수 만큼
         *   *
         *   **
         *   ***
         *   ****
         *   *****  를 출력하시오.
         *
         *   Hint. 별의 개수 = 줄 번호
         */
        Scanner scanner = new Scanner(System.in);

        System.out.print("별을 출력할 줄의 개수를 입력하세요: ");
        int total = scanner.nextInt(); // 줄의 총 개수
        scanner.close();

        for (int line = 1; line <= total; line++){
            for (int star = 1 ; star <= line; star++)
                System.out.print("*");
            System.out.println();
        }
    }
}

[실행 예시]
별을 출력할 줄의 개수를 입력하세요: 5
*
**
***
****
*****

2) 좌측 방향 계단

package make_star;

import java.util.Scanner;

public class Star2 {
    public static void main(String[] args) {
        /**
         *   사용자로부터 정수를 입력 받아, 해당 정수의 줄 개수 만큼
         *       *
         *      **
         *     ***
         *    ****
         *   *****  를 출력하시오.
         *
         *   Hint1. 별의 개수 = 줄 번호
         *   Hint2. 공백의 개수 = (줄의 총 개수) - (별의 개수)
         */
        Scanner scanner = new Scanner(System.in);

        System.out.print("별을 출력할 줄의 개수를 입력하세요: ");
        int total = scanner.nextInt(); // 줄의 총 개수
        scanner.close();

        for (int line = 1; line <= total; line++){
            for (int blank = 1; blank <= (total - line); blank++)
                System.out.print(" ");
            for (int star = 1 ; star <= line; star++)
                System.out.print("*");
            System.out.println();
        }
    }
}

[실행 예시]
별을 출력할 줄의 개수를 입력하세요: 5
    *
   **
  ***
 ****
*****

3) 피라미드

package make_star;

import java.util.Scanner;

public class Star3 {
    public static void main(String[] args) {
        /**
         *   사용자로부터 정수를 입력 받아, 해당 정수의 줄 개수 만큼
         *      *
         *     ***
         *    *****
         *   ******* 를 출력하시오.
         *
         *   Hint. 별의 개수 = 2 * (line) - 1
         *   Hint. 공백의 개수 = (마지막 줄의 별 개수) - (해당 줄의 별 개수)
         */

        Scanner scanner = new Scanner(System.in);

        System.out.print("별을 출력할 줄의 개수를 입력하세요: ");
        int total = scanner.nextInt(); // 줄의 총 개수
        int numberOfStar = 0; // 각 줄의 별 개수
        int numberOfBlank = 0; // 각 줄의 공백 개수
        scanner.close();

        for (int line = 1; line <= total; line++){
            numberOfStar = 2 * line - 1;
            numberOfBlank = (2 * total - 1) - numberOfStar;

            for (int blank = 1; blank <= numberOfBlank / 2; blank++)
                System.out.print(" ");
            for (int star = 1 ; star <= (2 * line - 1); star++)
                System.out.print("*");
            for (int blank = 1; blank <= numberOfBlank / 2; blank++)
                System.out.print(" ");

            System.out.println();
        }
    }
}

[실행 예시]
별을 출력할 줄의 개수를 입력하세요: 5
    *    
   ***   
  *****  
 ******* 
*********

0개의 댓글