for 문은 실행 구문을 반복적으로 수행하는 반복 제어문으로 일반적으로 반복 횟수가 정해질 때 주로 사용한다. 즉, for 문의 구문을 보면 몇 번 반복하는지 유추할 수 있어야 한다. for 문의 기본 문법 구조는 다음과 같다.
💨for 문의 구성
for(초기식; 조건식; 증감식) {
실행 구문; // 조건식이 true인 동안 실행
}
for 다음의 소괄호()안에는 3개의 항목이 있고, 각각은 세미콜론(;)으로 구분돼 있다. 나중에 다시 다루겠지만, 컴파일러는 문법적으로 for문의 소괄호 안에 세미콜론이 2개 있는지 여부만 점검한다.
+) 초기식에 포함된 변수의 선언 위치
초기식에 포함된 변수는 for문의 내외부에서 선언할 수 있다. 먼저 외부에서 변수를 선언하고 초기식에서 초기화만 햇을 때, for문이 종료된 이후에도 변수는 사라지지 않는다.
int i;
for(i = 0; i < 3; i++) {
System.out.println("실행");
}
System.out.println(i); //3
반면 for문의 초기식 안에서 선언했을 때는 for 문의 내부에서만 사용할 수 있으며 대부분 for 문의 반복 횟수를 지정하기 위한 용도로만 변수를 사용하므로 초기식 내부에서 변수를 선언하는 이 방식이 주로 사용된다.
for(int i = 0; i < 3; i++) {
System.out.println("실행");
}
System.out.println(i); // 오류
또한 초기식과 증감식은 쉼표(,)로 구분해 여러 개를 동시에 표기할 수 있다.
for(int i = 0, j = 0; (i+j) < 10; i++, j++)
//...
}
증감식 실행 이후 다시 조건식을 검사하며 이후에는 앞의 과정이 반복된다. for 문의 실행 순서를 정리하면 다음과 같다.
단계 A : 초기식 -> 조건식(참) -> 실행 구문
단계 B : 중괄호 닫힘 -> 증감식 -> 조건식(참) -> 실행 구문
...
단계 C : 중괄호 닫힘 -> 증감식 -> 조건식(거짓) -> 종료
앞에서 언급한 것처럼 컴파일러는 for 문의 소괄호 안에 2개의 세미콜론이 있는지만 문법적으로 점검한다. 즉 초기식 조건식 증감식을 생략하더라도 세미콜론만 있으면 문법 오류는 발생하지 않는다. 그 결과, 몇 가지 특수한 for 문 형태가 가능하다. 먼저 for의 실행 구문으로 진입하는 유일한 입구인 조건식을 생략하면 컴파일러는 조건식에 true를 자동으로 삽입한다. 즉 for 문으로 들어가는 무늘 항상 열어 놓은 셈이다. 따라서 for 문에서 조건식을 생략하면 구문을 끊임 없이 반복한다.
for 문에서 조건식이 생략됐을 때(무한 루프)
for (초기식; ; 증감식){
실행 구문;
}
대부분 무한 루프 안에는 break 키워드를 삽입해 특정 조건을 만족했을 때 무한 루프를 탈출하도록 프로그래밍 한다.
break를 이용한 무한 루프 탈출
for(int i = 0; i++){
if(i > 10) {
break;
}
System.out.print(i + " "); // 0 1 2 3 4 5 6 7 8 9 10
}
무한 반복을 하는 코드 다음에 어떤 실행 코드를 작성하면 문법 오류가 발새한다. 무한 루프에 가로막혀 결코 도달할 수 없는 코드를 작성했기 때문이다. 또, 조건식에 명시적으로 false를 넣으면 문이 항상 닫힌 상태이므로 for 문 안의 내용을 절대 실행할 수 없으므로 오류가 발생한다. 지극히 직관적이고 당연한 결과다.
for 문에서 도달할 수 없는 코드를 작성해 오류가 발생하는 예
for( ; ; ) {
실행 구문;
}
실행 구문; // - 오류 발생
for( ; false ; ) {
실행 구문; // - 오류 발생
}
// for 문 기본 문법 구조
int a; // for 문의 반복 횟수를 지정하는 변수를 외부에서 선언
for(a = 0; a < 3; a++);{
System.out.print(a + "");
}
System.out.println();
for(int i = 0; i < 3; i++) { // for 문의 반복 횟수를 지정하는 변수를 초기식에서 선언
System.out.print(i + "");
}
System.out.println();
for(int i = 0; i < 100; i++) {
System.out.print(i + "");
}
System.out.println();
for(int i = 10; i > 0 ; i--) {
System.out.print(i + "");
}
System.out.println();
for(int i = 0; i < 10 ; i += 2) {
System.out.print(i + "");
}
System.out.println();
for(int i = 0, j = 0; i < 10; i++, j++) {
System.out.println(i + j + "");
}
System.out.println();
//for 문의 특수한 형태 (무한 루프)
/* for(int i = 0; ; i++) {
System.out.print(i + "");
}
for(;;) {
System.out.print("무한 루프");
}
*/
System.out.println();
//무한 루프 탈출
for(int i = 0; ; i++) {
if(i>10) {
break;
}
System.out.print(i + "");
}
System.out.println("무한 루프 탈출");
결과