while 문도 중괄호 안의 실행 구문을 반복적으로 실행하는 반복 제어문으로 소괄호 안의 조건식이 ture인 동안 반복은 지속된다.
🔅while 문의 구성
초기식; // 필수는 아니지만 대부분 사용
while(조건식) { // 조건식 : while 문 안으로 들어가는 유일한 입구로 생략 불가능
실행 구문; // 조건식이 true인 동안 실행
증감식; // 필수는 아니지만 대부분 사용
}
여기서 초기식과 증감식은 불필요할 때 생략할 수 있지만 for 문과 비교하기 위해 기본 문법 구조에 포함시켜 놓았다. 여기서 주의해야 할 점은 초기식은 while 문 실행 이전에 정의 돼야 하고 증감식은 중괄호 안에 있어야 for문과 동일한 수행을 하게 된다는 것이다. 초기식을 중괄호 안에 넣으면 매 반복마다 초기화돼 원하지 않는 무한 루프에 빠질 수도 있으므로 주의하자.
🔅잘못된 사용 예 ( 무한 루프 생성 )
int a = 0;
while (a < 10) {
a = 0; // 초기식
System.out.println("A"); // 실행 구문(무한 반복 출력)
a++; // 증감식
}
while 문의 실행 순서는 먼저 조건식을 검사하고 조건식이 true일 때 중괄호 안의 실행 구문을 실행한다. 이후 닫힌 중괄호를 만나면 다시 조건식을 검사하며 이와 같은 과정을 조건식이 거짓이 될 때까지 반복한다. 조건식이 거짓이 되면 while 문을 탈출하므로 for문과 마찬가지로 while 문이 종료되는 시점은 닫힌 중괄호가 아닌 조건식이다. 이상의 과정을 정리하면 다음과 같다.
단계 A : 조건식(참) -> 실행 구문
단계 B : 중괄호 닫힘 -> 조건식 (참) -> 실행 구문
...
단계 C : 중괄호 닫힘 -> 조건식 (거짓) -> 종료
일반적으로 while 문은 반복 횟수를 정하지 않고 특정 조건까지 반복하고자 할 때 주로 사용한다. 예를 들어 자연수를 순서대로 더해 합계가 처음으로 100보다 커지는 때의 숫자와 합계를 알고 싶을 때 while 문을 사용할 수 있다.
🔅while 문의 일반적인 사용 예
int num = 0, sum = 0;
while(sum < 100) {
sum += num;
num++;
}
System.out.println((num-1) + "까지의 합 = " + sum); // 14까지의 합 = 105
물론 for문과 같이 반복 횟수가 지정돼 있을 때도 사용할 수 있다. while문도 무한 루프가 아닐 때 초기식, 조건식, 증감식을 모두 포함하고 있어야 한정된 반복 횟수만큼 수행할 수 있으므로 while 문과 for 문은 언제든지 상호 변환할 수 있다. 차이점은 초기식과 증감식이 작성되는 위치 뿐이다.
🔅while문과 for 문의 상호 변환
for ( 초기식 ; 조건식 ; 증감식 ) {
실행 구문;
}
초기식 ;
while(조건식) {
실행 구문;
증감식;
}
🔅while 문과 for 문의 상호 변환 예
for(int a = 0; a < 10; a++) {
System.out.println(a);
int a = 0;
while(a < 10) {
System.out.println(a);
a++;
}
while 문의 조건식에는 true를 넣으면 항상 문이 열려 있는 상황이므로 실행 구문은 무한 반복 된다. 단 while문에서는 for문과 달리 조건식을 생략할 수 없다.
🔅while 문으로 만든 무한 루프
while(true) { // -> 조건식 생략 불가능
실행 구문;
}
for 문에서와 마찬가지로 무한 반복 뒤에 실행 코드를 작성하면 도달할 수 없는 코드 오류가 발생하며 조건식에 false를 입력해도 중괄호 안의 실행 코드에 이와 동일한 오류가 발생한다.
🔅while 문에서 도달할 수 없는 코드를 작성해 오류가 발생하는 예
while(true) {
실행 구문;
}
실행 구문;
while(false) {
실행 구문;
}
// while의 기본 문법 구조
int a = 0;
while(a < 10) {
System.out.print(a + " ");
a++;
}
System.out.println();
//for 문으로 전환
for(int i = 0; i < 10; i++) {
System.out.print(i + " ");
}
System.out.println();
int b = 10;
while(b > 0) {
System.out.print(b + " ");
b--;
}
System.out.println();
//for 문으로 전환
for(int i = 10; i > 0; i--) {
System.out.print( i + " ");
}
//while 문으로 만든 무한 루프
/*
while(true) {
System.out.println("무한 루프");
}
*/
System.out.println();
//무한 루프 탈출
int c = 0;
while(true) {
if(c > 10) {
break;
}
System.out.print(c + " ");
c++;
}
결과