이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.
공부 › Java › 기본 문법
조건문과 반복문
반복문은 몇 번 돌고, 어디에서 멈추나
반복문은 "조건 검사 → 본문 → 값 바꾸기"를 조건이 false가 될 때까지 되풀이합니다. 조건에 <를 쓰느냐 <=를 쓰느냐에 따라 도는 횟수가 한 번 달라지고, break와 continue는 그 흐름을 중간에 끊거나 건너뜁니다. switch는 if처럼 값에 따라 실행할 곳을 고르는 조건문입니다. 값이 일치하는 case로 건너뛰는데, break가 없으면 아래 case까지 이어서 실행됩니다.
실행으로 대조 · JDK 21에서 스물네 가지 조합을 실행해 대조 (끝나지 않는 두 조합은 2초 동안 관찰)
이 실습에 나오는 개념
- for문과 while문
- 조건이 true인 동안 같은 코드를 되풀이해 실행하는 반복문이다. while (조건) { 본문 }은 조건을 검사해 true이면 본문을 실행하고 다시 조건으로 돌아가며, 조건이 false가 되면 끝난다. for (초기화; 조건; 증감) { 본문 }은 같은 일을 하되, 반복에 쓰는 변수를 만들고 바꾸는 코드를 한 줄에 모아 적는다. for문의 실행 순서는 초기화(한 번), 조건, 본문, 증감, 다시 조건이다. 0부터 시작해 i < n으로 쓰면 n번, i <= n으로 쓰면 n + 1번 돌기 때문에, 조건의 부등호 하나로 횟수가 한 번 달라진다.
- break와 continue
- 반복문의 흐름을 중간에 바꾸는 문장이다. break는 자기를 감싼 가장 가까운 반복문이나 switch를 그 자리에서 끝낸다. continue는 반복문을 끝내지 않고 이번 회차의 남은 코드만 건너뛴 뒤 다음 회차로 넘어간다. for문에서 continue를 하면 증감 부분이 실행된 다음 조건 검사로 가지만, while문에서는 곧바로 조건 검사로 간다. 그래서 while문에서 값을 바꾸는 코드가 continue보다 아래에 있으면 끝나지 않는 반복이 될 수 있다.
- switch문과 fall-through
- switch는 하나의 값을 여러 case와 비교해, 일치하는 case의 자리로 건너뛰어 실행하는 문장이다. 일치하는 case가 없으면 default로 간다. case 1: 처럼 콜론을 쓰는 형태에서는 break를 만나기 전까지 아래 case의 코드까지 이어서 실행되는데, 이것을 fall-through(흘러내림)라고 한다. break를 빠뜨려도 컴파일 오류가 나지 않아 실수하기 쉽다. Java 14부터 쓸 수 있는 case 1 -> 형태(화살표)는 일치한 case의 코드만 실행하므로 break가 필요 없다.
이렇게 바꿔 보세요
- 처음 설정으로 — i <= 3으로 쓴 for문. 세 번이 아니라 네 번 돕니다.
- <로 바꾸면 — i < 3은 0, 1, 2에서 세 번 돕니다.
- break를 만나면 — i가 1일 때 반복문 전체가 끝납니다.
- continue를 만나면 — i가 1인 회차만 건너뛰고 계속 돕니다.
- while문에서 continue — 같은 코드인데 끝나지 않습니다.
- switch에서 break를 빼면 — case 2에서 시작해 아래 case까지 모두 실행됩니다.
- 화살표 switch — break를 적지 않아도 일치한 case만 실행됩니다.
처음 설정으로 실행하면
- int i = 0: for문 괄호 안의 첫 부분(초기화)입니다. 맨 처음에 한 번만 실행되고, i는 0이 됩니다.
- i <= 3 검사: i는 0이고, 0 <= 3은 true입니다. 본문으로 들어갑니다.
- System.out.println(i): i의 값을 출력합니다. 출력은 0입니다.
- i++: 본문이 끝나면 for문 괄호 안의 셋째 부분(증감)이 실행됩니다. i의 값은 이제 1입니다. 다시 조건 검사로 돌아갑니다.
- i <= 3 검사: i는 1이고, 1 <= 3은 true입니다. 본문으로 들어갑니다.
- System.out.println(i): i의 값을 출력합니다. 출력은 1입니다.
- i++: 본문이 끝나면 for문 괄호 안의 셋째 부분(증감)이 실행됩니다. i의 값은 이제 2입니다. 다시 조건 검사로 돌아갑니다.
- i <= 3 검사: i는 2이고, 2 <= 3은 true입니다. 본문으로 들어갑니다.
- System.out.println(i): i의 값을 출력합니다. 출력은 2입니다.
- i++: 본문이 끝나면 for문 괄호 안의 셋째 부분(증감)이 실행됩니다. i의 값은 이제 3입니다. 다시 조건 검사로 돌아갑니다.
- i <= 3 검사: i는 3이고, 3 <= 3은 true입니다. <=는 같을 때도 true이므로 한 번 더 본문으로 들어갑니다.
- System.out.println(i): i의 값을 출력합니다. 출력은 3입니다.
- i++: 본문이 끝나면 for문 괄호 안의 셋째 부분(증감)이 실행됩니다. i의 값은 이제 4입니다. 다시 조건 검사로 돌아갑니다.
- i <= 3 검사: i는 4이고, 4 <= 3은 false입니다. 본문에 들어가지 않고 반복문을 끝냅니다.
- System.out.println("끝"): 반복문 다음 줄이 실행됩니다. 본문에는 모두 4번 들어갔습니다.
실행 결과
- i <= 3은 i가 3일 때도 true라서 i < 3보다 한 번 더 돕니다. 0부터 시작할 때 i < n은 n번, i <= n은 n + 1번입니다. 한 번 차이로 생기는 이런 실수는 아주 흔합니다. 원소가 n개인 배열을 돌 때는 i < n을 씁니다.
- for문은 초기화, 조건, 증감을 한 줄에 모아 적는 반복문입니다. 실행 순서는 초기화(한 번) → 조건 → 본문 → 증감 → 조건 → ... 입니다.
코드
for (int i = 0; i <= 3; i++) { // 초기화; 조건; 증감
System.out.println(i);
}
System.out.println("끝");
이 모형의 전제
스물네 가지 조합(반복문 12, switch 12)의 출력과 횟수를 이 PC의 JDK 21에서 같은 구조의 코드를 실행한 결과와 대조했습니다. 본문에 들어간 횟수는 대조용 프로그램의 본문 첫 줄에 세는 코드를 넣어 얻었습니다. while문에서 continue를 쓴 두 조합은 실제 프로그램이 2초가 지나도 끝나지 않고 본문만 계속 되풀이하는 것을 확인했습니다. "영원히 끝나지 않는다"는 것 자체는 실행으로 증명할 수 없고, i가 바뀌지 않는다는 코드의 구조에서 나오는 결론입니다. 모형은 같은 i 값으로 조건 검사에 다시 돌아오면 무한 반복으로 판단하고 멈춥니다. default가 없는 switch에 일치하는 case가 없는 값을 넣으면 아무것도 실행하지 않는다는 것도 실행해 확인했습니다. 화살표 switch는 Java 14부터 정식 문법입니다. do-while문, 향상된 for문(for-each), 값을 돌려주는 switch 식, 이름표를 붙인 break는 다루지 않았습니다.
앞 실습: 연산자와 형변환 · 다음 실습: 배열