고전적인 3부 구성 for 루프
for 루프는 블록을 제어된 횟수만큼 반복합니다. 자바의 형태는 괄호 안에 세미콜론으로 구분된 세 가지를 담습니다:
세 부분은 고정된 리듬으로 실행됩니다:
- 초기화 (
int i = 0) - 그 무엇보다도 먼저, 한 번 실행됩니다. - 조건 (
i < 5) - 각 회차 전에 검사되며, 거짓이 되면 루프가 멈춥니다. - 갱신 (
i++) - 각 회차 후에, 조건이 다시 검사되기 전에 실행됩니다.
따라서 이것은 i = 0부터 i = 4까지 출력합니다. 카운터 i의 범위는 루프 안으로 한정되며, 닫는 중괄호 뒤에는 존재하지 않습니다.
증가, 감소, 그리고 단계별 세기
세 부분은 카운터에 대한 완전한 제어를 제공합니다:
i--는 감소시키고, i += 5는 5씩 건너뜁니다. 조건이 방향에 맞춘 멈춤을 결정합니다: 거꾸로 셀 때는 >를, 올라가며 셀 때는 < 또는 <=를 사용하세요.
배열 순회하기
카운터 루프는 .length를 경계로, i를 인덱스로 사용하여 배열과 자연스럽게 어울립니다:
colors.length는 괄호가 없는 필드라는 점에 유의하세요. 배열은 그 점에서 특별합니다. 반면 List는 list.size()를 사용합니다. 조건 i < colors.length는 올바릅니다: 인덱스는 0부터 length - 1까지 가므로, <를 사용하면(<=가 아니라) 범위 초과 오류를 피할 수 있습니다.
향상된 for-each 루프
각 요소만 필요하고 인덱스는 전혀 필요 없을 때, 향상된 for는 더 깔끔하고 틀리기 어렵습니다. 하나 차이(off-by-one) 실수를 낼 카운터가 없습니다:
for (String color : colors)는 "colors 안의 각 color에 대하여"라고 읽습니다. 배열과 반복 가능한 모든 것에서 동작합니다. 절충점: 인덱스가 없고, 순회하는 동안 컬렉션에 추가하거나 제거할 수 없습니다(그러면 ConcurrentModificationException이 발생합니다). 둘 중 하나가 필요할 때는 카운터 루프를 사용하세요.
중첩 루프
루프 안의 루프 - 격자, 표, 짝짓기에 유용합니다. 안쪽 루프는 바깥쪽 루프의 각 회차마다 완전히 실행됩니다:
이것은 3x3 곱셈 격자를 출력합니다. 중첩이 깊어지면 카운터에 i, j 대신 의미 있는 이름(row, col)을 붙이세요. 어느 것이 어느 것인지 헷갈리는 일을 막아줍니다.
break와 continue
break는 루프에서 즉시 빠져나갑니다. continue는 현재 회차의 나머지를 건너뛰고 갱신 단계로 점프합니다:
이것은 1 3 5 7을 출력합니다. continue는 짝수를 건너뛰고, break는 i가 7을 넘으려는 순간 루프를 끝냅니다. 중첩 루프에서는 레이블이 붙은 break를 사용하지 않는 한 둘 다 가장 안쪽 루프에만 영향을 줍니다.
무한 루프 주의
조건이 결코 거짓이 되지 않으면 루프는 영원히 실행됩니다. 흔한 원인은 갱신을 잊거나 카운터를 잘못된 방향으로 움직이는 것입니다:
for (int i = 0; i < 5; i--) { // i는 줄어들기만 함 -> 결코 5에 도달하지 못함
System.out.println(i);
}
의도적인 무한 루프는 세 부분을 모두 생략하고 -for (;;) { ... }- 멈추기 위해 내부의 break에 의존합니다. 이는 아껴 쓰세요. while (true)가 대개 더 읽기 쉽습니다.
다음: while 루프
for 루프는 카운터를 미리 알 때 빛을 발합니다. 어떤 조건이 바뀔 때까지 반복하고 싶은데 - 깔끔한 카운터가 없을 때 - while 루프가 더 잘 맞습니다. 그것이 다음 페이지입니다.
자주 묻는 질문
자바에서 for 루프의 구문은 무엇인가요?
자바 for 루프는 괄호 안에 세미콜론으로 구분된 세 부분을 가집니다: for (초기화; 조건; 갱신) { ... }. 예를 들어 for (int i = 0; i < 5; i++) { ... }는 i를 0에서 시작해, i < 5인 동안 본문을 실행하고, 각 회차 뒤에 i에 1을 더합니다. 세 부분 모두 생략할 수 있습니다.
자바에서 for 루프와 for-each 루프의 차이는 무엇인가요?
고전적인 for 루프는 명시적인 카운터를 사용하므로 인덱스와 방향을 직접 제어합니다. 인덱스가 필요하거나 요소를 건너뛰고 싶을 때 가장 좋습니다. 향상된 for-each 루프 for (타입 요소 : 컬렉션)은 인덱스 없이 모든 요소를 순서대로 훑습니다. 각 요소만 필요하고 위치는 전혀 필요 없을 때 더 깔끔합니다. for-each는 순회 중에 컬렉션의 구조를 변경할 수 없습니다.
자바에서 배열을 어떻게 순회하나요?
카운터 루프로 인덱싱하거나 -for (int i = 0; i < arr.length; i++) { arr[i] 사용; }- 인덱스가 필요 없으면 for-each를 사용하세요: for (int x : arr) { x 사용; }. 배열은 크기를 .length 필드(괄호 없음)로 노출하고, 리스트는 .size()를 사용합니다.