반복문
반복문(iteration statements)
반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문입니다.
프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나입니다.
자바에서 사용되는 대표적인 반복문의 형태는 다음과 같습니다.
1. while 문
2. do / while 문
3. for 문
4. Enhanced for 문
while 문
while 문은 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행합니다.
자바에서 while 문의 문법은 다음과 같습니다.
문법
while (조건식) {
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}
while 문은 우선 조건식이 참(true)인지를 판단하여, 참이면 내부의 명령문을 실행합니다.
내부의 명령문을 전부 실행하고 나면, 다시 조건식으로 돌아와 또 한 번 참인지를 판단하게 됩니다.
이렇게 조건식의 검사를 통해 반복해서 실행되는 반복문을 루프(loop)라고 합니다.
다음 예제는 while 문을 5번 반복해서 실행하는 예제입니다.
예제
int i = 0;
while (i < 5) {
System.out.println("while 문이 " + (i + 1) + "번째 반복 실행중입니다.");
i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.
}
System.out.println("while 문이 종료된 후 변수 i의 값은 " + i + "입니다.");
실행 결과
while 문이 1번째 반복 실행중입니다.
while 문이 2번째 반복 실행중입니다.
while 문이 3번째 반복 실행중입니다.
while 문이 4번째 반복 실행중입니다.
while 문이 5번째 반복 실행중입니다.
while 문이 종료된 후 변수 i의 값은 5입니다.
while 문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않을 때는 프로그램이 영원히 반복되게 됩니다.
이것을 무한 루프(infinite loop)에 빠졌다고 하며, 무한 루프에 빠진 프로그램은 영원히 종료되지 않습니다.
무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황입니다.
따라서 while 문을 작성할 때는 조건식의 결과가 어느 순간 거짓(false)을 갖도록 조건식의 결과를 변경하는 명령문을 반드시 포함시켜야 합니다.
위의 예제에서 조건식의 결과를 변경하는 명령문인 i++를 제거하면, 변수 i의 값은 언제나 1이기 때문에 무한 루프에 빠지게 됩니다.
do / while 문
while 문은 루프에 진입하기 전에 먼저 조건식부터 검사합니다.
하지만 do / while 문은 먼저 루프를 한 번 실행한 후에 조건식을 검사합니다.
즉, do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행합니다.
자바에서 do / while 문의 문법은 다음과 같습니다.
문법
do {
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);
예제
int i = 1, j = 1;
while (i < 1) {
System.out.println("while 문이 " + i + "번째 반복 실행중입니다.");
i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.
}
System.out.println("while 문이 종료된 후 변수 i의 값은 " + i + "입니다.");
do {
System.out.println("do / while 문이 " + i + "번째 반복 실행중입니다.");
j++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.
} while (j < 1);
System.out.println("do / while 문이 종료된 후 변수 j의 값은 " + j + "입니다.");
실행 결과
while 문이 종료된 후 변수 i의 값은 1입니다.
do / while 문이 1번째 반복 실행중입니다.
do / while 문이 종료된 후 변수 j의 값은 2입니다.
위의 예제가 만약 while 문이었다면 단 한 번의 출력도 없었을 것입니다.
하지만 do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행해 줍니다.
for 문
for 문은 while 문과는 달리 자체적으로 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문입니다.
따라서 while 문보다는 좀 더 간결하게 반복문을 표현할 수 있습니다.
자바에서 for 문의 문법은 다음과 같습니다.
문법
for (초기식; 조건식; 증감식) {
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}
이때 for 문을 구성하는 초기식, 조건식, 증감식은 각각 생략할 수 있습니다.
for 문을 사용하면 앞선 예제의 while 문을 더욱 더 간결하게 표현할 수 있습니다.
예제
for (i = 0; i < 5; i++) {
System.out.println("for 문이 " + (i + 1) + "번째 반복 실행중입니다.");
}
System.out.println("for 문이 종료된 후 변수 i의 값은 " + i + "입니다.");
실행 결과
for 문이 1번째 반복 실행중입니다.
for 문이 2번째 반복 실행중입니다.
for 문이 3번째 반복 실행중입니다.
for 문이 4번째 반복 실행중입니다.
for 문이 5번째 반복 실행중입니다.
for 문이 종료된 후 변수 i의 값은 5입니다.
자바에서는 다음 예제처럼 for 문 안에서만 사용하는 변수를 초기식에서 직접 선언할 수 있습니다.
이렇게 for 문에서 직접 선언된 변수는 for 문이 종료되면 같이 소멸합니다.
예제
for (int i = 0; i < 3; i++) {
System.out.println("for 문이 " + (i + 1) + "번째 반복 실행중입니다.");
}
① // System.out.println(i);
for (int i = 0; i < 3; i++) {
System.out.println("for 문이 " + (i + 1) + "번째 반복 실행중입니다.");
}
실행 결과
for 문이 1번째 반복 실행중입니다.
for 문이 2번째 반복 실행중입니다.
for 문이 3번째 반복 실행중입니다.
for 문이 1번째 반복 실행중입니다.
for 문이 2번째 반복 실행중입니다.
for 문이 3번째 반복 실행중입니다.
위의 예제에서 반복문을 종료시키기 위한 변수로 i라는 이름의 int형 변수를 한 프로그램에서 두 번이나 선언하고 있습니다.
하지만 이렇게 두 번이나 선언해도 컴파일 오류가 발생하지 않는 이유는 for 문이 종료되면 for 문의 초기식에서 사용된 변수는 자동으로 소멸하기 때문입니다.
따라서 ①번 라인에서 변수 i를 참조하려고 하면 선언되지 않은 변수를 참조하려는 것이므로, 오류가 발생합니다.
변수의 유효 범위에 대한 더 자세한 사항은 자바 필드의 구분 수업에서 확인할 수 있습니다.
Enhanced for 문
JDK 1.5부터 Enhanced for 문이라는 반복문이 추가되었습니다.
이 반복문은 컬렉션 프레임워크와 배열에서 유용하게 자주 사용됩니다.
Enhanced for 문에 대한 더 자세한 사항은 자바 배열의 활용 수업에서 확인할 수 있습니다.