John Squirrels
레벨 41
San Francisco

While 문

무작위의 그룹에 게시되었습니다
우리의 첫 번째 프로그램은 차례로 실행되는 일련의 명령이었습니다. 포크가 없습니다. 여기에는 인사말을 표시하는 HelloWorld가 포함됩니다. 여기에는 산술 계산이 포함됩니다. 우리의 첫 번째 프로그램 후에 우리는 분기하는 방법, 즉 프로그램이 특정 조건에 따라 다른 작업을 수행하도록 만드는 방법을 배웠습니다. 중앙 냉난방 시스템을 제어하기 위한 코드는 다음과 같습니다.

if (tempRoom>tempComfort)
    airConditionerOn();
if (tempRoom<tempComfort)
    heaterOn();
다음 단계를 수행하십시오. 일상 생활에서 우리는 파이를 만들기 위해 사과 껍질을 벗기는 것과 같이 균일하고 반복적인 동작을 자주 수행합니다. 이 매력적인 프로세스는 다음과 같이 설명할 수 있습니다.
  1. 그릇에 사과가 있으면 1.1~1.4단계를 실행합니다.

    1. 1.1. 사과를 잡아
    2. 1.2. 껍질을 벗기고 조각으로 자르십시오.
    3. 1.3. 팬에 파이 크러스트에 사과 조각을 배열합니다.
    4. 1.4. 1단계로 돌아갑니다.
while 문 - 2사과 열 개, 손 두 개, 칼 한 개가 있다고 가정해 봅시다. 실생활에서는 각 사과에 대해 동일한 알고리즘에 따라 12개 전체를 순차적으로 껍질을 벗깁니다. 하지만 프로그램이 각 사과에 대해 반복적인 작업을 수행하도록 하려면 어떻게 해야 할까요?
  • 우리는 사과의 수에 자신을 묶지만 사과가 충분하지 않으면 "페이로드" 없이 일부 명령이 실행됩니다(존재하지 않는 사과 껍질을 벗기려고 할 때 자해할 수 있음).
  • 껍질을 벗기라는 명령보다 사과가 더 많으면 사과 중 일부는 껍질을 벗기지 않은 상태로 남게 됩니다.
  • 이러한 코드는 읽기 어렵습니다. 반복되는 부분이 많아 수정이 어렵습니다.

루프는 작업을 반복적으로 수행할 수 있도록 하는 문입니다.

Java의 while 루프는 우리의 경우에 잘 작동합니다. 이 구성은 여러 작업을 간결하고 이해하기 쉬운 구조로 만듭니다. while 루프를 사용하면 파이에 대한 사과 슬라이싱 알고리즘이 Java에서 다음과 같이 표시될 수 있습니다.

while (numberOfApplesInBowl > 0) {
    apple = bowl.grabNextApple();
    arrangeInPie(apple.peel().slice());
    numberOfApplesInBow--; // "--" is the decrement operator, which reduces the number of apples by one
}
System.out.println("The apples for the pie have been processed.");

명령 구문

while 문의 첫 번째 변형은 다음과 같습니다.

while (Boolean expression) {
	// Loop body — the statement(s) that are repeatedly executed
}
다음은 이 코드가 실행될 때 발생하는 상황에 대한 단계별 설명입니다.
  1. while 키워드 뒤의 괄호 안에 있는 부울 식을 평가합니다 .
  2. 부울 표현식이 true로 평가되면 루프 본문 의 명령문이 실행됩니다. 루프 본문의 마지막 명령문이 실행된 후 1단계로 이동합니다.
  3. 부울 표현식이 거짓으로 평가되면 while 루프 다음의 첫 번째 명령문으로 이동합니다.

전제 조건이 있는 루프

루프 본문을 실행하기 전에 항상 부울 식(루프에 들어가기 위한 조건)을 평가하기 때문에 이러한 형태의 while 루프를 종종 전제 조건이 있는 루프 라고 합니다 . 숫자의 처음 10제곱에 대한 테이블을 작성해 보겠습니다.

public static void main(String[] args) {
    int base = 3; // The number that will be exponentiated
    int result = 1; // The result of exponentiation
    int exponent = 1; // The initial exponent
    while (exponent <= 10) { // The condition for entering the loop
        result = result * base;
        System.out.println(base + " raised to the power of " + exponent + " = " + result);
        exponent++;
    }
}
콘솔 출력:

3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
3 raised to the power of 9 = 19683
3 raised to the power of 10 = 59049
Process finished with exit code 0

사후 조건이 있는 루프

이 루프의 두 번째 변형은 다음과 같습니다.

do {
    // Loop body — the statement(s) that are repeatedly executed
} while (Boolean expression);
다음은 이 코드가 실행될 때 발생하는 상황에 대한 설명입니다.
  1. 루프 본문이 실행됩니다( do 키워드 바로 다음에).
  2. while 키워드 뒤의 괄호 안에 있는 부울 식을 평가합니다 .
  3. 부울 표현식이 true로 평가되면 1단계로 이동합니다.
  4. 부울 표현식이 거짓으로 평가되면 while 루프 다음의 첫 번째 명령문으로 이동합니다.
이전 루프와 두 가지 주요 차이점은 1) 루프 본문이 적어도 한 번 실행되고 2) 루프 본문이 실행된 후 부울 표현식이 평가된다는 것입니다. 따라서 이런 종류의 while 루프를 사후 조건이 있는 루프 라고 합니다 . 이번에는 10000을 초과하지 않는 수의 거듭제곱 표를 표시합니다.

public static void main(String[] args) {
    int base = 3; // The number that will be exponentiated
    int result = base; // The result of exponentiation
    int exponent = 1; // The initial exponent
    do {
        System.out.println(base + " raised to the power of " + exponent + " = " + result);
        exponent++;
        result = result * base;
    } while (result < 10000); // The condition for exiting the loop
}
콘솔 출력:

3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
Process finished with exit code 0
코드의 변경 사항에 주의하십시오. 이를 전제 조건이 있는 루프와 비교하십시오.

루프 작업에 대한 흥미로운 사실

루프 본문 내의 분기 문

루프 내에서 실행에 영향을 미치는 두 가지 명령문이 있습니다. 계속하다.
  • 계속 — 현재 반복에서 나머지 루프 본문의 실행을 건너뛰고 while 문의 부울 식 평가로 이동합니다. 표현식이 true로 평가되면 루프가 계속됩니다.
  • break — 현재 반복 실행을 즉시 종료하고 루프 다음의 첫 번째 명령문으로 제어를 전송합니다. 따라서 이 명령문은 현재 루프의 실행을 종료합니다. 다음 기사에서 자세히 살펴 보겠습니다.
과일의 예를 생각해 보십시오. 사과의 품질이 확실하지 않은 경우 continue 문을 사용하여 코드를 변경할 수 있습니다.

while (numberOfApplesInBowl > 0) {
    apple = bowl.grabNextApple();
    numberOfApplesInBow--; // "--" is the decrement operator, which reduces the number of apples by one
    if (apple.isBad()) { // This method returns true for rotten apples
        apple.throwInGarbage();
        continue; // Continue the loop. Jump to evaluation of numberOfApplesInBowl > 0
    }
    arrangeInPie(apple.peel().slice());
}
continue 문은 특정 조건 충족되는 경우 루프 본문의 문을 실행해야 할 때 자주 사용됩니다. 예를 들어 하드웨어 센서가 트리거될 때 작업을 수행하거나(그렇지 않으면 센서 판독값을 가져오는 루프를 계속 진행) 루프의 특정 반복에서만 식을 계산할 수 있습니다. 후자의 경우의 예는 제곱이 숫자의 수보다 작은 자연수의 세제곱의 합을 계산하기 위해 while 루프를 사용하는 것에서 볼 수 있습니다. 혼란스러운? 다음 코드를 확인하십시오.

public static void main(String[] args) {
    int sum = 0;  // Total amount
    int i = 0;  // Initial number in the series
    int count = 20;  // Number of numbers
    while (i <= count) {
        i++;  // Get the next number — "i++" is equivalent to "i = i + 1"
        if (i * i <= count)  // If the square of the number is less than
            continue;  // the number of numbers, then we won't calculate the sum
                            // Jump to the next number in the loop
        sum += i * i * i;  // Otherwise, we calculate the sum of the cubes of numbers
    }  // "sum += i * i * i" is notation that is equivalent to "sum = sum + i * i * i"
    System.out.println(sum);  // Print the result
}

무한 루프

이러한 분기 문은 무한 루프에서 가장 자주 사용됩니다. 루프를 종료하기 위한 부울 조건이 충족되지 않으면 무한 루프라고 합니다. 코드에서는 다음과 같이 보입니다.

while (true) {
    // Loop body 
}
이 경우 break 문은 루프를 종료하는 데 도움이 됩니다. 이 유형의 루프는 루프 본문 외부에서 결정된 외부 조건을 기다릴 때 적합합니다. 예를 들어 운영 체제나 게임에서 루프를 종료하면 게임이 종료됩니다. 또는 루프를 반복할 때마다 일부 결과를 개선하려고 시도하지만 경과 시간 또는 외부 이벤트(예: 체커, 체스 또는 일기 예보)의 발생을 기반으로 반복 횟수를 제한하는 알고리즘을 사용할 때. 정상적인 조건에서는 무한 루프가 바람직하지 않다는 점을 기억하십시오. 시연을 위해 거듭제곱으로 돌아가 보겠습니다.

public static void main(String[] args) {
    int base = 3; // The number that will be exponentiated
    int result = 1; // The result of exponentiation
    int exponent = 1; // The initial exponent
    while (true) {
        result = result * base;
        System.out.println(base + " raised to the power of " + exponent + " = " + result);
        exponent++;
        if (exponent > 10)
            break; // Exit the loop
    }
}
콘솔 출력:

3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
3 raised to the power of 9 = 19683
3 raised to the power of 10 = 59049
Process finished with exit code 0

중첩 루프

이제 루프에 대한 마지막 주제에 도달했습니다. 사과 파이(지금은 배가 고프지 않기를 바랍니다)와 사과 껍질을 벗기는 루프를 떠올려 보세요.
  1. 그릇에 사과가 있으면 1.1~1.4단계를 실행합니다.

    1. 1.1. 사과를 잡아
    2. 1.2. 껍질을 벗기고 조각으로 자르십시오.
    3. 1.3. 팬에 파이 크러스트에 사과 조각을 배열합니다.
    4. 1.4. 1단계로 돌아갑니다.
슬라이싱 프로세스를 더 자세히 설명하겠습니다.
  1. 슬라이스 수 = 0
  2. 슬라이스 수가 < 12이면 2.1~2.3단계를 수행합니다.

    1. 2.1. 사과를 한 조각 더 잘라
    2. 2.2. 슬라이스 수++
    3. 2.3. 2단계로 돌아가기
파이 만들기 알고리즘에 다음을 추가합니다.
  1. 그릇에 사과가 있으면 1.1~1.6단계를 실행합니다.

    1. 1.1. 사과를 잡아
    2. 1.2. 껍질을 벗기다
    3. 1.3. 슬라이스 수 = 0
    4. 1.4. 슬라이스 수가 < 12이면 1.4.1~1.4.3단계를 수행합니다.
      1. 1.4.1. 사과를 한 조각 더 잘라
      2. 1.4.2. 슬라이스 수++
      3. 1.4.3. 1.4단계로 돌아가기
    5. 1.5. 팬에 파이 크러스트에 사과 조각을 배열합니다.
    6. 1.6. 1단계로 돌아갑니다.
이제 루프 안에 루프가 있습니다. 이와 같은 구성은 매우 일반적입니다. 마지막 예로, 우리가 초등학교에서 좋아하는 구구단 중 하나를 만들어 봅시다.

 public static void main(String[] args) {
    // Print the second factors in a row
    System.out.println("    2  3  4  5  6  7  8  9"); 
    int i = 2;  // Assign the first factor to the variable
    while (i < 10) {  // First loop: execute as long as the first factor is less than 10
        System.out.print(i + " | ");  // Print the first factor at the beginning of the line
        int j = 2;  // The starting value of the second factor
        while (j < 10) { // Second loop: execute as long as the second factor is less than 10
            int product = i * j;  // Calculate the product of the factors
            if (product < 10)  // If the product is a single digit, then we print two spaces after the product
                System.out.print(product + "  ");
            else  // Otherwise, print the product and one space after it
                System.out.print(product + " ");
            j++;  // Increment the second factor by one
        }  // Go to the beginning of the second loop, i.e. "while (j < 10)"
        System.out.println();  // Move to the next line on the console
        i++;  // Increment the first factor by one
    } // Go to the beginning of the first loop, i.e. "while (i < 10)"
}
콘솔 출력:

    2  3  4  5  6  7  8  9
2 | 4 6 8 10 12 14 16 18
3 | 6 9 12 15 18 21 24 27
4 | 8 12 16 20 24 28 32 36
5 | 10 15 20 25 30 35 40 45
6 | 12 18 24 30 36 42 48 54
7 | 14 21 28 35 42 49 56 63
8 | 16 24 32 40 48 56 64 72
9 | 18 27 36 45 54 63 72 81
Process finished with exit code 0
루프(특히 while 문)는 소프트웨어의 기본 빌딩 블록 중 하나입니다. CodeGym에서 작업을 해결함으로써 다양한 종류의 루프를 배우고, 그 복잡성을 이해하고, 이를 사용하는 실용적인 기술을 습득하게 됩니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION