3-3. 반복문 While

CodingHoon·2021년 6월 19일
0

java-basic

목록 보기
12/13
post-thumbnail

✅ 반복문: While

▶ 기본 구조: while (조건식) { 실행할 문장; }

▶ 조건식이 true인 동안 문장을 반복하여 수행한다.

▶ 조건식이 false가 되면, 반복문의 수행을 멈춘다.

▶ 실행할 문장이 단 하나인 경우, 중괄호를 생략할 수 있다.

▶ while문을 주로 사용하는 경우? 반복 횟수가 확실히 정해지지 않은 경우!

package loop;

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

        while (num <= 100){
            sum += num;
            num += 1;
        }

        System.out.println("1부터 100까지의 합은 " + sum + "입니다.");
    }
}

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

▶ 위 예제의 while문은 아래의 과정을 반복한다.

(1) num이 100 이하인지 확인한다. (조건식)
(2) num이 100 이하인 경우, sum에 num 값을 대입한다. (본문 1)
(3) num을 1씩 증가시킨다. (본문 2)
(4) num이 100 이하인지 다시 확인한다. (조건식)
(......)

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


✅ 연산에 사용되는 변수는 특정 값으로 초기화되어야 한다!

위 코드에서 변수 num과 변수 sum을 초기화하지 않고 선언만 한 채로 프로그램을 실행하면 다음과 같은 오류가 발생한다.

num이 초기화되지 않으면, 어떤 값을 sum에 더해야 하는지 알 수 없고,
sum이 초기화되지 않으면, num을 어떤 값에 더해야 하는지 알 수 없기 때문이다.

따라서, 연산에 사용되는 변수는 반드시 특정 값으로 초기화되어 있어야 하고, num이나 sum과 같은 정수형 변수를 초기화하지 않는다고 해서 변수에 기본적으로 0이 대입되는 것이 절대 아니라는 것을 명심해야 한다.


✅ 무한 반복문 (Infinite Loop)

while문의 조건이 항상 true가 되는 경우에는 반복문이 무한히 반복될 것이다. 예를 들어, 위 코드에서 실수로 num += 1; 코드를 적지 않은 경우에는, num이 1인 상태로 while문을 무한히 반복할 것이다. 따라서, 이런 예기치 못한 무한 반복을 막기 위해서는 프로그래머가 조건문을 적절히 제어해야 한다.

단, 강제로 반복문을 무한히 반복하는 경우도 있다.

package loop;

import java.util.Scanner;

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

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

            if (num == 0)
                break; // 0을 입력받은 경우, 반복문을 빠져나옴
            else
                System.out.println(num * 2);
        }

        scanner.close();
    }
}

[실행 예시]
정수를 입력하세요: 10
20
정수를 입력하세요: 20
40
정수를 입력하세요: 0

Process finished with exit code 0

처음 보는 낯선 문법들이 존재하지만 천천히 코드를 살펴보자.

지금까지는 프로그래머(우리)가 원하는 값만을 콘솔창에 값을 '출력'만 했지만, 이제는 사용자가 원하는 값을 콘솔창에서 직접 '입력'을 받아보려고 한다.
(사실, 지금은 프로그래머와 사용자가 모두 '나'이지만, 코드를 작성할 때는 프로그래머와 사용자를 구분하여 생각하는 것이 좋다. 한마디로, 내가 만든 'x2' 프로그램을 다른 사용자가 콘솔 창에서 사용할 수 있도록 하는 것이다.)

'2-4 자료형' 파트에서 문자열을 다루는 String 클래스를 설명할 때도 언급했지만, 지금 당장은 특정 클래스의 정의나 사용 방법 등은 전혀 몰라도 된다. 단순히 Scanner 클래스는 콘솔 창으로부터 입력을 받기 위한 클래스라는 사실만 알아두고, new, System.in, close 등의 문법은 스윽 보고 지나가자.

아무튼, nextInt()를 사용하면 콘솔 창으로부터 정수값을 입력 받을 수 있는데, 해당 코드를 실행하면 콘솔 창에 다음과 같이 커서가 반짝거리며 기다리고 있다. 키보드로 원하는 숫자를 입력 한 다음 엔터를 누르면, 입력한 숫자가 정수형 변수 num에 입력된다. 그 값이 0인 경우에는 break문을 사용하여 프로그램을 끝내고, 0이 아닌 경우에는 'x2'를 계산해야 하므로 if문을 사용하여 num 값을 판단한다.

참고로, switch-case 문에서 break문은 해당 조건을 빠져나오는 용도로 사용되지만, 반복문에서 break문은 해당 반복문을 빠져나오는 용도로 사용된다.

다시 반복문 얘기로 돌아와서, 사용자가 어떤 값을 몇 번 입력할지 프로그래머가 예측하기는 어렵기 때문에 무한 반복문을 사용하여 프로그램을 가동하고, 대신 특정 종료 조건을 사용자가 충족시키는 경우에는 break문을 활용하여 무한 반복문을 빠져나온다. 정말 자주 사용되는 방법이므로 잘 알아두어야 한다!

✋ 여기서 잠깐!

System.out.println은 특정 변수나 값을 출력하면서 줄바꿈(개행)이 포함됩니다.
System.out.print는 동일한 역할을 하지만, 줄바꿈(개행)이 포함되지 않습니다.
이는 직접 코딩을 하면서 테스트하시면 쉽게 이해하실 수 있습니다 😊


✅ 반복문: Do-While

중괄호 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사한다.

▶ while문 뒤에 반드시 세미콜론(;)을 작성해야 한다.

package loop;

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

        // while: 조건식 검사를 가장 먼저 진행
        while (num <= 0){
            System.out.println("Hello World!");
        }
        System.out.println("==============================");

        // do-while: 조건식 검사를 마지막에 진행
        do {
            System.out.println("Hello World!");
        } while (num <= 0);
    }
}

[실행 결과]
==============================
Hello World!

▶ 위 예제에서 정수형 변수 num에 10이라는 값이 대입되어 있고,
while문과 do-while문의 조건식은 모두 num <= 0 으로 false값을 가진다.

▶ while문에서는 "Hello World!"를 출력하는 while문이 아예 실행되지 않는다.

▶ 하지만 do-while문은 조건식을 검사하기 전에 중괄호 안의 문장을 수행하기 때문에 "Hello World!"를 한 번 출력하고 조건식을 검사한다.
이후, 조건식의 값은 false이므로 do-while문은 종료된다.

0개의 댓글