코린이의 소소한 공부노트

제어문 (2) 반복문 - while, do-while 본문

Java

제어문 (2) 반복문 - while, do-while

무지맘 2022. 1. 8. 21:20

반복문이란 조건을 만족하는 동안 해당 블록을 실행시키는 제어문이다.

  - 조건이 참일 동안 해당 블록 실행

  - 조건이 거짓일 경우 해당 블록 실행 안 함(중단)

 

while문의 기본 생김새는 이렇다.

while (조건식) {
	// 조건식이 참일 동안 수행할 문장
}

  - 조건식이 참이어서 수행을 하다가, 조건식이 거짓이 되면 while문을 빠져나온다.

  - 조건식이 참일 때만 코드 블록이 실행되므로, 처음부터 조건식이 거짓인 경우 코드 블록이 한 번도 실행되지 않을 수 있다.

  - for문과 달리 조건식을 생략할 수 없다.

  - 조건식에 true를 넣으면 무한반복된다.

 

같은 반복문인 for와 100% 호환이 된다. (cf. switch와 if는 같은 조건문이지만 100% 호환되지는 않는다.)

for(int i=1 ; i<=9 ; i++) {
	System.out.print(i);
}						// 결과: 123456789

// 위의 for문과 같은 while문
int i = 1;
while (i<=9) {
	System.out.print(i);
	i++; // 후위형 증가 연산자
}						// 결과: 123456789

// while문에서 증감식을 조건식에 넣을 수도 있다.
int i = 1;
while (i++<=9) { // 9와 크기 비교 후 i값 1 증가
	System.out.print(i);
}						// 결과: 2345678910

while문을 보면, 조건식만 있어서 초기화와 증감식을 따로 적어줘야 한다. 이런 불편함을 개선하기 위해 for문에는 초기화, 조건식, 증감식이 모두 들어가 있다. for문이 더 편리해 보이지만 그럼에도 while문을 쓰는 이유는 반복 횟수를 정확히 모를 경우에는 while문을 쓰는 것이 유리하기 때문이다. 예를 들어, 1부터 몇까지 더해야 합이 500이 넘는지 계산하는 반복문을 만들 때, 정확한 반복 횟수를 모르므로 while문을 쓰는 것이 좋다.

int sum = 0, i = 0;
while ( !(sum>500) ) { // 합이 500을 넘지 않을 때 수행
	System.out.println(i+" - "+sum);
	sum += ++i; // i 1 증가 후 sum과 더함
}
// 결과
0 - 0
1 - 1
2 - 3
...
30 - 465
31 - 496 // 합이 500을 넘지 않는 것은 31까지의 합이다

 

 

while문은 조건식을 먼저 확인하고 나서 블록을 수행할지 말지 결정하는데 비해, do-while문은 블록을 먼저 수행하고 조건식을 확인한다.

do {
	// 조건식이 참일 때 수행할 내용
	// 이 블록은 최소 1번은 실행된다.
} while (조건식); // 세미콜론을 빼먹지 않도록 주의해야 한다.

do-while문은 보통

1. 사용자의 입력을 받아 무언가를 수행하는 경우

2. 수행을 먼저 하고나서 조건식을 확인해야 하는 경우에 많이 쓰인다.

이 2가지의 경우, while문으로 쓰면 코드 중복이 발생하는 일이 많이 때문에 do-while로 바꿔서 쓴다.

1부터 100까지의 수 중 1개를 입력받아 up&down 게임을 하는 프로그램을 예시로 들어보겠다.

int input  = 0;
int answer = (int)(Math.random() * 100) + 1; // 1~100 사이의 임의의 수를 저장
Scanner scanner = new Scanner(System.in);

do {
// 1) 숫자 입력 받기
	System.out.print("1과 100사이의 정수를 입력하세요.");
	input = scanner.nextInt();
// 2) 입력한 수와 정답 비교
	if(input > answer) { // down일 때
		System.out.println("더 작은 수로 다시 시도해보세요.");	
	} else if(input < answer) { // up일 때
		System.out.println("더 큰 수로 다시 시도해보세요.");			
	}
} while(input!=answer); // up&down이면 다시 블록 수행
// 정답을 맞추면 빠져나옴
System.out.println("정답입니다.");

만약 위 코드를 while문으로 바꿔서 쓰면 어떻게 될까?

int input  = 0;
int answer = (int)(Math.random() * 100) + 1; // 1~100 사이의 임의의 수를 저장
Scanner scanner = new Scanner(System.in);
// 1) 숫자 입력 받기
	System.out.print("1과 100사이의 정수를 입력하세요.");
	input = scanner.nextInt();
while (input!=answer) {
// 2) 입력한 수와 정답 비교
	if(input > answer) { // down일 때
		System.out.println("더 작은 수로 다시 시도해보세요.");	
	} else if(input < answer) { // up일 때
		System.out.println("더 큰 수로 다시 시도해보세요.");			
	}
// 3) 조건식에 들어가기 전 입력을 한 번 더 받아야 한다.
	System.out.print("1과 100사이의 정수를 입력하세요.");
	input = scanner.nextInt();
}
// 정답을 맞추면 빠져나옴
System.out.println("정답입니다.");

while문 안에서도 입력을 받는 코드가 있어야 하기 때문에 1)과 같은 코드가 3)처럼 또 들어갈 수밖에 없다. 그래서 입력을 받거나, 수행 후 조건식을 확인해야 하는 경우에 do-while을 사용하는 것이다.

'Java' 카테고리의 다른 글

배열 (2) 초기화, 출력  (0) 2022.01.19
배열 (1) 선언과 생성, 인덱스  (0) 2022.01.14
제어문 (2) 반복문 - for  (0) 2022.01.07
제어문 (1) 조건문 - switch  (0) 2022.01.05
제어문 (1) 조건문 - if, else if, else  (0) 2022.01.04