Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 while 루프 완벽 가이드: while문과 do...while문 활용법

프로그래밍을 하다 보면 동일한 작업을 여러 번 반복해야 하는 경우가 자주 발생합니다. 이러한 반복 작업을 자동화하고 더 효율적인 코드를 작성할 수 있도록 도와주는 것이 바로 루프(loop)입니다.

자바의 while 문과 do...while 문은 특정 조건이 충족되는 동안 코드 블록을 계속 실행하는 제어문입니다. 이는 조건이 참(true)일 때만 실행되는 if 조건문과 비슷하지만, if 문과 달리 while 루프는 조건이 거짓(false)이 될 때까지 계속 실행된다는 점에서 차이가 있습니다.

이 글에서는 자바의 while 문과 do...while 문의 기본 개념을 살펴보고, 실제 자바 프로그램에서 이를 어떻게 활용하는지 예제를 통해 단계별로 알아보겠습니다.

자바 while 루프란?

while 루프는 지정된 조건이 참으로 평가되는 동안 코드 블록을 반복 실행합니다. 문법 구조는 일반적인 if 문과 유사합니다. 자바 while 루프의 기본 문법은 다음과 같습니다.

while (condition_is_met) {
	// Code to execute
}

while 루프는 괄호 안의 표현식을 먼저 검사합니다. 불리언(Boolean) 표현식이 참이면 루프 본문이 실행되고, 실행 후에는 다시 표현식을 평가합니다. 프로그램은 표현식이 거짓으로 평가될 때까지 이 과정을 반복하며, 조건이 거짓이 되는 순간 while 루프가 종료되고 나머지 프로그램이 이어서 실행됩니다.

while 루프 예제

예제를 통해 while 루프의 실제 사용 방법을 살펴보겠습니다. 목공소를 운영하면서 새로운 테이블 판매를 시작한다고 가정해 보겠습니다. 최대 5개까지만 제작할 수 있어, 그 이상 주문하는 고객은 대기자 명단에 등록해야 하는 상황입니다.

대기자 명단에 등록하기 전까지 몇 명이 더 주문할 수 있는지 알려주는 프로그램을 만들고 싶습니다. 다음과 같이 while 루프를 사용하면 주문 수가 한도 미만인 동안 루프 본문을 실행하도록 구현할 수 있습니다.

int limit = 5;

int orders_made = 0;

while (orders_made < limit) {
	orders_made++;
	int capacity = limit - orders_made;
	String message = capacity + "more tables can be ordered.";
	System.out.println(message);
}

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

4 more tables can be ordered.
3 more tables can be ordered.
2 more tables can be ordered.
1 more tables can be ordered.
0 more tables can be ordered.

코드를 하나씩 분석해 보겠습니다. 첫 번째 줄에서는 제작 가능한 최대 테이블 수를 저장하는 변수 limit를 선언했습니다. 그다음에는 현재 접수된 주문 수를 저장하는 변수 orders_made를 선언합니다.

이후 프로그램은 orders_madelimit보다 작은 동안 실행되는 while 루프를 시작합니다. 루프 내부에서는 증가 연산자 orders_made++를 사용해 주문 수를 1씩 늘립니다.

증가 연산이 실행된 후, 프로그램은 limit에서 orders_made를 빼서 남은 테이블 수량을 계산하고, 콘솔에 "[남은 수량] more tables can be ordered."라는 메시지를 출력합니다.

이 "while" 문은 orders_madelimit보다 커지면 실행을 멈춥니다.

자바 do...while 루프란?

do...while 루프는 while 루프의 한 종류입니다. do...while 루프는 조건을 검사하기 전에 do 블록 안의 코드를 먼저 한 번 실행한 뒤, 조건이 참인 동안 루프를 반복합니다.

while 루프와 do...while 루프의 핵심 차이는 조건을 평가하는 시점입니다. while 루프는 코드 실행 전에 조건을 검사하는 반면, do...while 루프는 코드 실행 후에 조건을 검사합니다. 따라서 do...while 루프는 조건과 관계없이 최소 한 번은 반드시 실행됩니다.

do...while 루프의 문법은 다음과 같습니다.

do {
	// Code to execute
} while (condition_is_met);

do...while 루프 예제

예제를 통해 do...while 루프의 동작 방식을 설명해 보겠습니다. 사용자에게 1부터 10 사이의 숫자를 맞히도록 요구하는 숫자 맞추기 게임을 만든다고 가정해 보겠습니다. 사용자가 올바른 숫자를 입력했는지 확인하기 전에 먼저 숫자를 입력받아야 하고, 틀린 숫자를 입력하면 다시 시도하라는 메시지가 표시되어야 합니다. 이런 작업은 do...while 루프로 쉽게 구현할 수 있습니다.

다음은 사용자에게 숫자 맞추기를 요청한 뒤, do...while 루프를 사용해 정답 여부를 판단하는 프로그램 예제입니다.

import java.util.Scanner;

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

int number = 8;
int guess = 0;

Scanner input = new Scanner(System.in);
do {
System.out.print("Enter a number between 1 and 10: ");
guess = input.nextInt();
} while (number != guess);

System.out.println("You're correct!");
	}
}

이 코드를 실행하면 do...while 루프의 조건이 평가되기 먼저 사용자에게 숫자를 입력하라는 메시지가 표시됩니다. 몇 번의 시도 끝에 정답을 맞혔을 때의 실행 결과는 다음과 같습니다.

Enter a number between 1 and 10: 9
Enter a number between 1 and 10: 1
Enter a number between 1 and 10: 4
Enter a number between 1 and 10: 5
Enter a number between 1 and 10: 8
You're correct!

코드를 자세히 살펴보겠습니다. 먼저 사용자 입력을 받기 위해 util.Scanner 메서드를 임포트(import)합니다. 그리고 코드 전체를 담는 GuessingGame 클래스를 정의합니다.

그다음 두 개의 변수를 선언합니다. 하나는 맞혀야 할 정답 숫자를 저장하는 number이고, 다른 하나는 사용자가 입력한 값을 저장하는 guess입니다.

이후 Scanner 메서드로 사용자 입력 처리를 시작합니다. 콘솔에 "Enter a number between 1 and 10:" 메시지를 출력한 뒤, input.nextInt() 메서드로 사용자가 입력한 숫자를 읽어옵니다.

코드가 실행된 후 do...while 루프는 사용자가 입력한 숫자가 정답과 일치하는지 평가합니다. 틀린 숫자를 입력했다면 do 블록의 내용이 다시 실행되고, 정확한 숫자를 입력했다면 루프가 종료되며 콘솔에 "You're correct!" 메시지가 출력됩니다.

무한 루프(Infinite Loop) 주의하기

무한 루프란 영원히 멈추지 않고 계속 실행되는 루프를 말합니다. while 루프의 조건식이 절대 거짓이 되지 않으면 루프는 계속 돌다가 프로그램 전체를 멈추게 할 수 있습니다. 따라서 while 루프가 언젠가는 반드시 종료되도록 조건을 설계하는 것이 매우 중요합니다.

다음은 자바에서 무한 루프가 발생하는 대표적인 예입니다.

while (true) {
	// Code to execute
}

이 루프는 조건이 항상 참이므로 무한히 실행됩니다. 하지만 break 문을 사용하면 프로그램을 중간에 멈출 수 있습니다. 재고에 있는 테이블 수를 추적하는 프로그램을 만든다고 가정해 보겠습니다. 재고는 총 5개이며, 테이블이 모두 소진되면 while 루프가 멈추도록 만들고 싶습니다. 다음 코드로 이러한 요구사항을 구현할 수 있습니다.

Boolean tables_in_stock = true;
int orders_made = 0;

while (tables_in_stock) {
	orders_made++;
	if (orders_made == 5) {
		System.out.println("We are out of stock.");
		break;
	} else {
		int tables_left = 5 - orders_made;
		String message = "There are " + tables_left + " tables in stock.";
		System.out.println(message);
	}
}

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

There are 4 tables in stock.
There are 3 tables in stock.
There are 2 tables in stock.
There are 1 tables in stock.
We are out of stock.

이 예제에서 while 루프는 tables_in_stock 변수가 참인 동안 계속 실행됩니다. 그런데 코드 어디에도 이 변수를 거짓으로 바꾸는 부분은 없습니다.

그래서 코드에서는 orders_made가 5가 되었을 때 실행되는 break 문을 사용했습니다.

즉, 주문 수가 5개 미만일 때는 "There are [남은 수량] tables in stock."이라는 메시지가 출력되지만, orders_made가 5가 되는 순간 "We are out of stock." 메시지가 출력되고 break 문이 실행되어 while 루프가 종료됩니다.

마무리

자바의 while 루프는 조건식이 참인 동안 특정 코드 블록을 실행하고, 조건이 거짓이 되면 멈춥니다. do...while 루프는 코드 블록을 먼저 한 번 실행한 뒤 조건식을 평가하여 루프를 계속할지 결정합니다.

이 글에서는 자바에서 while 루프와 do...while 루프를 사용하는 방법을 살펴보았고, 각각의 실전 예제와 함께 무한 루프의 개념과 break 문을 활용한 탈출 방법까지 다루었습니다. 이제 여러분도 전문가처럼 자바의 whiledo...while 루프를 자유롭게 작성할 준비가 되었습니다!